Skip to content

Commit

Permalink
feat: implement updateCommunityEvent mutation
Browse files Browse the repository at this point in the history
ISSUES CLOSED: freeCodeCamp#187
  • Loading branch information
sivakar12 committed Jun 13, 2018
1 parent 6fad285 commit 21453d1
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 20 deletions.
82 changes: 62 additions & 20 deletions src/dataLayer/mongo/communityEvent.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,24 @@ function validateAttendees(attendees) {
});
}

function validateVars(event) {
if ('imageUrl' in event) {
if (!isString(event.imageUrl) || !validator.isURL(event.imageUrl)) {
throw new Error(
`Expected valid URL string, got ${JSON.stringify(event.imageUrl)}`
);
}
}

if ('isLocked' in event) {
if (!isString(event.isLocked) || !validator.isBoolean(event.isLocked)) {
throw new Error(
`Expected a Boolean value, got ${JSON.stringify(event.isLocked)}`
);
}
}
}

export async function createCommunityEvent(root, vars, ctx) {
return new Promise(async function createCommunityEventPromise(
resolve,
Expand All @@ -193,33 +211,18 @@ export async function createCommunityEvent(root, vars, ctx) {
}

const newEvent = {
...vars,
title: vars.title,
description: vars.description,
owner: user.id,
date: vars.date,
externalId: uuid()
};

if ('imageUrl' in vars) {
if (!isString(vars.imageUrl) || !validator.isURL(vars.imageUrl)) {
reject(
`Expected valid URL string, got ${JSON.stringify(vars.imageUrl)}`
);
return null;
}

newEvent.imageUrl = vars.imageUrl;
}

if ('isLocked' in vars) {
if (!isString(vars.isLocked) || !validator.isBoolean(vars.isLocked)) {
reject(
`Expected a Boolean value, got ${JSON.stringify(vars.isLocked)}`
);
return null;
}

newEvent.isLocked = vars.isLocked;
try {
validateVars(newEvent);
} catch (err) {
return reject(err.message);
}

if ('attendees' in vars) {
Expand Down Expand Up @@ -309,3 +312,42 @@ export async function deleteCommunityEvent(root, vars, ctx) {
return event;
});
}

export async function updateCommunityEvent(root, vars, ctx) {
const user = await validatedRequestor(ctx).catch(err => {
if (err) {
throw new Error(err);
}
});

const newEvent = {
...vars,
owner: user.id,
externalId: uuid()
};
try {
validateVars(newEvent);
} catch (err) {
return reject(err.message);
}

if (!isString(vars.externalId) || !validator.isUUID(vars.externalId)) {
throw new TypeError('Not a valid UUID');
}

const event = await CommunityEventModel.findOne({
externalId: vars.externalId
});
if (isEmpty(event)) {
throw new Error('Event not found');
}
if (event.owner.externalId !== user.externalId) {
throw new Error('Only allowed to update events you own');
}

return await CommunityEventModel.update(
{ externalId: vars.externalId },
{ $set: newEvent },
{ new: true }
);
}
2 changes: 2 additions & 0 deletions src/graphql/resolvers/communityEvent.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
getCommunityEvent,
getCommunityEvents,
createCommunityEvent,
updateCommunityEvent,
deleteCommunityEvent
} from '../../dataLayer/mongo/communityEvent';

Expand All @@ -12,6 +13,7 @@ export const communityEventResolvers = {
},
Mutation: {
createCommunityEvent,
updateCommunityEvent,
deleteCommunityEvent
}
};
7 changes: 7 additions & 0 deletions src/graphql/typeDefs/CommunityEvent/mutation.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ type Mutation {
date: String!
imageUrl: String
isLocked: Boolean): CommunityEvent @isAuthenticatedOnQuery
updateCommunityEvent(externalId: String!
title: String
description: String
attendees: [UserInput]
date: String
imageUrl: String
isLocked: Boolean): CommunityEvent @isAuthenticatedOnQuery
deleteCommunityEvent(externalId: String!): CommunityEvent @isAuthenticatedOnQuery
}
`;

0 comments on commit 21453d1

Please sign in to comment.