Compare commits

...

2 Commits

11 changed files with 82 additions and 48 deletions

View File

@ -5,14 +5,17 @@ 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: `BLUFOR` (enum[string], optional) + fractFilter: `BLUFOR` (enum[string], optional) - Field to filter by fraction
Field to filter by fraction
+ Members + Members
+ `BLUFOR` + `BLUFOR`
+ `OPFOR` + `OPFOR`
+ `GLOBAL` + `GLOBAL`
+ squadId: `591470249e9fae286e008e31` (string, optional) - Field to filter by membership of certain squad
+ decorationId: `5abd3dff6e6a0334d95b8ba0` (string, optional) - Field to filter by ownership of certain decoration
+ limit: 20 (number, optional) + limit: 20 (number, optional)
Maximum number of users to return Maximum number of users to return

View File

@ -78,10 +78,10 @@ authenticate.route('/signup')
.post((req, res, next) => { .post((req, res, next) => {
create(req.body) create(req.body)
.then(() => { .then(() => {
res.send(201, {message: 'User successfully created'}); res.status(codes.created).send({message: 'User successfully created'});
}) })
.catch((err) => { .catch((err) => {
res.status(400).send(err); res.status(codes.wrongrequest).send(err);
}); });
}) })

View File

@ -29,40 +29,59 @@ users.get('/', offsetlimitMiddleware);
// routes ********************** // routes **********************
users.route('/') users.route('/')
.get((req, res, next) => { .get((req, res, next) => {
const finishFiltersAndExecute = () => {
// squad / fraction filter setup
if (req.query.fractFilter && req.query.fractFilter !== 'UNASSIGNED' && !req.query.squadId) {
SquadModel.find({'fraction': req.query.fractFilter}, {_id: 1}, (err, squads) => {
dbFilter['squadId'] = {$in: squads.map((squad) => squad.id)};
userQuery();
});
} else {
if (req.query.fractFilter === 'UNASSIGNED') {
dbFilter['squadId'] = {$eq: null};
}
userQuery();
}
};
const userQuery = () => { const userQuery = () => {
UserModel.find(dbFilter, res.locals.filter, res.locals.limitskip) UserModel.find(dbFilter, res.locals.filter, res.locals.limitskip)
.populate('squadId') .populate('squadId')
.collation({locale: 'en', strength: 2}) // case insensitive order .collation({locale: 'en', strength: 2}) // case insensitive order
.sort('username').exec((err, users) => { .sort('username')
if (err) return next(err); .exec((err, users) => {
if (users.length === 0) { if (err) return next(err);
res.locals.items = users; if (users.length === 0) {
res.locals.processed = true; res.locals.items = users;
return next(); res.locals.processed = true;
} return next();
UserModel.count(dbFilter, (err, totalCount) => { }
res.set('x-total-count', totalCount);
res.locals.items = users; UserModel.count(dbFilter, (err, totalCount) => {
res.locals.processed = true; res.set('x-total-count', totalCount);
return next(); res.locals.items = users;
}); res.locals.processed = true;
}); return next();
});
});
}; };
if (!req.query.q) req.query.q = ''; const nameQuery = (!req.query.q) ? '' : req.query.q;
const dbFilter = {username: {'$regex': req.query.q, '$options': 'i'}};
const dbFilter = {username: {'$regex': nameQuery, '$options': 'i'}};
if (req.query.squadId) dbFilter['squadId'] = {'$eq': req.query.squadId}; if (req.query.squadId) dbFilter['squadId'] = {'$eq': req.query.squadId};
// squad / fraction filter setup
if (req.query.fractFilter && req.query.fractFilter !== 'UNASSIGNED' && !req.query.squadId) { // decoration filter
SquadModel.find({'fraction': req.query.fractFilter}, {_id: 1}, (err, squads) => { const queryDecoId = req.query.decorationId;
dbFilter['squadId'] = {$in: squads.map((squad) => squad.id)}; if (queryDecoId) {
userQuery(); AwardingModel.find({decorationId: queryDecoId}, (err, awards) => {
const userIds = [...new Set(awards.map((award) => award.userId))];
dbFilter._id = {'$in': userIds};
finishFiltersAndExecute();
}); });
} else { } else {
if (req.query.fractFilter === 'UNASSIGNED') { finishFiltersAndExecute();
dbFilter['squadId'] = {$eq: null};
}
userQuery();
} }
}) })
@ -196,7 +215,6 @@ users.route('/:id')
routerHandling.httpMethodNotAllowed routerHandling.httpMethodNotAllowed
); );
// this middleware function can be used, if you like or remove it // this middleware function can be used, if you like or remove it
// it looks for object(s) in res.locals.items and if they exist, they are send to the client as json // it looks for object(s) in res.locals.items and if they exist, they are send to the client as json
users.use(routerHandling.emptyResponse); users.use(routerHandling.emptyResponse);

View File

@ -51,7 +51,6 @@ export class ArmyMemberComponent implements OnInit, OnDestroy {
this.awards = awards; this.awards = awards;
})); }));
}); });
}; };
ngOnDestroy() { ngOnDestroy() {

View File

@ -4,7 +4,7 @@
min-width: 800px; min-width: 800px;
position: relative; position: relative;
margin: auto auto 25px; margin: auto auto 25px;
height: calc(100vh - 95px); min-height: calc(100vh - 95px);
} }
.show-panel { .show-panel {
@ -12,6 +12,10 @@
margin: inherit; margin: inherit;
} }
:host /deep/ .show-panel mat-card {
cursor: default;
}
.decoration-show-panel { .decoration-show-panel {
height: 250px; height: 250px;
} }

