From c09c98f6b224679bc1dcb6253f5d0b1a19232c00 Mon Sep 17 00:00:00 2001 From: Mateusz Mitelski Date: Thu, 5 Mar 2020 20:36:41 +0100 Subject: [PATCH] Add forms/:formId/event endpoint (#2) --- src/api/EventsApi.ts | 2 +- src/api/FormSchemaApi.ts | 2 +- src/api/FormsApi.ts | 18 ++++++++++++++++++ src/api/ParticipantApi.ts | 2 +- src/common/utils.ts | 13 ++++++++++++- src/models/Event.ts | 17 ++++++++++++----- src/service/EventService.ts | 16 ++++++++++++---- src/service/ParticipiantService.ts | 15 ++++----------- 8 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 src/api/FormsApi.ts diff --git a/src/api/EventsApi.ts b/src/api/EventsApi.ts index 3d512a4..7bc774f 100644 --- a/src/api/EventsApi.ts +++ b/src/api/EventsApi.ts @@ -82,4 +82,4 @@ function _handleFile(request: AuthRequest): Promise { resolve() }) }) -} \ No newline at end of file +} diff --git a/src/api/FormSchemaApi.ts b/src/api/FormSchemaApi.ts index 931c00e..193a8b8 100644 --- a/src/api/FormSchemaApi.ts +++ b/src/api/FormSchemaApi.ts @@ -41,4 +41,4 @@ export class FormSchemaApi extends Controller { return await FormSchemaService.getPrivate(id) } -} \ No newline at end of file +} diff --git a/src/api/FormsApi.ts b/src/api/FormsApi.ts new file mode 100644 index 0000000..25dfa8b --- /dev/null +++ b/src/api/FormsApi.ts @@ -0,0 +1,18 @@ +import {Controller, Get, Route, Tags} from "tsoa" +import Response from "common/Response" +import {EventPublicDoc} from "models/Event" +import EventService from "service/EventService" + +@Route() +@Tags('Forms') +export class FormsApi extends Controller { + + /** + * Get public event by form id + * @param formId form id + */ + @Get('/forms/{formId}/event') + public async getPublicEvent(formId: string): Promise> { + return await EventService.findPublicByFormId(formId) + } +} diff --git a/src/api/ParticipantApi.ts b/src/api/ParticipantApi.ts index e719249..b8d8f3a 100644 --- a/src/api/ParticipantApi.ts +++ b/src/api/ParticipantApi.ts @@ -94,4 +94,4 @@ export class ParticipantApi extends Controller { return await ParticipiantService.remove(id, participantId, request.user) } -} \ No newline at end of file +} diff --git a/src/common/utils.ts b/src/common/utils.ts index 1bef76c..8535838 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -1,3 +1,6 @@ +import { EventModel } from "models/Event" +import Exception from "./Exception" + export function isObjectID(text: string): boolean { const regex = new RegExp('^[0-9a-fA-F]{24}$') return regex.test(text) @@ -7,4 +10,12 @@ export function byIdQuery(id: string): {_id: string} | {slug: string} { return isObjectID(id) ? { _id: id } : { slug: id } -} \ No newline at end of file +} + +export async function getEventIdFromFormId(formId: string): Promise { + const result = await EventModel.findOne({ + 'forms': formId + }) + if(!result) throw Exception.fromMessage(`Nie ma wydarzenia powiÄ…zanego z podanym formularzem: ${formId}`) + return result._id +} diff --git a/src/models/Event.ts b/src/models/Event.ts index 7e3500f..176bbdb 100644 --- a/src/models/Event.ts +++ b/src/models/Event.ts @@ -15,15 +15,22 @@ export interface EventRequest { usersEmails: string[]; } -export interface EventDoc extends Document{ - administrators: AdministratorDoc[]; - forms: string[]; +export interface EventPublicDoc extends Document{ name: string; - emailAlias: string; startDate: string; endDate: string; logo: string; - slug: string; +} + +export interface EventDoc extends Document{ + administrators: AdministratorDoc[]; + forms: string[]; + name: string; + emailAlias: string; + startDate: string; + endDate: string; + logo: string; + slug: string; } const EventSchema = new Schema( diff --git a/src/service/EventService.ts b/src/service/EventService.ts index 2821627..2d6b700 100644 --- a/src/service/EventService.ts +++ b/src/service/EventService.ts @@ -1,7 +1,7 @@ import fs from 'fs' -import {EventDoc, EventModel, EventRequest, EventUpdateRequest} from 'models/Event' +import {EventDoc, EventModel, EventRequest, EventUpdateRequest, EventPublicDoc} from 'models/Event' import Response from 'common/Response' -import {byIdQuery} from 'common/utils' +import {byIdQuery, getEventIdFromFormId} from 'common/utils' import UserService from './AdministratorService' import {logger} from 'common/logger' import {Administrator} from 'models/Administrator' @@ -92,10 +92,18 @@ async function findById(id: string): Promise> { return new Response(result) } +async function findPublicByFormId(formId: string): Promise> { + logger.info(`Fetching public event data for ${formId} form`) + const query = await getEventIdFromFormId(formId) + const result = await EventModel.findOne(query, 'name startDate endDate logo') + return new Response(result) +} + export default { add, remove, update, findAll, - findById -} \ No newline at end of file + findById, + findPublicByFormId, +} diff --git a/src/service/ParticipiantService.ts b/src/service/ParticipiantService.ts index 6b02c68..73f1609 100644 --- a/src/service/ParticipiantService.ts +++ b/src/service/ParticipiantService.ts @@ -8,6 +8,7 @@ import {Query} from 'models/Query' import clog, {CHANGE_TYPE} from 'service/ChangesLogerService' import {EventModel} from 'models/Event' import {TokenPayload} from 'google-auth-library' +import {getEventIdFromFormId} from 'common/utils' export enum ACCESS_TYPE { PRIVATE = 'private', @@ -56,7 +57,7 @@ async function add(formSlug: string, type: ACCESS_TYPE, data: Participiant): Pro async function edit(formSlug: string, query: Record, data: Record, user: TokenPayload): Promise> { const formModel = await _getModel(formSlug, ACCESS_TYPE.PRIVATE) - const eventId = await _getEventIdFromFormId(formSlug) + const eventId = await getEventIdFromFormId(formSlug) return clog.methodWithMultipleChangelog( formModel, eventId, @@ -77,7 +78,7 @@ async function edit(formSlug: string, query: Record, data: Recor async function editOne(formId: string, participantId: string, data: Record, user: TokenPayload): Promise> { const formModel = await _getModel(formId, ACCESS_TYPE.PRIVATE) - const eventId = await _getEventIdFromFormId(formId) + const eventId = await getEventIdFromFormId(formId) return clog.methodWithSingleChangelog( formModel, eventId, @@ -94,7 +95,7 @@ async function editOne(formId: string, participantId: string, data: Record> { const formModel = await _getModel(formId, ACCESS_TYPE.PRIVATE) - const eventId = await _getEventIdFromFormId(formId) + const eventId = await getEventIdFromFormId(formId) return clog.methodWithSingleChangelog( formModel, eventId, @@ -168,14 +169,6 @@ function _prepareFilters(query: Query): { [p: string]: { $in: string[] } | { $re }), {}) } -async function _getEventIdFromFormId(formId: string): Promise { - const result = await EventModel.findOne({ - 'forms': formId - }) - if(!result) throw Exception.fromMessage(`Nie ma wydarzenia powiÄ…zanego z podanym formularzem: ${formId}`) - return result._id -} - export default { add, remove,