|
@@ -1,4 +1,5 @@
|
|
|
import { parse, addMinutes, isValid } from 'date-fns';
|
|
import { parse, addMinutes, isValid } from 'date-fns';
|
|
|
|
|
+import escapeStringRegexp from 'escape-string-regexp';
|
|
|
import express, { Request, Router } from 'express';
|
|
import express, { Request, Router } from 'express';
|
|
|
import rateLimit from 'express-rate-limit';
|
|
import rateLimit from 'express-rate-limit';
|
|
|
import { query } from 'express-validator';
|
|
import { query } from 'express-validator';
|
|
@@ -36,6 +37,8 @@ module.exports = (crowi: Crowi): Router => {
|
|
|
const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
|
|
const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
|
|
|
const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
|
|
const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
|
|
|
|
|
|
|
|
|
|
+ const User = crowi.model('User');
|
|
|
|
|
+
|
|
|
const router = express.Router();
|
|
const router = express.Router();
|
|
|
|
|
|
|
|
// eslint-disable-next-line max-len
|
|
// eslint-disable-next-line max-len
|
|
@@ -96,5 +99,30 @@ module.exports = (crowi: Crowi): Router => {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+ router.get('/usernames', loginRequiredStrictly, adminRequired, async(req: Request, res: ApiV3Response) => {
|
|
|
|
|
+ const q = req.query.q as string;
|
|
|
|
|
+ const escapedString = escapeStringRegexp(q);
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ const undeletedUsernames = await User.find({
|
|
|
|
|
+ status: { $ne: User.STATUS_DELETED },
|
|
|
|
|
+ username: new RegExp(`^${escapedString}`, 'i'),
|
|
|
|
|
+ }).distinct('username');
|
|
|
|
|
+
|
|
|
|
|
+ const activitySnapshotUsernames = await Activity.find({
|
|
|
|
|
+ $and: [
|
|
|
|
|
+ { 'snapshot.username': { $nin: undeletedUsernames } },
|
|
|
|
|
+ { 'snapshot.username': new RegExp(`^${escapedString}`, 'i') },
|
|
|
|
|
+ ],
|
|
|
|
|
+ }).distinct('snapshot.username');
|
|
|
|
|
+
|
|
|
|
|
+ return res.apiv3({ usernames: [...undeletedUsernames, ...activitySnapshotUsernames] });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ logger.error('failed to get usernames', err);
|
|
|
|
|
+ return res.apiv3Err(err);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
return router;
|
|
return router;
|
|
|
};
|
|
};
|