From 84010aedc06020055e0ab487e437b9f8e5a7a533 Mon Sep 17 00:00:00 2001 From: Dwayne Harris Date: Sat, 28 Sep 2019 21:23:23 -0400 Subject: [PATCH] WIP --- src/plugins/api/authentication.ts | 7 +-- src/plugins/api/groups.ts | 84 +++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/plugins/api/authentication.ts b/src/plugins/api/authentication.ts index bbea2b1..0e9ff67 100644 --- a/src/plugins/api/authentication.ts +++ b/src/plugins/api/authentication.ts @@ -105,8 +105,7 @@ function registerRoute(server: FastifyInstance({ ...invitation, - uses: invitation.uses + 1, + uses, + active: invitation.limit ? uses > invitation.limit : true, }) } } diff --git a/src/plugins/api/groups.ts b/src/plugins/api/groups.ts index 7226004..d8e47c4 100644 --- a/src/plugins/api/groups.ts +++ b/src/plugins/api/groups.ts @@ -721,6 +721,86 @@ function createInvitationRoute(server: FastifyInstance) { + interface Query { + continuation?: string + } + + const options: RouteShorthandOptions = { + schema: { + querystring: { + type: 'object', + properties: { + continuation: { type: 'string' }, + }, + }, + response: { + 200: { + type: 'object', + properties: { + invitations: { + type: 'array', + items: { + type: 'object', + properties: { + id: { type: 'string' }, + user: userSchema, + uses: { type: 'number' }, + expiration: { type: 'number' }, + limit: { type: 'number' }, + created: { type: 'number' }, + }, + }, + }, + continuation: { type: 'string' }, + }, + }, + 400: errorSchema, + }, + }, + } + + server.get('/api/group/:id/invitations', options, async (request, reply) => { + if (!server.database) return serverError(reply) + if (!request.viewer) return unauthorizedError(reply) + + const membership = await getUserMembership(server.database.client, request.viewer.id, request.log) + if (!membership || membership.membership !== GroupMembershipType.Admin) return unauthorizedError(reply) + + const container = containerFor(server.database.client, 'Groups') + + const group = await getItem({ container, id: request.params.id }) + if (!group) return notFoundError(reply) + + const { continuation } = request.query + + const { resources: invitations, requestCharge, continuation: newContinuation } = await container.items.query( + `SELECT * FROM Groups g WHERE + g.pk = '${group.id}' AND + g.t = '${GroupItemType.Invitation}' AND + g.expiration < GETCURRENTTIMESTAMP() AND + g.active = true ORDER BY g.created DESC`, + { + maxItemCount: 80, + continuation, + } + ).fetchAll() + + request.log.trace('Query: %d', requestCharge) + + const users = await getUsers(server.database.client, invitations.map(invitation => invitation.userId), request.log) + + return { + invitations: invitations.map(invitation => ({ + ...invitation, + user: users.find(user => user.id === invitation.userId), + userId: undefined, + })), + continuation: newContinuation, + } + }) +} + function logsRoute(server: FastifyInstance) { interface Query { continuation?: string @@ -743,6 +823,7 @@ function logsRoute(server: FastifyInstance log.userId), request.log) @@ -805,6 +888,7 @@ const plugin: Plugin = a listRoute(server) membersRoute(server) createInvitationRoute(server) + invitationsRoute(server) logsRoute(server) }