Skip to content

Commit

Permalink
Add deleteMessItem mutation and refactor code
Browse files Browse the repository at this point in the history
  • Loading branch information
d1vshar committed Dec 24, 2020
1 parent ddae05c commit 9f194d8
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 27 deletions.
8 changes: 8 additions & 0 deletions src/filters.type.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import { gql } from 'apollo-server-express';

const FilterDef = gql`
"""
Filter input for equality relation on ID type.
"""
input IDFilter {
eq: ID
in: [ID!]
}
"""
Filter input for equality relation on String types.
"""
Expand Down
15 changes: 12 additions & 3 deletions src/mess/mess.type.js → src/mess/mess-item.type.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const MessItemDef = gql`
Filter argument options for messItems()
"""
input MessItemFilter {
_id: StringFilter
_id: IDFilter
name: StringFilter
mealTime: StringFilter
timestamp: IntRangeFilter
Expand All @@ -64,11 +64,20 @@ const MessItemDef = gql`
}
"""
Payload type for mutations on MessItem
Payload type for create mutations on MessItem
"""
type MessItemPayload {
type CreateMessItemPayload {
messItem: MessItem
}
"""
Payload type for create mutations on MessItem
"""
type DeleteMessItemPayload {
found: Int!
success: Int!
deletedCount: Int!
}
`;

export default MessItemDef;
42 changes: 42 additions & 0 deletions src/mess/mess-item.utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import mongoose from 'mongoose';

const { ObjectId } = mongoose.Types;

/**
* Converts input type into mongodb filter string.
* @param {MessItemFilter} filter GraphQL input type MessItemFilter
*/
export const generateMongoFilterFromMessItemFilter = (filter) => {
const generatedFilter = {};

/* eslint-disable no-underscore-dangle */
if (filter._id) {
generatedFilter._id = {};
if (filter._id.eq) generatedFilter._id.$eq = new ObjectId(filter._id.eq);
if (filter._id.in) {
generatedFilter._id.$in = filter._id.in;
}
}
if (filter.name) generatedFilter.name = { $eq: filter.name.eq };
if (filter.mealTime) generatedFilter.mealTime = { $eq: filter.mealTime.eq };
if (filter.timestamp) {
generatedFilter.timestamp = {};
if (filter.timestamp.gte) generatedFilter.timestamp.$gte = filter.timestamp.gte;
if (filter.timestamp.lte) generatedFilter.timestamp.$lte = filter.timestamp.lte;
}

return generatedFilter;
};

/**
* Converts input type into mongodb sort string.
* @param {MessItemOrderBy} orderBy GraphQL input type MessItemOrderBy
*/
export const generateMongoSortFromMessItemOrderBy = (orderBy) => {
const generatedSort = {};

const [key, val] = Object.entries(orderBy)[0];
generatedSort[key] = val;

return generatedSort;
};
17 changes: 17 additions & 0 deletions src/root/root-mutation.resolver.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import mongoose from 'mongoose';
import { generateMongoFilterFromMessItemFilter } from '../mess/mess-item.utils';

const { ObjectId } = mongoose.Types;

/**
* Resolver for RootMutation type.
*/
export default {
RootMutation: {
createMessItem: async (_parent, args, { models }) => {
Expand All @@ -19,5 +23,18 @@ export default {

return { messItem: newMessItem.save() };
},

deleteMessItem: async (_parent, args, { models }) => {
const { filter } = args;

const mongoFilter = filter ? generateMongoFilterFromMessItemFilter(filter) : {};
const { n, ok, deletedCount } = await models.MessItem.deleteMany(mongoFilter);

return {
found: n,
success: ok,
deletedCount,
};
},
},
};
7 changes: 6 additions & 1 deletion src/root/root-mutation.type.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,12 @@ const RootMutationDef = gql`
"""
Create mess items.
"""
createMessItem(input: MessItemInput!): MessItemPayload!
createMessItem(input: MessItemInput!): CreateMessItemPayload!
"""
Delete mess items that match filter.
"""
deleteMessItem(filter: MessItemFilter!): DeleteMessItemPayload!
}
`;

Expand Down
26 changes: 4 additions & 22 deletions src/root/root-query.resolver.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,15 @@
import mongoose from 'mongoose';

const { ObjectId } = mongoose.Types;
import { generateMongoFilterFromMessItemFilter, generateMongoSortFromMessItemOrderBy } from '../mess/mess-item.utils';

/**
* Resolver for the MessItem type.
* Resolver for the RootQuery type.
*/
export default {
RootQuery: {
messItems: async (_parent, args, { models }) => {
const mongoFilter = {};
const mongoSort = {};
const { filter, orderBy } = args;

if (filter) {
/* eslint-disable no-underscore-dangle */
if (filter._id) mongoFilter._id = { $eq: new ObjectId(filter._id.eq) };
if (filter.name) mongoFilter.name = { $eq: filter.name.eq };
if (filter.mealTime) mongoFilter.mealTime = { $eq: filter.mealTime.eq };
if (filter.timestamp) {
mongoFilter.timestamp = {};
if (filter.timestamp.gte) mongoFilter.timestamp.$gte = filter.timestamp.gte;
if (filter.timestamp.lte) mongoFilter.timestamp.$lte = filter.timestamp.lte;
}
}

if (orderBy) {
const [key, val] = Object.entries(orderBy)[0];
mongoSort[key] = val;
}
const mongoFilter = filter ? generateMongoFilterFromMessItemFilter(filter) : {};
const mongoSort = orderBy ? generateMongoSortFromMessItemOrderBy(orderBy) : {};

return models.MessItem.find(mongoFilter).sort(mongoSort);
},
Expand Down
2 changes: 1 addition & 1 deletion src/schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { makeExecutableSchema } from 'graphql-tools';
import { gql } from 'apollo-server-express';
import RootQueryDef from './root/root-query.type';
import RootMutationDef from './root/root-mutation.type';
import MessItemDef from './mess/mess.type';
import MessItemDef from './mess/mess-item.type';
import RootQueryResolver from './root/root-query.resolver';
import RootMutationResolver from './root/root-mutation.resolver';
import FilterDef from './filters.type';
Expand Down

0 comments on commit 9f194d8

Please sign in to comment.