View File

@ -23,7 +23,7 @@
<ng-container matColumnDef="fraction"> <ng-container matColumnDef="fraction">
<th mat-header-cell *matHeaderCellDef>Fraktion</th> <th mat-header-cell *matHeaderCellDef>Fraktion</th>
<td mat-cell *matCellDef="let element" <td mat-cell *matCellDef="let element"
[style.color]="traceItem.fraction === 'BLUFOR' ? fraction.COLOR_BLUFOR :fraction.COLOR_OPFOR"> [style.color]="element.squadId.fraction === 'BLUFOR' ? fraction.COLOR_BLUFOR :fraction.COLOR_OPFOR">
{{element.squadId.fraction === 'BLUFOR' ? fraction.BLUFOR : fraction.OPFOR}} {{element.squadId.fraction === 'BLUFOR' ? fraction.BLUFOR : fraction.OPFOR}}
</td> </td>
</ng-container> </ng-container>

View File

@ -44,18 +44,19 @@ export class TraceOverviewComponent implements OnInit, OnDestroy {
if (this.router.url.includes('find/award/')) { if (this.router.url.includes('find/award/')) {
// Award // Award
this.isRank = false; this.isRank = false;
console.log(itemId);
this.decorationService.getDecoration(itemId).subscribe(decoration => { this.decorationService.getDecoration(itemId).subscribe(decoration => {
this.traceItem = decoration; this.traceItem = decoration;
console.log(decoration) this.userService.findUsers({decorationId: decoration._id}).subscribe(users => {
this.users = users.filter(user => user.squadId != null);
});
}); });
} else if (this.router.url.includes('find/rank/')) { } else if (this.router.url.includes('find/rank/')) {
// Rank // Rank
this.isRank = true; this.isRank = true;
this.rankService.getRank(itemId).subscribe(rank => { this.rankService.getRank(itemId).subscribe(rank => {
this.traceItem = rank; this.traceItem = rank;
this.userService.findUsers('', rank.fraction).subscribe(users => { this.userService.findUsers({fraction: rank.fraction}).subscribe(users => {
this.users = users.filter(user => user.rankLvl === rank.level); this.users = users.filter(user => user.squadId != null && user.rankLvl === rank.level);
}); });
}); });
} }

View File

@ -45,7 +45,7 @@ export class RequestAwardComponent implements OnInit {
ngOnInit() { ngOnInit() {
const currentUser = this.loginService.getCurrentUser(); const currentUser = this.loginService.getCurrentUser();
this.userService.findUsers('', undefined, currentUser.squad._id).subscribe(users => { this.userService.findUsers({squadId: currentUser.squad._id}).subscribe(users => {
this.users = users; this.users = users;
}); });
this.decorationService.findDecorations('', currentUser.squad.fraction).subscribe(decorations => { this.decorationService.findDecorations('', currentUser.squad.fraction).subscribe(decorations => {

View File

@ -44,7 +44,7 @@ export class RequestPromotionComponent implements OnInit {
ngOnInit() { ngOnInit() {
const currentUser = this.loginService.getCurrentUser(); const currentUser = this.loginService.getCurrentUser();
// show only current users squad members // show only current users squad members
this.userService.findUsers('', undefined, currentUser.squad._id).subscribe(users => { this.userService.findUsers({squadId: currentUser.squad._id}).subscribe(users => {
this.users = users; this.users = users;
}); });
this.rankService.findRanks('', currentUser.squad.fraction).subscribe(ranks => { this.rankService.findRanks('', currentUser.squad.fraction).subscribe(ranks => {

View File

@ -19,15 +19,23 @@ export class UserService {
this.users$ = userStore.items$; this.users$ = userStore.items$;
} }
findUsers(query = '', fractionFilter?, squadFilter?, limit?, offset?, action = LOAD) { findUsers(filter, limit?, offset?, action = LOAD) {
const searchParams = new URLSearchParams(); const searchParams = new URLSearchParams();
searchParams.append('q', query);
if (fractionFilter) { searchParams.append('q', (filter && filter.query) ? filter.query : '');
searchParams.append('fractFilter', fractionFilter);
if (filter && filter.fraction) {
searchParams.append('fractFilter', filter.fraction);
} }
if (squadFilter) {
searchParams.append('squadId', squadFilter); if (filter && filter.squadId) {
searchParams.append('squadId', filter.squadId);
} }
if (filter && filter.decorationId) {
searchParams.append('decorationId', filter.decorationId);
}
searchParams.append('limit', limit); searchParams.append('limit', limit);
searchParams.append('offset', offset); searchParams.append('offset', offset);
this.http.get(this.config.apiUserPath, searchParams) this.http.get(this.config.apiUserPath, searchParams)

View File

@ -1,5 +1,4 @@
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {Location} from '@angular/common';
import {FormControl} from '@angular/forms'; import {FormControl} from '@angular/forms';
import {ActivatedRoute, Router} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
@ -81,8 +80,10 @@ export class UserListComponent implements OnInit {
this.limit = 20; this.limit = 20;
} }
this.radioModel = UIHelpers.toggleReleaseButton(this.radioModel, group); this.radioModel = UIHelpers.toggleReleaseButton(this.radioModel, group);
return this.users$ = this.userService.findUsers(this.searchTerm.value, this.radioModel, return this.users$ = this.userService.findUsers({
null, this.limit, this.offset, action); query: this.searchTerm.value,
fraction: this.radioModel
}, this.limit, this.offset, action);
} }
onScrollDown() { onScrollDown() {