Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions controllers/user-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,27 @@ const userController = {
} catch (error) {
return error;
}
},
getUsers: async () => {
try {
return await userService.getUsers();
} catch (error) {
return error;
}
},
getUserById: async (user_id) => {
try {
return await userService.getUserById(user_id);
} catch (error) {
return error;
}
},
getUsersByCreator: async (creator_id) => {
try {
return await userService.getUsersByCreator(creator_id);
} catch (error) {
return error;
}
}
}

Expand Down
85 changes: 82 additions & 3 deletions routes/user.route.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ const Joi = require('@hapi/joi');
const Boom = require('@hapi/boom');
const userController = require('../controllers/user-controller');

const User = require('../models/user.model');


module.exports = [
{
method: ['POST'],
Expand Down Expand Up @@ -79,6 +76,88 @@ module.exports = [
}
return h.response(response);

} catch (error) {
return Boom.badImplementation();
}
}
},
{
method: 'GET',
config: {
auth: 'firebase',
description: 'Get all users',
notes: 'Returns all users',
tags: ['api']
},
path: '/api/user',
handler: async (request, h) => {
try {
const result = await userController.getUsers();
const response = {
type: 'Success',
message: 'Users fetched successfully',
body: result
}
return h.response(response);

} catch (error) {
return Boom.badImplementation();
}
}
},
{
method: 'GET',
config: {
auth: 'firebase',
description: 'Get user by user id',
notes: 'Returns matching user',
tags: ['api'],
validate: {
params: Joi.object({
user_id: Joi.string().required().description('User Id')
}),
failAction: async (request, h, err) => {
throw err;
}
}
},
path: '/api/user/{user_id}',
handler: async (request, h) => {
try {
const user_id = request.params.user_id;
const result = await userController.getUserById(user_id);
const response = {
type: 'Success',
message: 'Matching user fetched successfully',
body: result
}
return h.response(response);

} catch (error) {
return Boom.badImplementation();
}
}
},
{
method: 'GET',
config: {
auth: 'firebase',
description: 'Get user by creator',
notes: 'Returns all matching users',
tags: ['api']
},
path: '/api/user/creator',
handler: async (request, h) => {
try {
const creator_id = request.user.user_id;
const result = await userController.getUsersByCreator(creator_id);
const response = {
type: 'Success',
message: 'Matching users fetched successfully',
body: result
}
return h.response(response);

} catch (error) {
return Boom.badImplementation();
}
Expand Down
25 changes: 25 additions & 0 deletions services/user-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,38 @@ const userService = {
const result = await newUser.save();

let objectToUpdate = await User.find({ _id: payload.user_id });

objectToUpdate[0].people_ids.push(result._id);

return await objectToUpdate[0].save();
} catch (error) {
return error;
}
},
getUsers: async() => {
try {
return await User.find();
} catch (error) {
return error;
}
},
getUserById: async(user_id) => {
try {
const result = await User.find({ _id: user_id })
return result;
} catch (error) {
return error;
}
},
getUsersByCreator: async(creator_id) => {
try {
const result = await User.find({ creator_id: creator_id })
return result;
} catch (error) {
return error;
}
}

}

module.exports = userService;
30 changes: 30 additions & 0 deletions tests/fixtures/usersData.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"users": [
{
"people_ids": [
"5e94e5dc4aca380038dcd37a",
"5e94e5df4aca380038dcd37b",
"5e94e5e54aca380038dcd37c"
],
"_id": "5e94e4f72f43ef01d034315c",
"creator_id": "q5YBcoW8TTVBr3mk8uFNiUdc8nz2",
"first_name": "Test",
"last_name": "user",
"dob": "2001-01-01T00:00:00.000Z",
"phone_number": "070900000",
"gender": "Female",
"__v": 3
},
{
"people_ids": [],
"_id": "5e94516f93032a0064076d1c",
"creator_id": "q5YBcoW8TTVBr3mk8uFNiUdc8nz2",
"first_name": "Test",
"last_name": "user2",
"dob": "2001-01-01T00:00:00.000Z",
"phone_number": "0708000000",
"gender": "Female",
"__v": 0
}
]
}
86 changes: 86 additions & 0 deletions tests/services/user.service.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
const expect = require('chai').expect
const mongoUnit = require('mongo-unit')
const testMongoUrl = process.env.MONGO_URL
const testData = require('../fixtures/usersData.json')

let service
let db ;

after(async () => {
await mongoUnit.stop()
db.close();
})

describe('service', () => {
before(() => {
db = require('../../config/database').db;
// create it after DB is started
service = require('../../services/user-service')
})
beforeEach(() => mongoUnit.initDb(testMongoUrl, testData))
afterEach(() => {
mongoUnit.drop()
})

it('should save a new user', () => {
let payload = {
first_name : 'Test',
last_name : 'user',
dob : '2002-01-01',
phone_number : '0708000000',
gender : 'Female',
creator_id : '12345'
}
return service
.saveUser(payload)
.then(user => {
expect(user.first_name).to.equal('Test')
expect(user.phone_number).to.equal('0708000000')
})
.then(() => service.getUsers())
.then(users => {
expect(users.length).to.equal(3)
});;
})

it('should save user contact', () => {
let payload = {
first_name : 'Test',
last_name : 'user2',
dob : '2002-02-02',
phone_number : '0709000000',
gender : 'Male',
creator_id : '12345',
user_id : '5e94516f93032a0064076d1c'
}
return service
.saveUserContact(payload)
.then()
.then(() => service.getUsers())
.then(users => {
expect(users.length).to.equal(3)
});
})

it('should find all users', () => {
return service.getUsers().then(users => {
expect(users.length).to.equal(2)
expect(users[0].first_name).to.equal('Test')
})
})

it('should find user by user id', () => {
const user_id = '5e94516f93032a0064076d1c';
return service.getUserById(user_id).then(users => {
expect(users.length).to.equal(0)
})
});

it('should find user by creator id', () => {
const creator_id = 'q5YBcoW8TTVBr3mk8uFNiUdc8nz2';
return service.getUsersByCreator(creator_id).then(users => {
expect(users.length).to.equal(2)
expect(users[0].first_name).to.equal('Test')
})
})
});