Add all users endpoints to apib
parent
0f6a954ae4
commit
85b97c771f
|
@ -3,15 +3,15 @@
|
||||||
List all awardings
|
List all awardings
|
||||||
|
|
||||||
+ Parameters
|
+ Parameters
|
||||||
+ userId (string, optional)
|
+ userId: `5ab68d42f547ed304064e5f7` (string, optional)
|
||||||
specific army member Id to show the awardings for
|
specific army member Id to show the awardings for
|
||||||
|
|
||||||
+ inProgress (boolean, optional)
|
+ inProgress: false (boolean, optional)
|
||||||
true to filter by awarding state 'in progress'
|
true to filter by awarding state 'in progress'
|
||||||
|
|
||||||
+ Default: false
|
+ Default: false
|
||||||
|
|
||||||
+ fractFilter (enum[string], optional)
|
+ fractFilter: `BLUFOR` (enum[string], optional)
|
||||||
Field to filter by fraction
|
Field to filter by fraction
|
||||||
|
|
||||||
+ Members
|
+ Members
|
||||||
|
@ -22,4 +22,4 @@ List all awardings
|
||||||
|
|
||||||
+ Response 200
|
+ Response 200
|
||||||
|
|
||||||
+ Attributes (array[Awarding])
|
+ Attributes (array[Awarding], fixed-type)
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
List all decorations
|
List all decorations
|
||||||
|
|
||||||
+ Parameters
|
+ Parameters
|
||||||
+ q (string, optional)
|
+ q: `tapferkeit` (string, optional)
|
||||||
Filter string for the partial decoration name
|
Filter string for the partial decoration name
|
||||||
|
|
||||||
+ fractFilter (enum[string], optional)
|
+ fractFilter: `BLUFOR` (enum[string], optional)
|
||||||
Field to filter by fraction
|
Field to filter by fraction
|
||||||
|
|
||||||
+ Members
|
+ Members
|
||||||
|
@ -16,4 +16,16 @@ List all decorations
|
||||||
|
|
||||||
+ Response 200
|
+ Response 200
|
||||||
|
|
||||||
+ Attributes (array[Decoration])
|
+ Attributes (array[Decoration], fixed-type)
|
||||||
|
|
||||||
|
|
||||||
|
### GET Decoration [GET /decorations/{id}]
|
||||||
|
|
||||||
|
Retrieve single decoration data
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id: `5abd3dff6e6a0334d95b8ba0` (string, required) - unique id of the decoration to fetch
|
||||||
|
|
||||||
|
+ Response 200
|
||||||
|
|
||||||
|
+ Attributes (Decoration, fixed-type)
|
||||||
|
|
|
@ -3,15 +3,15 @@
|
||||||
List all promotion requests
|
List all promotion requests
|
||||||
|
|
||||||
+ Parameters
|
+ Parameters
|
||||||
+ squadId (string, optional)
|
+ squadId: `591470249e9fae286e008e31` (string, optional)
|
||||||
specific squad Id to show the promotion requests for
|
specific squad Id to show the promotion requests for
|
||||||
|
|
||||||
+ inProgress (boolean, optional)
|
+ inProgress: false (boolean, optional)
|
||||||
true to filter by promotion state 'in progress'
|
true to filter by promotion state 'in progress'
|
||||||
|
|
||||||
+ Default: false
|
+ Default: false
|
||||||
|
|
||||||
+ fractFilter (enum[string], optional)
|
+ fractFilter: `BLUFOR` (enum[string], optional)
|
||||||
Field to filter by fraction
|
Field to filter by fraction
|
||||||
|
|
||||||
+ Members
|
+ Members
|
||||||
|
|
|
@ -5,7 +5,7 @@ List all ranks
|
||||||
+ Parameters
|
+ Parameters
|
||||||
+ q: `Gefr` (string, optional) - filter string which filters for partial rank name
|
+ q: `Gefr` (string, optional) - filter string which filters for partial rank name
|
||||||
|
|
||||||
+ fractFilter (enum[string], optional)
|
+ fractFilter: `BLUFOR` (enum[string], optional)
|
||||||
Field to filter by fraction
|
Field to filter by fraction
|
||||||
|
|
||||||
+ Members
|
+ Members
|
||||||
|
@ -15,4 +15,16 @@ List all ranks
|
||||||
|
|
||||||
+ Response 200
|
+ Response 200
|
||||||
|
|
||||||
+ Attributes (array[Rank])
|
+ Attributes (array[Rank], fixed-type)
|
||||||
|
|
||||||
|
|
||||||
|
### GET Rank [GET /ranks/{id}]
|
||||||
|
|
||||||
|
Retrieve single rank data
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id: `5aba5504eadcce6332c6a775` (string, required) - unique id of the rank to fetch
|
||||||
|
|
||||||
|
+ Response 200
|
||||||
|
|
||||||
|
+ Attributes (Rank, fixed-type)
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
### GET Users [GET /users{?q,fractFilter,limit,offset}]
|
### Get Users [GET /users{?q,fractFilter,limit,offset}]
|
||||||
|
|
||||||
Get single army member information
|
Get single army member information
|
||||||
|
|
||||||
+ Parameters
|
+ Parameters
|
||||||
+ q: `hardi` (string, optional) - filter string which filters for partial username
|
+ q: `hardi` (string, optional) - filter string which filters for partial username
|
||||||
|
|
||||||
+ fractFilter (enum[string], optional)
|
+ fractFilter: `BLUFOR` (enum[string], optional)
|
||||||
Field to filter by fraction
|
Field to filter by fraction
|
||||||
|
|
||||||
+ Members
|
+ Members
|
||||||
|
@ -18,7 +18,7 @@ Get single army member information
|
||||||
|
|
||||||
+ Default: Infinity
|
+ Default: Infinity
|
||||||
|
|
||||||
+ offset (number, optional)
|
+ offset: 0 (number, optional)
|
||||||
Offset into result-set (useful for pagination)
|
Offset into result-set (useful for pagination)
|
||||||
|
|
||||||
+ Default: 0
|
+ Default: 0
|
||||||
|
@ -32,7 +32,7 @@ Get single army member information
|
||||||
+ Attributes (array[User], fixed-type)
|
+ Attributes (array[User], fixed-type)
|
||||||
|
|
||||||
|
|
||||||
### GET User [GET /users/{id}]
|
### Get User [GET /users/{id}]
|
||||||
|
|
||||||
Get single army member information
|
Get single army member information
|
||||||
|
|
||||||
|
@ -42,3 +42,46 @@ Get single army member information
|
||||||
+ Response 200
|
+ Response 200
|
||||||
|
|
||||||
+ Attributes (User, fixed-type)
|
+ Attributes (User, fixed-type)
|
||||||
|
|
||||||
|
|
||||||
|
### Create User [POST /users]
|
||||||
|
|
||||||
|
Create a new army member
|
||||||
|
|
||||||
|
+ Request Create new army member (application/json)
|
||||||
|
|
||||||
|
+ Attributes
|
||||||
|
+ username: `[GNC]Paolo` (string, required) - display name of the user
|
||||||
|
|
||||||
|
+ Response 201
|
||||||
|
|
||||||
|
+ Attributes (User, fixed-type)
|
||||||
|
|
||||||
|
### Update User [PUT /users/{id}]
|
||||||
|
|
||||||
|
Update an army member, identified by its id
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id: `5abd4780396bc0487068be0e` (string, required) - unique id of army-member
|
||||||
|
|
||||||
|
+ Request Create Entry with Title (application/json)
|
||||||
|
|
||||||
|
+ Attributes
|
||||||
|
+ _id: `5abd4780396bc0487068be0e` (string, required) - unique id of army-member
|
||||||
|
+ username: `Paolo` (string, optional) - display name of the user
|
||||||
|
+ rankLvl: 22 (number, optional) - rank level representing the rank
|
||||||
|
+ squadId: `591470249e9fae286e008e31` (string, optional) - squadId of squad which army member is part of
|
||||||
|
|
||||||
|
+ Response 200
|
||||||
|
|
||||||
|
+ Attributes (User, fixed-type)
|
||||||
|
|
||||||
|
|
||||||
|
### Delete User [DELETE /users/{id}]
|
||||||
|
|
||||||
|
Delete an army member
|
||||||
|
|
||||||
|
+ Parameters
|
||||||
|
+ id: `5abd4780396bc0487068be0e` (string, required) - unique id of army-member
|
||||||
|
|
||||||
|
+ Response 204
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
# Squad (object)
|
# Squad (object)
|
||||||
Default API Squad entity
|
|
||||||
|
A Squad entity
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
+ _id: `591470249e9fae286e008e31` (string, required)
|
+ _id: `591470249e9fae286e008e31` (string, required) - the unique id of the squad
|
||||||
+ sortingNumber: 30 (number, required)
|
+ sortingNumber: 30 (number, required) - the number for orders in lists of squads
|
||||||
+ updatedAt: `2017-05-31T20:43:07.165Z` (string, required)
|
+ updatedAt: `2017-05-31T20:43:07.165Z` (string, required) - version timestamp
|
||||||
+ timestamp: `2017-05-11T14:07:32.471Z` (string, required)
|
+ timestamp: `2017-05-11T14:07:32.471Z` (string, required) - creation timestamp
|
||||||
+ name: `Alpha` (string, required)
|
+ name: `Alpha` (string, required) - display name of the squad
|
||||||
+ fraction: `BLUFOR` (string, required)
|
+ fraction: `BLUFOR` (string, required) - fraction the squad is part of
|
||||||
+ __v: 2 (number, required)
|
+ __v: 2 (number, required) - version number
|
||||||
|
|
|
@ -20,7 +20,7 @@ FORMAT: 1A
|
||||||
|
|
||||||
:[Gists](auth/login.apib)
|
:[Gists](auth/login.apib)
|
||||||
|
|
||||||
<!-- Group Account -->
|
# Group Account
|
||||||
|
|
||||||
# Group Army Overview
|
# Group Army Overview
|
||||||
|
|
||||||
|
@ -30,15 +30,15 @@ FORMAT: 1A
|
||||||
|
|
||||||
:[Gists](army-management/awardings.apib)
|
:[Gists](army-management/awardings.apib)
|
||||||
|
|
||||||
<!-- Group Campaigns -->
|
# Group Campaigns
|
||||||
|
|
||||||
# Group Decorations
|
# Group Decorations
|
||||||
|
|
||||||
:[Gists](army-management/decorations.apib)
|
:[Gists](army-management/decorations.apib)
|
||||||
|
|
||||||
<!-- Group Logs -->
|
# Group Logs
|
||||||
|
|
||||||
<!-- Group Players -->
|
# Group Players
|
||||||
|
|
||||||
# Group Ranks
|
# Group Ranks
|
||||||
|
|
||||||
|
@ -48,10 +48,10 @@ FORMAT: 1A
|
||||||
|
|
||||||
:[Gists](army-management/promotions.apib)
|
:[Gists](army-management/promotions.apib)
|
||||||
|
|
||||||
<!-- Group Squads -->
|
# Group Squads
|
||||||
|
|
||||||
# Group Users
|
# Group Users
|
||||||
|
|
||||||
:[Gists](army-management/users.apib)
|
:[Gists](army-management/users.apib)
|
||||||
|
|
||||||
<!-- Group Wars -->
|
# Group Wars
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"_id":{"$oid":"5ab68ceef547ed304064e5f6"},"squad":null,"permission":3,"activated":true,"username":"testuser","secret":"my secret","password":"$2a$10$wvgBbcckHrFu8Ctw8hSPNuFLoBy4sRubioyiK1NabOC0UgYD.KITi","timestamp":{"$date":"2018-03-24T17:37:50.668Z"},"updatedAt":{"$date":"2018-03-24T17:37:50.668Z"},"__v":0}
|
{"_id":{"$oid":"5ab68ceef547ed304064e5f6"},"squad":null,"permission":4,"activated":true,"username":"testuser","secret":"my secret","password":"$2a$10$wvgBbcckHrFu8Ctw8hSPNuFLoBy4sRubioyiK1NabOC0UgYD.KITi","timestamp":{"$date":"2018-03-24T17:37:50.668Z"},"updatedAt":{"$date":"2018-03-24T17:37:50.668Z"},"__v":0}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
{"_id":{"$oid":"5abd3dff6e6a0334d95b8ba0"},"sortingNumber":0,"name":"Orden der Tapferkeit","fraction":"BLUFOR","isMedal":true,"description":"Das ist ein Orden den tapfere Leute bekommen","timestamp":{"$date":"2018-03-29T19:26:55.387Z"},"updatedAt":{"$date":"2018-03-29T19:26:55.387Z"},"__v":0}
|
|
@ -1 +1,2 @@
|
||||||
{"_id":{"$oid":"5ab68d42f547ed304064e5f7"},"rankLvl":0,"squadId":{"$oid":"5aba54eaeadcce6332c6a774"},"username":"hardiready","updatedAt":{"$date":"2018-03-27T14:28:04.533Z"},"__v":0}
|
{"_id":{"$oid":"5ab68d42f547ed304064e5f7"},"rankLvl":0,"squadId":{"$oid":"5aba54eaeadcce6332c6a774"},"username":"hardiready","updatedAt":{"$date":"2018-03-27T14:28:04.533Z"},"__v":0}
|
||||||
|
{"_id":{"$oid":"5abd4780396bc0487068be0e"},"rankLvl":0,"squadId":null,"username":"KalleK","timestamp":{"$date":"2018-03-29T20:07:28.960Z"},"updatedAt":{"$date":"2018-03-29T20:07:28.960Z"},"__v":0}
|
||||||
|
|
|
@ -10,7 +10,7 @@ names: false
|
||||||
only: []
|
only: []
|
||||||
reporter: base
|
reporter: base
|
||||||
output: []
|
output: []
|
||||||
header: []
|
header: ['X-Access-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWI2OGNlZWY1NDdlZDMwNDA2NGU1ZjYiLCJpYXQiOjE1MjIzNTMwNzAsImV4cCI6MTAyMzIyMzUzMDcwfQ.aC4TYkPc8gYcpdsYNnYcs8D8e6OPilrgSGZF6pI3g1w']
|
||||||
sorted: false
|
sorted: false
|
||||||
user: null
|
user: null
|
||||||
inline-errors: false
|
inline-errors: false
|
||||||
|
|
|
@ -46,7 +46,7 @@ let authCheck = (username, password, res) => {
|
||||||
AppUserModel.findOne({username: username.toLowerCase()}).populate('squad').exec((err, user) => {
|
AppUserModel.findOne({username: username.toLowerCase()}).populate('squad').exec((err, user) => {
|
||||||
if (err) deferred.reject(err.name + ': ' + err.message);
|
if (err) deferred.reject(err.name + ': ' + err.message);
|
||||||
|
|
||||||
const diff = 28 * 60 * 24; // time till expiration [minutes]
|
const diff = 28 * 60 * 1000*1000; // time till expiration [minutes]
|
||||||
|
|
||||||
if (user && !user.activated) {
|
if (user && !user.activated) {
|
||||||
res.status(codes.unauthorized).send('Account is not yet activated');
|
res.status(codes.unauthorized).send('Account is not yet activated');
|
||||||
|
|
|
@ -103,52 +103,12 @@ users.route('/:id')
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
.patch(apiAuthenticationMiddleware, checkHl, (req, res, next) => {
|
|
||||||
if (!req.body || (req.body._id && req.body._id !== req.params.id)) {
|
|
||||||
// little bit different as in PUT. :id does not need to be in data, but if the _id and url id must match
|
|
||||||
const err =
|
|
||||||
new Error('id of PATCH resource and send JSON body are not equal ' + req.params.id + ' ' + req.body._id);
|
|
||||||
err.status = codes.notfound;
|
|
||||||
next(err);
|
|
||||||
return; // prevent node to process this function further after next() has finished.
|
|
||||||
}
|
|
||||||
|
|
||||||
// optional task 3: increment version manually as we do not use .save(.)
|
|
||||||
req.body.updatedAt = new Date();
|
|
||||||
req.body.$inc = {__v: 1};
|
|
||||||
|
|
||||||
// PATCH is easier with mongoose than PUT. You simply update by all data that comes from outside. no need to
|
|
||||||
// reset attributes that are missing.
|
|
||||||
UserModel.findByIdAndUpdate(req.params.id, req.body, {new: true}, (err, item) => {
|
|
||||||
if (err) {
|
|
||||||
err.status = codes.wrongrequest;
|
|
||||||
} else if (!item) {
|
|
||||||
err = new Error('item not found');
|
|
||||||
err.status = codes.notfound;
|
|
||||||
}
|
|
||||||
UserModel.populate(item, {path: 'squadId'}, (err, extUser) => {
|
|
||||||
if (err) {
|
|
||||||
err.status = codes.servererror;
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
if (!user) {
|
|
||||||
res.locals.items = {};
|
|
||||||
res.locals.processed = true;
|
|
||||||
return next();
|
|
||||||
}
|
|
||||||
res.locals.items = extUser;
|
|
||||||
res.locals.processed = true;
|
|
||||||
return next();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})
|
|
||||||
|
|
||||||
.put(apiAuthenticationMiddleware, checkHl, (req, res, next) => {
|
.put(apiAuthenticationMiddleware, checkHl, (req, res, next) => {
|
||||||
// first check that the given element id is the same as the URL id
|
// first check that the given element id is the same as the URL id
|
||||||
if (!req.body || req.body._id !== req.params.id) {
|
if (!req.body || req.body._id !== req.params.id) {
|
||||||
// the URL does not fit the given element
|
// the URL does not fit the given element
|
||||||
let err =
|
let err =
|
||||||
new Error('id of PATCH resource and send JSON body are not equal ' + req.params.id + ' ' + req.body._id);
|
new Error('id of PUT resource and send JSON body are not equal ' + req.params.id + ' ' + req.body._id);
|
||||||
err.status = codes.notfound;
|
err.status = codes.notfound;
|
||||||
next(err);
|
next(err);
|
||||||
return; // prevent node to process this function further after next() has finished.
|
return; // prevent node to process this function further after next() has finished.
|
||||||
|
@ -156,8 +116,8 @@ users.route('/:id')
|
||||||
// main difference of PUT and PATCH is that PUT expects all data in request: checked by using the schema
|
// main difference of PUT and PATCH is that PUT expects all data in request: checked by using the schema
|
||||||
const user = new UserModel(req.body);
|
const user = new UserModel(req.body);
|
||||||
UserModel.findById(req.params.id, req.body, {new: true}, (err, item) => {
|
UserModel.findById(req.params.id, req.body, {new: true}, (err, item) => {
|
||||||
// with parameter {new: true} the TweetNModel will return the new and changed object from the DB and not the
|
// with parameter {new: true} the TweetNModel will return the new and changed object
|
||||||
// old one.
|
// from the DB and not the old one.
|
||||||
if (err) {
|
if (err) {
|
||||||
err.status = codes.wrongrequest;
|
err.status = codes.wrongrequest;
|
||||||
return next(err);
|
return next(err);
|
||||||
|
|
Loading…
Reference in New Issue