Add all users endpoints to apib

pull/32/head
HardiReady 2018-03-29 22:14:04 +02:00
parent 0f6a954ae4
commit 85b97c771f
13 changed files with 106 additions and 76 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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}

View File

@ -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}

View File

@ -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}

View File

@ -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

View File

@ -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');

View File

@ -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);