Skip to content

Commit 3e32a0b

Browse files
committed
graphql: Added graphql support for vaccination
1 parent e58da4b commit 3e32a0b

File tree

7 files changed

+135
-13
lines changed

7 files changed

+135
-13
lines changed

api/src/graphql/resolvers.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ const {
1414
query: dewormingQueries,
1515
mutation: dewormingMutation,
1616
} = require('./resolvers/deworming/index');
17+
const {
18+
query: vaccinationQueries,
19+
mutation: vaccinationMutation,
20+
} = require('./resolvers/vaccination/index');
1721

1822
const resolvers = {
1923
Query: {
@@ -22,11 +26,13 @@ const resolvers = {
2226
...userQueries,
2327
...animalQueries,
2428
...dewormingQueries,
29+
...vaccinationQueries,
2530
},
2631
Mutation: {
2732
...userMutations,
2833
...animalMutation,
2934
...dewormingMutation,
35+
...vaccinationMutation,
3036
},
3137

3238
NameType,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const {
2+
getAll: getAllVaccinations,
3+
getById: getVaccinationById,
4+
create: createVaccination,
5+
update: updateVaccination,
6+
destroy: deleteVaccination,
7+
} = require('./vaccination.resolvers');
8+
9+
const query = {
10+
vaccinations: getAllVaccinations,
11+
vaccination: getVaccinationById,
12+
};
13+
14+
const mutation = {
15+
createVaccination,
16+
updateVaccination,
17+
deleteVaccination,
18+
};
19+
20+
module.exports = { query, mutation };
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const {
2+
getAllVaccination,
3+
getVaccination,
4+
createVaccination,
5+
updateVaccination,
6+
deleteVaccination,
7+
} = require('../../../modules/vaccination/vaccination.service');
8+
const {
9+
validateGraphQLSession,
10+
} = require('../../../middlewares/authentication');
11+
12+
const getAll = async (_, { query = {} }, context) => {
13+
const user = await validateGraphQLSession(context.req);
14+
15+
return getAllVaccination(user.id, query);
16+
};
17+
18+
const getById = async (_, { id: vaccinationId }, context) => {
19+
const user = await validateGraphQLSession(context.req);
20+
21+
return getVaccination(user.id, vaccinationId);
22+
};
23+
24+
const create = async (_, { input }, context) => {
25+
const user = await validateGraphQLSession(context.req);
26+
27+
return createVaccination(user.id, input);
28+
};
29+
30+
const update = async (_, { id: vaccinationId, changes }, context) => {
31+
const user = await validateGraphQLSession(context.req);
32+
33+
return updateVaccination(user.id, vaccinationId, changes);
34+
};
35+
36+
const destroy = async (_, { id: vaccinationId }, context) => {
37+
const user = await validateGraphQLSession(context.req);
38+
39+
return deleteVaccination(user.id, vaccinationId);
40+
};
41+
42+
module.exports = {
43+
getAll,
44+
getById,
45+
create,
46+
update,
47+
destroy,
48+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
type Query {
2+
vaccinations(query: queryVaccination): [Vaccination!]!
3+
vaccination(id: UUID!): Vaccination!
4+
}
5+
6+
type Mutation {
7+
createVaccination(input: CreateVaccination!): Vaccination!
8+
updateVaccination(id: UUID!, changes: UpdateVaccination!): Vaccination!
9+
deleteVaccination(id: UUID!): Int!
10+
}
11+
12+
type Vaccination {
13+
id: UUID!
14+
vaccine: String!
15+
description: String
16+
animal: AnimalSummaryResponse!
17+
registeredAt: Date!
18+
}
19+
20+
input queryVaccination {
21+
animalId: UUID
22+
vaccine: String
23+
limit: Int
24+
offset: Int
25+
}
26+
27+
input CreateVaccination {
28+
vaccine: String!
29+
description: String
30+
animalId: UUID!
31+
}
32+
33+
input UpdateVaccination {
34+
vaccine: String
35+
description: String
36+
}

api/src/modules/vaccination/vaccination.repository.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
const sequelize = require('../../store/db/sequelize');
22

3-
const findAllVaccinations = async (userId, filters) => {
3+
const findAllVaccinations = async (userId, { where, limit, offset }) => {
44
return sequelize.models.Vaccination.findAll({
5-
where: filters,
5+
where,
6+
limit,
7+
offset,
68
include: [
79
{
810
model: sequelize.models.Animal,

api/src/modules/vaccination/vaccination.service.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@ const formatVaccination = (vaccination) => {
2020
};
2121

2222
const buildFilters = (query) => {
23-
const { vaccine, animalId } = query;
23+
const { vaccine, animalId, limit = 10, offset = 0 } = query;
2424

25-
return {
25+
const where = {
2626
...(vaccine && { vaccine: { [Op.iLike]: `%${vaccine}%` } }),
2727
...(animalId && { animalId }),
2828
};
29+
30+
return {
31+
where,
32+
limit: parseInt(limit, 10),
33+
offset: parseInt(offset, 10),
34+
};
2935
};
3036

3137
const getAllVaccination = async (userId, query) => {
@@ -89,7 +95,7 @@ const createVaccination = async (userId, vaccinationData) => {
8995
throw Boom.badRequest('Something went wrong creating the vaccination');
9096
}
9197

92-
return newVaccination;
98+
return getVaccination(userId, newVaccination.id);
9399
};
94100

95101
const updateVaccination = async (userId, vaccinationId, vaccinationData) => {
@@ -116,7 +122,7 @@ const updateVaccination = async (userId, vaccinationId, vaccinationData) => {
116122
throw Boom.badRequest('Something went wrong creating the vaccination');
117123
}
118124

119-
return updatedVaccination;
125+
return getVaccination(userId, updatedVaccination.id);
120126
};
121127

122128
const deleteVaccination = async (userId, vaccinationId) => {

tests/unit/vaccination-service.test.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ describe('Vaccination service', () => {
102102
);
103103
expect(vaccinationRepository.findAllVaccinations).toHaveBeenCalledWith(
104104
userId,
105-
{ animalId: query.animalId },
105+
{ where: { animalId: query.animalId }, limit: 10, offset: 0 },
106106
);
107107
});
108108

@@ -203,13 +203,15 @@ describe('Vaccination service', () => {
203203
});
204204

205205
test('It should return a new vaccination', async () => {
206-
vaccinationRepository.create.mockResolvedValue({
206+
const newVaccination = {
207207
...dbResponse,
208208
id: fakeUuid,
209209
vaccine: vaccinationData.vaccine,
210210
description: vaccinationData.description,
211-
});
211+
};
212+
vaccinationRepository.create.mockResolvedValue(newVaccination);
212213
animalRepository.findOne.mockResolvedValue(animal1());
214+
vaccinationRepository.findOne.mockResolvedValue(newVaccination);
213215

214216
const result = await createVaccination(userId, vaccinationData);
215217

@@ -287,8 +289,9 @@ describe('Vaccination service', () => {
287289
});
288290

289291
test('It should return an updated vaccination', async () => {
290-
vaccinationRepository.findOne.mockResolvedValue(vaccination1());
292+
vaccinationRepository.findOne.mockResolvedValueOnce(vaccination1());
291293
vaccinationRepository.update.mockResolvedValue([1, [dbResponse]]);
294+
vaccinationRepository.findOne.mockResolvedValueOnce(dbResponse);
292295

293296
const result = await updateVaccination(
294297
userId,
@@ -299,15 +302,16 @@ describe('Vaccination service', () => {
299302
expect(result.id).toBe(vaccinationId);
300303
expect(result.vaccine).toBe(vaccinationData.vaccine);
301304
expect(result.description).toBe(vaccinationData.description);
302-
expect(vaccinationRepository.findOne).toHaveBeenCalledTimes(1);
305+
expect(vaccinationRepository.findOne).toHaveBeenCalledTimes(2);
303306
expect(vaccinationRepository.update).toHaveBeenCalledTimes(1);
304307
});
305308

306309
test('It should return an updated vaccination with only name updated', async () => {
307310
delete vaccinationData.description;
308311

309-
vaccinationRepository.findOne.mockResolvedValue(vaccination1());
312+
vaccinationRepository.findOne.mockResolvedValueOnce(vaccination1());
310313
vaccinationRepository.update.mockResolvedValue([1, [dbResponse]]);
314+
vaccinationRepository.findOne.mockResolvedValueOnce(dbResponse);
311315

312316
const result = await updateVaccination(
313317
userId,
@@ -318,7 +322,7 @@ describe('Vaccination service', () => {
318322
expect(result.id).toBe(vaccinationId);
319323
expect(result.vaccine).toBe(vaccinationData.vaccine);
320324
expect(result.description).not.toBe(vaccinationData.description);
321-
expect(vaccinationRepository.findOne).toHaveBeenCalledTimes(1);
325+
expect(vaccinationRepository.findOne).toHaveBeenCalledTimes(2);
322326
expect(vaccinationRepository.update).toHaveBeenCalledTimes(1);
323327
});
324328

0 commit comments

Comments
 (0)