From 2d95131fcf398f63722a8a9fb2c0f4660401755d Mon Sep 17 00:00:00 2001 From: Max Weng <73797155+maxwn04@users.noreply.github.com> Date: Mon, 1 Apr 2024 13:38:20 -0700 Subject: [PATCH 1/6] factory changes and deletion in service --- api/controllers/EventController.ts | 9 +++++- services/EventService.ts | 16 +++++++++-- tests/controllers/ControllerFactory.ts | 5 ++-- tests/event.test.ts | 39 ++++++++++++++++++++------ 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/api/controllers/EventController.ts b/api/controllers/EventController.ts index ca9e2d2dd..f46e1ce45 100644 --- a/api/controllers/EventController.ts +++ b/api/controllers/EventController.ts @@ -8,6 +8,7 @@ import { UserModel } from '../../models/UserModel'; import PermissionsService from '../../services/PermissionsService'; import StorageService from '../../services/StorageService'; import AttendanceService from '../../services/AttendanceService'; +import { v4 as uuid } from 'uuid'; import { MediaType, File, @@ -27,6 +28,8 @@ import { CreateEventRequest, SubmitEventFeedbackRequest, } from '../validators/EventControllerRequests'; +import { EventModel } from 'models/EventModel'; +import { create, uniq } from 'underscore'; @JsonController('/event') export class EventController { @@ -120,9 +123,13 @@ export class EventController { @UseBefore(UserAuthentication) @Post() - async createEvent(@Body() createEventRequest: CreateEventRequest, + async createEvent(@UploadedFile('image', + { options: StorageService.getFileOptions(MediaType.EVENT_COVER) }) file: File, + @Body() createEventRequest: CreateEventRequest, @AuthenticatedUser() user: UserModel): Promise { if (!PermissionsService.canEditEvents(user)) throw new ForbiddenError(); + const uniqueFileName = uuid(); + createEventRequest.event.cover = await this.storageService.upload(file, MediaType.EVENT_COVER, uniqueFileName); const event = await this.eventService.create(createEventRequest.event); return { error: null, event }; } diff --git a/services/EventService.ts b/services/EventService.ts index 9994e080e..fb4e3419c 100644 --- a/services/EventService.ts +++ b/services/EventService.ts @@ -6,13 +6,17 @@ import { EventModel } from '../models/EventModel'; import { Uuid, PublicEvent, Event, EventSearchOptions } from '../types'; import Repositories, { TransactionsManager } from '../repositories'; import { UserError } from '../utils/Errors'; +import StorageService from './StorageService'; @Service() export default class EventService { private transactions: TransactionsManager; - constructor(@InjectManager() entityManager: EntityManager) { + private storageService: StorageService; + + constructor(@InjectManager() entityManager: EntityManager, storageService: StorageService) { this.transactions = new TransactionsManager(entityManager); + this.storageService = storageService; } /** @@ -25,8 +29,14 @@ export default class EventService { const eventCreated = await this.transactions.readWrite(async (txn) => { const eventRepository = Repositories.event(txn); const isUnusedAttendanceCode = await eventRepository.isUnusedAttendanceCode(event.attendanceCode); - if (!isUnusedAttendanceCode) throw new UserError('Attendance code has already been used'); - if (event.start > event.end) throw new UserError('Start date after end date'); + if (!isUnusedAttendanceCode) { + this.storageService.deleteAtUrl(event.cover); + throw new UserError('Attendance code has already been used'); + } + if (event.start > event.end) { + this.storageService.deleteAtUrl(event.cover); + throw new UserError('Start date after end date'); + } return eventRepository.upsertEvent(EventModel.create(event)); }); return eventCreated.getPublicEvent(); diff --git a/tests/controllers/ControllerFactory.ts b/tests/controllers/ControllerFactory.ts index 8d9932842..8d59a3cba 100644 --- a/tests/controllers/ControllerFactory.ts +++ b/tests/controllers/ControllerFactory.ts @@ -54,9 +54,8 @@ export class ControllerFactory { return new AuthController(userAccountService, userAuthService, emailService); } - public static event(conn: Connection): EventController { - const eventService = new EventService(conn.manager); - const storageService = new StorageService(); + public static event(conn: Connection, storageService = new StorageService()): EventController { + const eventService = new EventService(conn.manager, storageService); const attendanceService = new AttendanceService(conn.manager); return new EventController(eventService, storageService, attendanceService); } diff --git a/tests/event.test.ts b/tests/event.test.ts index ef1d64dd1..2c04bc648 100644 --- a/tests/event.test.ts +++ b/tests/event.test.ts @@ -1,10 +1,14 @@ import * as moment from 'moment'; import { ForbiddenError } from 'routing-controllers'; -import { UserAccessType } from '../types'; +import { MediaType, UserAccessType } from '../types'; import { ControllerFactory } from './controllers'; import { DatabaseConnection, EventFactory, PortalState, UserFactory } from './data'; import { CreateEventRequest } from '../api/validators/EventControllerRequests'; import { EventModel } from '../models/EventModel'; +import Mocks from './mocks/MockFactory'; +import { FileFactory } from './data/FileFactory'; +import { Config } from '../config'; +import { anything, verify } from 'ts-mockito'; beforeAll(async () => { await DatabaseConnection.connect(); @@ -20,6 +24,8 @@ afterAll(async () => { }); describe('event creation', () => { + const fileLocation = 'https://s3.amazonaws.com/event-cover.jpg'; + test('successful event creation', async () => { // setting up inputs const conn = await DatabaseConnection.get(); @@ -47,11 +53,13 @@ describe('event creation', () => { }; // creating the event - const eventController = ControllerFactory.event(conn); - const eventResponse = await eventController.createEvent(createEventRequest, admin); + const cover = FileFactory.image(Config.file.MAX_EVENT_COVER_FILE_SIZE / 2); + const storageService = Mocks.storage(fileLocation); + const eventController = ControllerFactory.event(conn, storageService); + const eventResponse = await eventController.createEvent(cover, createEventRequest, admin); // verifying response from event creation - expect(eventResponse.event.cover).toEqual(event.cover); + expect(eventResponse.event.cover).toEqual(fileLocation); expect(eventResponse.event.title).toEqual(event.title); expect(eventResponse.event.location).toEqual(event.location); expect(eventResponse.event.committee).toEqual(event.committee); @@ -59,6 +67,15 @@ describe('event creation', () => { expect(eventResponse.event.end).toEqual(event.end); expect(eventResponse.event.pointValue).toEqual(event.pointValue); + verify(storageService.deleteAtUrl(fileLocation)).never(); + verify( + storageService.upload( + cover, + MediaType.EVENT_COVER, + anything() + ), + ).called(); + // verifying response from event lookup const lookupEventResponse = await eventController.getOneEvent({ uuid: eventResponse.event.uuid }, user); expect(lookupEventResponse.error).toEqual(null); @@ -91,9 +108,12 @@ describe('event creation', () => { }; // verifying correct error - const eventController = ControllerFactory.event(conn); - await expect(eventController.createEvent(createEventRequest, user)) + const cover = FileFactory.image(Config.file.MAX_EVENT_COVER_FILE_SIZE / 2); + const storageService = Mocks.storage(fileLocation); + const eventController = ControllerFactory.event(conn, storageService); + await expect(eventController.createEvent(cover, createEventRequest, user)) .rejects.toThrow(ForbiddenError); + verify(storageService.deleteAtUrl(fileLocation)).called(); }); test('throws error when start date later than end date', async () => { @@ -122,9 +142,12 @@ describe('event creation', () => { }; // verifying correct error thrown - const eventController = ControllerFactory.event(conn); - await expect(eventController.createEvent(createEventRequest, admin)) + const cover = FileFactory.image(Config.file.MAX_EVENT_COVER_FILE_SIZE / 2); + const storageService = Mocks.storage(fileLocation); + const eventController = ControllerFactory.event(conn, storageService); + await expect(eventController.createEvent(cover, createEventRequest, admin)) .rejects.toThrow('Start date after end date'); + verify(storageService.deleteAtUrl(fileLocation)).called(); }); }); From c20cdf2f3e81477252d3043541029a09a6ef9564 Mon Sep 17 00:00:00 2001 From: Max Weng <73797155+maxwn04@users.noreply.github.com> Date: Tue, 2 Apr 2024 10:41:23 -0700 Subject: [PATCH 2/6] final fix --- api/controllers/EventController.ts | 5 +++-- services/EventService.ts | 2 ++ tests/event.test.ts | 9 ++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/api/controllers/EventController.ts b/api/controllers/EventController.ts index f46e1ce45..c0cdb0e29 100644 --- a/api/controllers/EventController.ts +++ b/api/controllers/EventController.ts @@ -128,8 +128,9 @@ export class EventController { @Body() createEventRequest: CreateEventRequest, @AuthenticatedUser() user: UserModel): Promise { if (!PermissionsService.canEditEvents(user)) throw new ForbiddenError(); - const uniqueFileName = uuid(); - createEventRequest.event.cover = await this.storageService.upload(file, MediaType.EVENT_COVER, uniqueFileName); + const fileName = file.originalname.substring(0, file.originalname.lastIndexOf('.'));; + createEventRequest.event.cover = await this.storageService.upload(file, MediaType.EVENT_COVER, fileName); + console.log(createEventRequest); const event = await this.eventService.create(createEventRequest.event); return { error: null, event }; } diff --git a/services/EventService.ts b/services/EventService.ts index fb4e3419c..917091282 100644 --- a/services/EventService.ts +++ b/services/EventService.ts @@ -29,6 +29,7 @@ export default class EventService { const eventCreated = await this.transactions.readWrite(async (txn) => { const eventRepository = Repositories.event(txn); const isUnusedAttendanceCode = await eventRepository.isUnusedAttendanceCode(event.attendanceCode); + // console.log(event.cover); if (!isUnusedAttendanceCode) { this.storageService.deleteAtUrl(event.cover); throw new UserError('Attendance code has already been used'); @@ -37,6 +38,7 @@ export default class EventService { this.storageService.deleteAtUrl(event.cover); throw new UserError('Start date after end date'); } + console.log("Here"); return eventRepository.upsertEvent(EventModel.create(event)); }); return eventCreated.getPublicEvent(); diff --git a/tests/event.test.ts b/tests/event.test.ts index 2c04bc648..fce37daa0 100644 --- a/tests/event.test.ts +++ b/tests/event.test.ts @@ -8,7 +8,7 @@ import { EventModel } from '../models/EventModel'; import Mocks from './mocks/MockFactory'; import { FileFactory } from './data/FileFactory'; import { Config } from '../config'; -import { anything, verify } from 'ts-mockito'; +import { anything, instance, verify } from 'ts-mockito'; beforeAll(async () => { await DatabaseConnection.connect(); @@ -55,7 +55,7 @@ describe('event creation', () => { // creating the event const cover = FileFactory.image(Config.file.MAX_EVENT_COVER_FILE_SIZE / 2); const storageService = Mocks.storage(fileLocation); - const eventController = ControllerFactory.event(conn, storageService); + const eventController = ControllerFactory.event(conn, instance(storageService)); const eventResponse = await eventController.createEvent(cover, createEventRequest, admin); // verifying response from event creation @@ -110,7 +110,7 @@ describe('event creation', () => { // verifying correct error const cover = FileFactory.image(Config.file.MAX_EVENT_COVER_FILE_SIZE / 2); const storageService = Mocks.storage(fileLocation); - const eventController = ControllerFactory.event(conn, storageService); + const eventController = ControllerFactory.event(conn, instance(storageService)); await expect(eventController.createEvent(cover, createEventRequest, user)) .rejects.toThrow(ForbiddenError); verify(storageService.deleteAtUrl(fileLocation)).called(); @@ -144,10 +144,9 @@ describe('event creation', () => { // verifying correct error thrown const cover = FileFactory.image(Config.file.MAX_EVENT_COVER_FILE_SIZE / 2); const storageService = Mocks.storage(fileLocation); - const eventController = ControllerFactory.event(conn, storageService); + const eventController = ControllerFactory.event(conn, instance(storageService)); await expect(eventController.createEvent(cover, createEventRequest, admin)) .rejects.toThrow('Start date after end date'); - verify(storageService.deleteAtUrl(fileLocation)).called(); }); }); From 44df26f827a319ec490e33a85dc1e5387978f249 Mon Sep 17 00:00:00 2001 From: Max Weng <73797155+maxwn04@users.noreply.github.com> Date: Tue, 2 Apr 2024 11:00:31 -0700 Subject: [PATCH 3/6] lint fix --- api/controllers/EventController.ts | 6 +----- services/EventService.ts | 2 -- tests/event.test.ts | 4 ++-- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/api/controllers/EventController.ts b/api/controllers/EventController.ts index c0cdb0e29..b9b21299e 100644 --- a/api/controllers/EventController.ts +++ b/api/controllers/EventController.ts @@ -8,7 +8,6 @@ import { UserModel } from '../../models/UserModel'; import PermissionsService from '../../services/PermissionsService'; import StorageService from '../../services/StorageService'; import AttendanceService from '../../services/AttendanceService'; -import { v4 as uuid } from 'uuid'; import { MediaType, File, @@ -28,8 +27,6 @@ import { CreateEventRequest, SubmitEventFeedbackRequest, } from '../validators/EventControllerRequests'; -import { EventModel } from 'models/EventModel'; -import { create, uniq } from 'underscore'; @JsonController('/event') export class EventController { @@ -128,9 +125,8 @@ export class EventController { @Body() createEventRequest: CreateEventRequest, @AuthenticatedUser() user: UserModel): Promise { if (!PermissionsService.canEditEvents(user)) throw new ForbiddenError(); - const fileName = file.originalname.substring(0, file.originalname.lastIndexOf('.'));; + const fileName = file.originalname.substring(0, file.originalname.lastIndexOf('.')); createEventRequest.event.cover = await this.storageService.upload(file, MediaType.EVENT_COVER, fileName); - console.log(createEventRequest); const event = await this.eventService.create(createEventRequest.event); return { error: null, event }; } diff --git a/services/EventService.ts b/services/EventService.ts index 917091282..fb4e3419c 100644 --- a/services/EventService.ts +++ b/services/EventService.ts @@ -29,7 +29,6 @@ export default class EventService { const eventCreated = await this.transactions.readWrite(async (txn) => { const eventRepository = Repositories.event(txn); const isUnusedAttendanceCode = await eventRepository.isUnusedAttendanceCode(event.attendanceCode); - // console.log(event.cover); if (!isUnusedAttendanceCode) { this.storageService.deleteAtUrl(event.cover); throw new UserError('Attendance code has already been used'); @@ -38,7 +37,6 @@ export default class EventService { this.storageService.deleteAtUrl(event.cover); throw new UserError('Start date after end date'); } - console.log("Here"); return eventRepository.upsertEvent(EventModel.create(event)); }); return eventCreated.getPublicEvent(); diff --git a/tests/event.test.ts b/tests/event.test.ts index fce37daa0..ee6a2d9e5 100644 --- a/tests/event.test.ts +++ b/tests/event.test.ts @@ -1,5 +1,6 @@ import * as moment from 'moment'; import { ForbiddenError } from 'routing-controllers'; +import { anything, instance, verify } from 'ts-mockito'; import { MediaType, UserAccessType } from '../types'; import { ControllerFactory } from './controllers'; import { DatabaseConnection, EventFactory, PortalState, UserFactory } from './data'; @@ -8,7 +9,6 @@ import { EventModel } from '../models/EventModel'; import Mocks from './mocks/MockFactory'; import { FileFactory } from './data/FileFactory'; import { Config } from '../config'; -import { anything, instance, verify } from 'ts-mockito'; beforeAll(async () => { await DatabaseConnection.connect(); @@ -72,7 +72,7 @@ describe('event creation', () => { storageService.upload( cover, MediaType.EVENT_COVER, - anything() + anything(), ), ).called(); From f93595a96cf0bf1bcd4805175af6ee740ef479e0 Mon Sep 17 00:00:00 2001 From: Max Weng <73797155+maxwn04@users.noreply.github.com> Date: Tue, 2 Apr 2024 11:12:21 -0700 Subject: [PATCH 4/6] merchOrder test fix --- tests/event.test.ts | 2 +- tests/merchOrder.test.ts | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/event.test.ts b/tests/event.test.ts index ee6a2d9e5..94a0e8afc 100644 --- a/tests/event.test.ts +++ b/tests/event.test.ts @@ -113,7 +113,6 @@ describe('event creation', () => { const eventController = ControllerFactory.event(conn, instance(storageService)); await expect(eventController.createEvent(cover, createEventRequest, user)) .rejects.toThrow(ForbiddenError); - verify(storageService.deleteAtUrl(fileLocation)).called(); }); test('throws error when start date later than end date', async () => { @@ -147,6 +146,7 @@ describe('event creation', () => { const eventController = ControllerFactory.event(conn, instance(storageService)); await expect(eventController.createEvent(cover, createEventRequest, admin)) .rejects.toThrow('Start date after end date'); + verify(storageService.deleteAtUrl(fileLocation)).called(); }); }); diff --git a/tests/merchOrder.test.ts b/tests/merchOrder.test.ts index f4fe09e72..44c4a274b 100644 --- a/tests/merchOrder.test.ts +++ b/tests/merchOrder.test.ts @@ -10,6 +10,9 @@ import { ControllerFactory } from './controllers'; import { DatabaseConnection, EventFactory, MerchFactory, PortalState, UserFactory } from './data'; import { MerchStoreControllerWrapper } from './controllers/MerchStoreControllerWrapper'; import { UserModel } from '../models/UserModel'; +import { FileFactory } from './data/FileFactory'; +import Mocks from './mocks/MockFactory'; +import { Config } from '../config'; beforeAll(async () => { await DatabaseConnection.connect(); @@ -902,6 +905,8 @@ describe('merch orders', () => { }); describe('merch order pickup events', () => { + const fileLocation = 'https://s3.amazonaws.com/event-cover.jpg'; + test('past, future, and individual pickup events can be retrieved', async () => { const conn = await DatabaseConnection.get(); const merchDistributor = UserFactory.fake({ accessType: UserAccessType.MERCH_STORE_DISTRIBUTOR }); @@ -972,8 +977,10 @@ describe('merch order pickup events', () => { const merchDistributor = UserFactory.fake({ accessType: UserAccessType.MERCH_STORE_DISTRIBUTOR }); const admin = UserFactory.fake({ accessType: UserAccessType.ADMIN }); const linkedEvent = EventFactory.fake(); - const eventController = ControllerFactory.event(conn); - await eventController.createEvent({ event: linkedEvent }, admin); + const cover = FileFactory.image(Config.file.MAX_EVENT_COVER_FILE_SIZE / 2); + const storageService = Mocks.storage(fileLocation); + const eventController = ControllerFactory.event(conn, instance(storageService)); + await eventController.createEvent(cover, { event: linkedEvent }, admin); const pickupEvent = MerchFactory.fakeFutureOrderPickupEvent({ linkedEvent }); @@ -996,7 +1003,7 @@ describe('merch order pickup events', () => { // edit a linked event const newLinkedEvent = EventFactory.fake(); - await eventController.createEvent({ event: newLinkedEvent }, admin); + await eventController.createEvent(cover, { event: newLinkedEvent }, admin); const editPickupEventRequest = { pickupEvent: { linkedEventUuid: newLinkedEvent.uuid } }; const params = { uuid: pickupEvent.uuid }; From bf23a5cf7230df285c9962b6cd69d559836ea971 Mon Sep 17 00:00:00 2001 From: Marcelo Shen Date: Wed, 22 May 2024 15:52:29 -0700 Subject: [PATCH 5/6] removed unusable api body --- api/validators/EventControllerRequests.ts | 4 ++-- models/EventModel.ts | 3 +++ types/ApiRequests.ts | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/api/validators/EventControllerRequests.ts b/api/validators/EventControllerRequests.ts index 64e7a57d1..1e6fc6191 100644 --- a/api/validators/EventControllerRequests.ts +++ b/api/validators/EventControllerRequests.ts @@ -31,8 +31,8 @@ export class OptionalEventProperties implements IOptionalEventProperties { } export class Event extends OptionalEventProperties implements IEvent { - @IsNotEmpty() - cover: string; + // @IsNotEmpty() + // cover: string; @IsNotEmpty() title: string; diff --git a/models/EventModel.ts b/models/EventModel.ts index e4a5f40fb..348081581 100644 --- a/models/EventModel.ts +++ b/models/EventModel.ts @@ -49,6 +49,9 @@ export class EventModel extends BaseEntity { @Column('integer') pointValue: number; + @Column('boolean', { default: true }) + published: boolean; + @Column('boolean', { default: false }) deleted: boolean; diff --git a/types/ApiRequests.ts b/types/ApiRequests.ts index 87a6b6dc6..dc8c542b0 100644 --- a/types/ApiRequests.ts +++ b/types/ApiRequests.ts @@ -158,7 +158,7 @@ export interface OptionalEventProperties { } export interface Event extends OptionalEventProperties { - cover: string; + // cover: string; title: string; description: string; location: string; From 5af07722e87ec0a47ac50f50614b7db64c35da72 Mon Sep 17 00:00:00 2001 From: Marcelo Shen Date: Wed, 22 May 2024 16:52:05 -0700 Subject: [PATCH 6/6] added migrations --- api/controllers/EventController.ts | 8 +++----- api/validators/EventControllerRequests.ts | 7 +++++-- migrations/0044-add-event-drafting.ts | 22 ++++++++++++++++++++++ models/EventModel.ts | 2 +- services/EventService.ts | 6 +++--- types/ApiRequests.ts | 2 +- 6 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 migrations/0044-add-event-drafting.ts diff --git a/api/controllers/EventController.ts b/api/controllers/EventController.ts index b9b21299e..ad8118293 100644 --- a/api/controllers/EventController.ts +++ b/api/controllers/EventController.ts @@ -120,13 +120,11 @@ export class EventController { @UseBefore(UserAuthentication) @Post() - async createEvent(@UploadedFile('image', - { options: StorageService.getFileOptions(MediaType.EVENT_COVER) }) file: File, - @Body() createEventRequest: CreateEventRequest, + async createEvent(@Body() createEventRequest: CreateEventRequest, @AuthenticatedUser() user: UserModel): Promise { if (!PermissionsService.canEditEvents(user)) throw new ForbiddenError(); - const fileName = file.originalname.substring(0, file.originalname.lastIndexOf('.')); - createEventRequest.event.cover = await this.storageService.upload(file, MediaType.EVENT_COVER, fileName); + // const fileName = file.originalname.substring(0, file.originalname.lastIndexOf('.')); + // createEventRequest.event.cover = await this.storageService.upload(file, MediaType.EVENT_COVER, fileName); const event = await this.eventService.create(createEventRequest.event); return { error: null, event }; } diff --git a/api/validators/EventControllerRequests.ts b/api/validators/EventControllerRequests.ts index 1e6fc6191..092d33165 100644 --- a/api/validators/EventControllerRequests.ts +++ b/api/validators/EventControllerRequests.ts @@ -59,8 +59,8 @@ export class Event extends OptionalEventProperties implements IEvent { } export class EventPatches extends OptionalEventProperties implements IEvent { - @IsNotEmpty() - cover: string; + // @IsNotEmpty() + // cover: string; @IsNotEmpty() title: string; @@ -82,6 +82,9 @@ export class EventPatches extends OptionalEventProperties implements IEvent { @Allow() pointValue: number; + + @Allow() + published?: boolean; } export class EventSearchOptions implements IEventSearchOptions { diff --git a/migrations/0044-add-event-drafting.ts b/migrations/0044-add-event-drafting.ts new file mode 100644 index 000000000..38c7db05f --- /dev/null +++ b/migrations/0044-add-event-drafting.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; + +const TABLE_NAME = 'Events'; + +export class AddEventDrafting1716419261341 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.addColumn( + TABLE_NAME, + new TableColumn({ + name: 'published', + type: 'boolean', + default: true, // default to true for backward compadibility + }), + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.dropColumn(TABLE_NAME, 'published'); + } + +} diff --git a/models/EventModel.ts b/models/EventModel.ts index 348081581..edd475051 100644 --- a/models/EventModel.ts +++ b/models/EventModel.ts @@ -49,7 +49,7 @@ export class EventModel extends BaseEntity { @Column('integer') pointValue: number; - @Column('boolean', { default: true }) + @Column('boolean', { default: true }) // default to true for backward compadibility published: boolean; @Column('boolean', { default: false }) diff --git a/services/EventService.ts b/services/EventService.ts index fb4e3419c..5580bace1 100644 --- a/services/EventService.ts +++ b/services/EventService.ts @@ -30,14 +30,14 @@ export default class EventService { const eventRepository = Repositories.event(txn); const isUnusedAttendanceCode = await eventRepository.isUnusedAttendanceCode(event.attendanceCode); if (!isUnusedAttendanceCode) { - this.storageService.deleteAtUrl(event.cover); + // this.storageService.deleteAtUrl(event.cover); throw new UserError('Attendance code has already been used'); } if (event.start > event.end) { - this.storageService.deleteAtUrl(event.cover); + // this.storageService.deleteAtUrl(event.cover); throw new UserError('Start date after end date'); } - return eventRepository.upsertEvent(EventModel.create(event)); + return eventRepository.upsertEvent(EventModel.create({ ...event, published: false })); }); return eventCreated.getPublicEvent(); } diff --git a/types/ApiRequests.ts b/types/ApiRequests.ts index dc8c542b0..ecbb1ff9e 100644 --- a/types/ApiRequests.ts +++ b/types/ApiRequests.ts @@ -158,7 +158,7 @@ export interface OptionalEventProperties { } export interface Event extends OptionalEventProperties { - // cover: string; + cover?: string; title: string; description: string; location: string;