From f3bdcf94f03c50c250a6034be5c10d7df2857029 Mon Sep 17 00:00:00 2001 From: Frederic Heem Date: Thu, 5 Apr 2018 16:05:07 +0100 Subject: [PATCH] refactor /users, add search capabilities --- server/src/plugins/users/index.js | 4 +- server/src/plugins/users/models/UserModel.js | 3 +- .../users/models/test/testModelUsers.js | 2 +- server/src/plugins/users/test/testUsers.js | 16 +++- server/src/plugins/users/user/UserApi.js | 33 ------- server/src/plugins/users/user/UserRouter.js | 91 +++++++++++++------ 6 files changed, 77 insertions(+), 72 deletions(-) delete mode 100644 server/src/plugins/users/user/UserApi.js diff --git a/server/src/plugins/users/index.js b/server/src/plugins/users/index.js index 7e3eee02..84c05ee2 100644 --- a/server/src/plugins/users/index.js +++ b/server/src/plugins/users/index.js @@ -11,7 +11,6 @@ import MailJob from './jobs/mail/MailJob'; import MeRouter from './me/MeRouter'; import UserRouter from './user/UserRouter'; -import UserApi from './user/UserApi'; import AuthenticationRouter from './authentication/AuthenticationRouter'; @@ -75,8 +74,7 @@ function setupRouter(app){ MeRouter(app); //Users - let userApi = UserApi(app); - UserRouter(app, userApi); + UserRouter(app); } function setupAuthentication(app) { diff --git a/server/src/plugins/users/models/UserModel.js b/server/src/plugins/users/models/UserModel.js index 012616c1..fd3c2f0d 100644 --- a/server/src/plugins/users/models/UserModel.js +++ b/server/src/plugins/users/models/UserModel.js @@ -68,7 +68,8 @@ module.exports = function(sequelize, DataTypes) { attributes: ["name", "authId"] } ], - where: { [key]: value } + where: { [key]: value }, + attributes: ["id", "email", "username", "picture", "createdAt", "updatedAt"] }); }; User.findByEmail = async function(email) { diff --git a/server/src/plugins/users/models/test/testModelUsers.js b/server/src/plugins/users/models/test/testModelUsers.js index e93e17dc..83082fb2 100644 --- a/server/src/plugins/users/models/test/testModelUsers.js +++ b/server/src/plugins/users/models/test/testModelUsers.js @@ -73,7 +73,7 @@ describe('UserModel', function(){ assert(res); assert(res.get().username); assert(!res.get().password); - assert(res.get().passwordHash); + assert(!res.get().passwordHash); let userJson = res.toJSON(); assert(!userJson.password); }); diff --git a/server/src/plugins/users/test/testUsers.js b/server/src/plugins/users/test/testUsers.js index aef3295c..26d4438c 100644 --- a/server/src/plugins/users/test/testUsers.js +++ b/server/src/plugins/users/test/testUsers.js @@ -19,27 +19,35 @@ describe('Users', function() { assert(res); }); it('should get all users', async () => { - let users = await client.get('v1/users'); + const users = await client.get('v1/users'); assert(users); assert(Number.isInteger(users.count)); assert(users.data); - //console.log(users); + console.log(users); for(let user of users.data){ - let userGetOne = await client.get(`v1/users/${user.id}`); + const userGetOne = await client.get(`v1/users/${user.id}`); assert(userGetOne); //console.log('user ' , userGetOne); //assert(_.isEqual(user, userGetOne)); assert(user); - //console.log('user:', user) + //console.log('user:', userGetOne); assert(userGetOne.id); assert(userGetOne.username); assert(userGetOne.createdAt); assert(userGetOne.updatedAt); assert(!userGetOne.password); + assert(!userGetOne.passwordHash); } }); + it('should get all users', async () => { + const users = await client.get('v1/users?search=mail'); + assert(users); + assert(Number.isInteger(users.count)); + assert(users.data); + console.log(users); + }); it('should get all users with filter ASC', async () => { let res = await client.get('v1/users?offset=1&order=ASC&limit=10'); assert.equal(res.data.length, 10); diff --git a/server/src/plugins/users/user/UserApi.js b/server/src/plugins/users/user/UserApi.js deleted file mode 100644 index f3a2a723..00000000 --- a/server/src/plugins/users/user/UserApi.js +++ /dev/null @@ -1,33 +0,0 @@ -import _ from 'lodash'; -let log = require('logfilename')(__filename); - -export default function UserApi(app) { - let models = app.data.models(); - - return { - getAll: async function (filter = {}) { - _.defaults(filter, { - limit: 100, - order: 'DESC', - offset: 0 - }); - log.info('getAll ', filter); - // TODO try to remove the " when setting the order. - let result = await models.User.findAndCountAll({ - limit: filter.limit, - order: [["createdAt", filter.order]], - offset: filter.offset - }); - log.info(`getAll count: ${result.count}`); - let users = _.map(result.rows, user => user.toJSON()); - return { - count: result.count, - data: users - }; - }, - getOne: function (userId) { - log.debug("get userId: ", userId); - return models.User.findByUserId(userId); - } - }; -} diff --git a/server/src/plugins/users/user/UserRouter.js b/server/src/plugins/users/user/UserRouter.js index 8c0eeb18..1c5ed66c 100644 --- a/server/src/plugins/users/user/UserRouter.js +++ b/server/src/plugins/users/user/UserRouter.js @@ -1,37 +1,68 @@ -import Router from 'koa-66'; -import Qs from 'qs'; +import _ from "lodash"; +import Qs from "qs"; +import Sequelize from "sequelize"; -let log = require('logfilename')(__filename); +export default function UserRouter(app) { + const { models } = app.data.sequelize; -export function UserHttpController(app, userApi){ - log.debug("UserHttpController"); + const api = { + pathname: "/users", + middlewares: [ + app.server.auth.isAuthenticated, + app.server.auth.isAuthorized + ], + ops: { + getAll: { + pathname: "/", + method: "get", + handler: async context => { + const filter = Qs.parse(context.request.querystring); + _.defaults(filter, { + limit: 100, + order: "DESC", + offset: 0 + }); + const result = await models.User.findAndCountAll({ + limit: filter.limit, + order: [["createdAt", filter.order]], + offset: filter.offset, + where: filter.search && { + $or: [ + { username: { $like: `%${filter.search}%` } }, + { email: { $like: `%${filter.search}%` } } + ] + } + }); + context.body = { + count: result.count, + data: result.rows.map(user => user.toJSON()) + }; + context.status = 200; + } + }, + getOne: { + pathname: "/:id", + method: "get", + handler: async context => { + const user = await models.User.findByUserId(context.state.user.id); - let respond = app.utils.http.respond; - return { - async getAll(context) { - return respond( - context, - userApi, - userApi.getAll, - [Qs.parse(context.request.querystring)]); - }, - async getOne(context) { - let userId = context.params.id; - return respond(context, userApi, userApi.getOne, [userId]); + if (!user) { + context.status = 404; + context.body = { + error: { + code: 404, + name: "NotFound" + } + }; + } else { + context.body = user.get(); + context.status = 200; + } + } + } } }; -} - -export default function UserRouter(app, userApi){ - let router = new Router(); - let userHttpController = UserHttpController(app, userApi); - - router.use(app.server.auth.isAuthenticated); - router.use(app.server.auth.isAuthorized); - - router.get('/', userHttpController.getAll); - router.get('/:id', userHttpController.getOne); - app.server.baseRouter().mount("/users", router); - return router; + app.server.createRouter(api); + return {}; }