@@ -6,7 +6,7 @@ import uuid from 'uuid/v4';
6
6
import { isEmpty , isString } from 'lodash' ;
7
7
8
8
import { asyncErrorHandler } from '../../utils' ;
9
- import { verifyWebToken , namespace , updateAppMetaData } from '../../auth' ;
9
+ import { verifyWebToken } from '../../auth' ;
10
10
import { isArray } from 'util' ;
11
11
12
12
const log = debug ( 'fcc:dataLayer:mongo:event' ) ;
@@ -35,22 +35,18 @@ function resolveAttendees(attendees) {
35
35
return null;
36
36
}
37
37
*/
38
- // const attendee = await UserModel.findOne({externalId: attendeeUuid.externalId}, '_id');
38
+
39
39
const attendee = await UserModel . findOne ( attendeeUuid , '_id' ) ;
40
- // const attendee = await UserModel.findOne(
41
- // { email: 'otto@a20.net' },
42
- // '_id'
43
- // );
44
40
45
41
if ( attendee && ! attendee . isEmpty ) {
46
42
resolvedAttendeesResult . push ( attendee . _id ) ;
47
43
} else {
48
- reject ( `Cant find attendee ${ attendeeUuid } ` ) ;
44
+ reject ( `Unable to find attendee: ${ JSON . stringify ( attendeeUuid ) } ` ) ;
49
45
return null ;
50
46
}
51
47
}
52
48
53
- return resolve ( resolvedAttendeesResult ) ;
49
+ resolve ( resolvedAttendeesResult ) ;
54
50
} ) ;
55
51
}
56
52
@@ -87,25 +83,25 @@ export async function getCommunityEvent(root, vars) {
87
83
* consider builder pattern
88
84
*/
89
85
if ( 'externalId' in vars && 'title in vars' in vars ) {
86
+ if ( ! isString ( vars . externalId ) || ! validator . isUUID ( vars . externalId ) ) {
87
+ throw new TypeError ( `Expected a valid UUID: ${ vars . externalId } ` ) ;
88
+ }
90
89
log (
91
90
'both title and externalId in query, preferring externalId as ' +
92
91
'it is more specific'
93
92
) ;
94
- if ( ! isString ( vars . externalId ) || ! validator . isUUID ( vars . externalId ) ) {
95
- throw new TypeError ( 'Not a valid UUID' ) ;
96
- }
97
93
query . externalId = vars . externalId ;
98
94
} else if ( 'externalId' in vars ) {
99
- log ( 'searching by ID ' + vars . externalId ) ;
100
95
if ( ! isString ( vars . externalId ) || ! validator . isUUID ( vars . externalId ) ) {
101
- throw new TypeError ( ' Expected UUID' ) ;
96
+ throw new TypeError ( ` Expected a valid UUID: ${ vars . externalId } ` ) ;
102
97
}
98
+ log ( 'searching by ID ' + vars . externalId ) ;
103
99
query . externalId = vars . externalId ;
104
100
} else if ( 'title' in vars ) {
105
- log ( 'searching by title' ) ;
106
101
if ( ! isString ( vars . title ) ) {
107
- throw new TypeError ( ' Expected string' ) ;
102
+ throw new TypeError ( ` Expected a valid String: ${ vars . title } ` ) ;
108
103
}
104
+ log ( 'searching by title' ) ;
109
105
query . title = vars . title ;
110
106
} else {
111
107
throw new TypeError ( 'Expected an event ID or title' ) ;
@@ -127,7 +123,7 @@ export async function getCommunityEvents(root, vars) {
127
123
* no console.log
128
124
* consider builder pattern
129
125
130
- Pagination
126
+ * Implement pagination
131
127
*/
132
128
if ( 'externalId' in vars && 'title in vars' in vars ) {
133
129
console . log (
@@ -203,7 +199,7 @@ export async function createCommunityEvent(root, vars, ctx) {
203
199
if ( 'isLocked' in vars ) {
204
200
if ( ! vars . isLocked . isString || validator . isBoolean ( vars . isLocked ) ) {
205
201
reject (
206
- `Expected valid URL string , got ${ JSON . stringify ( vars . imageUrl ) } `
202
+ `Expected a Boolean value , got ${ JSON . stringify ( vars . isLocked ) } `
207
203
) ;
208
204
return null ;
209
205
}
@@ -213,14 +209,15 @@ export async function createCommunityEvent(root, vars, ctx) {
213
209
214
210
if ( 'attendees' in vars ) {
215
211
event . attendees = await resolveAttendees ( vars . attendees ) . catch ( err => {
216
- console . log ( 'Oh oh could not resolve users, I should stop now..' ) ;
217
212
reject ( err ) ;
218
213
return null ;
219
214
} ) ;
215
+
216
+ if ( ! event . attendees ) {
217
+ return null ;
218
+ }
220
219
}
221
220
222
- // BUG: code below will even though our previous if statement returned null
223
- // how does that work?
224
221
const e = new CommunityEventModel ( event ) ;
225
222
226
223
await e . save ( err => {
@@ -229,8 +226,7 @@ export async function createCommunityEvent(root, vars, ctx) {
229
226
return null ;
230
227
}
231
228
/* Will have attendees populated at this point
232
- Note that it interestingly this will *not* have an ID:
233
-
229
+ Note that it interestingly this will *not* have an ID:
234
230
{
235
231
"title":"another new event",
236
232
"description":"cool event IV",
@@ -248,9 +244,47 @@ export async function createCommunityEvent(root, vars, ctx) {
248
244
} ) ;
249
245
}
250
246
251
- // Update an event
247
+ // TODO: Update an event
252
248
// export async function updateEvent(root, vars, ctx) {
253
249
// }
254
250
255
251
// Delete event, should only be allowed by creator and / or admin
256
- export async function deleteCommunityEvent ( root , vars , ctx ) { }
252
+ export async function deleteCommunityEvent ( root , vars , ctx ) {
253
+ const { decoded } = verifyWebToken ( ctx ) ;
254
+ const { email } = decoded ;
255
+
256
+ if ( ! isString ( email ) || ! validator . isEmail ( email ) ) {
257
+ throw new TypeError ( 'You must provide a valid email' ) ;
258
+ }
259
+
260
+ // TODO: error handling
261
+ const user = await asyncErrorHandler (
262
+ UserModel . findOne ( { email : email } , '_id' ) . exec ( )
263
+ ) ;
264
+
265
+ if ( 'externalId' in vars ) {
266
+ if ( ! isString ( vars . externalId ) || ! validator . isUUID ( vars . externalId ) ) {
267
+ throw new TypeError ( 'Not a valid UUID' ) ;
268
+ }
269
+ }
270
+
271
+ const event = await CommunityEventModel . findOne ( {
272
+ externalId : vars . externalId
273
+ } ) . exec ( ) ;
274
+
275
+ if ( isEmpty ( event ) ) {
276
+ throw new Error ( 'Event not found' ) ;
277
+ }
278
+
279
+ if ( event . owner . externalId !== user . externalId ) {
280
+ throw new Error ( 'Only allowed to delete events you own' ) ;
281
+ }
282
+
283
+ const removedEvent = await CommunityEventModel . findOneAndRemove ( {
284
+ externalId : vars . externalId
285
+ } ) ;
286
+ if ( ! removedEvent ) {
287
+ throw new Error ( `No event with externalId ${ vars . externalId } ` ) ;
288
+ }
289
+ return removedEvent ;
290
+ }
0 commit comments