From a263672e04c136fb2cfbd686adb2dd3f6052f23d Mon Sep 17 00:00:00 2001 From: dokicaaa Date: Sat, 9 May 2026 00:58:28 +0200 Subject: [PATCH] Automated events creation for submited event request --- .../content-types/event-request/schema.json | 10 ++++ .../controllers/event-request.ts | 52 ++++++++++++++++++- cms/src/api/event-request/controllers/form.ts | 18 +++++++ .../api/event-request/routes/event-request.ts | 16 ++++-- cms/src/index.ts | 50 ++++++++++++++++++ 5 files changed, 142 insertions(+), 4 deletions(-) diff --git a/cms/src/api/event-request/content-types/event-request/schema.json b/cms/src/api/event-request/content-types/event-request/schema.json index ce40fa7..2ed9e75 100644 --- a/cms/src/api/event-request/content-types/event-request/schema.json +++ b/cms/src/api/event-request/content-types/event-request/schema.json @@ -56,6 +56,16 @@ }, "physicalPresence": { "type": "boolean" + }, + "status": { + "type": "enumeration", + "enum": ["pending", "approved"], + "default": "pending" + }, + "event": { + "type": "relation", + "relation": "oneToOne", + "target": "api::event.event" } } } diff --git a/cms/src/api/event-request/controllers/event-request.ts b/cms/src/api/event-request/controllers/event-request.ts index 1dd3f47..f30461f 100644 --- a/cms/src/api/event-request/controllers/event-request.ts +++ b/cms/src/api/event-request/controllers/event-request.ts @@ -4,4 +4,54 @@ import { factories } from '@strapi/strapi' -export default factories.createCoreController('api::event-request.event-request'); +export default factories.createCoreController('api::event-request.event-request', ({ strapi }) => ({ + async approve(ctx) { + const { id } = ctx.params; + + const request: any = await strapi.documents('api::event-request.event-request').findOne({ + documentId: id, + populate: ['event' as any], + }); + + if (!request) { + return ctx.notFound('Event request not found'); + } + + if (!request.event) { + return ctx.badRequest('No linked draft event found'); + } + + if (request.status === 'approved') { + return ctx.badRequest('Event request already approved'); + } + + try { + await strapi.documents('api::event.event').publish({ + documentId: request.event.documentId, + }); + + await strapi.documents('api::event-request.event-request').update({ + documentId: id, + data: { status: 'approved' } as any, + }); + + await strapi.plugins['email'].services.email.send({ + to: request.initiatorEmail, + from: 'hello@42.mk', + replyTo: 'hello@42.mk', + subject: 'Your event has been approved! - 42.mk', + html: ` +

Great news! Your event request "${request.eventName}" has been approved and is now published.

+

You can view it on our platform.

+

Best regards,
42.mk Team

+ `, + }); + + ctx.body = { message: 'Event request approved' }; + } catch (error) { + strapi.log.error('Error approving event request:', error); + ctx.status = 500; + ctx.body = { error: { message: 'Failed to approve event request' } }; + } + }, +})); diff --git a/cms/src/api/event-request/controllers/form.ts b/cms/src/api/event-request/controllers/form.ts index 37d43e1..2588f24 100644 --- a/cms/src/api/event-request/controllers/form.ts +++ b/cms/src/api/event-request/controllers/form.ts @@ -52,6 +52,24 @@ export default { data: eventRequest, }); + const startDateTime = `${eventRequest.eventDate}T${eventRequest.eventStart}`; + + const draftEvent = await strapi.documents("api::event.event").create({ + data: { + title: eventRequest.eventName, + description: `${eventRequest.eventPurpose}\n\n${eventRequest.eventTheme}`, + start: startDateTime, + summary: eventRequest.eventAgenda, + tags: eventRequest.eventTheme ? [{ tagName: eventRequest.eventTheme }] : [], + }, + status: "draft", + }); + + await strapi.documents("api::event-request.event-request").update({ + documentId: res.documentId, + data: { event: draftEvent.documentId } as any, + }); + const requestCopy = `

Organizing entity: ${eventRequest.organizingEntity}

Initiator name: ${eventRequest.initiatorName}

Initiator email: ${eventRequest.initiatorEmail}

diff --git a/cms/src/api/event-request/routes/event-request.ts b/cms/src/api/event-request/routes/event-request.ts index 4582ebe..46da162 100644 --- a/cms/src/api/event-request/routes/event-request.ts +++ b/cms/src/api/event-request/routes/event-request.ts @@ -2,6 +2,16 @@ * event-request router */ -import { factories } from '@strapi/strapi'; - -export default factories.createCoreRouter('api::event-request.event-request'); +export default { + routes: [ + { + method: 'POST', + path: '/event-requests/:id/approve', + handler: 'event-request.approve', + config: { + policies: [], + middlewares: [], + }, + }, + ], +}; diff --git a/cms/src/index.ts b/cms/src/index.ts index 23b030e..5bef8d8 100644 --- a/cms/src/index.ts +++ b/cms/src/index.ts @@ -5,6 +5,55 @@ import { eventNotificationMiddleware } from './middlewares/event-notifications'; const FIREBASE_FCM_CREDENTIALS_PATH = './base42-mobile-app-fcm-firebase-adminsdk.json'; +const eventRequestApprovalMiddleware = () => { + return async (context, next) => { + if (context.uid !== 'api::event.event') { + return await next(); + } + + const result = await next(); + + if (context.action === 'publish' && result?.documentId) { + try { + const request = await strapi.db.query('api::event-request.event-request').findOne({ + where: { + event: { documentId: result.documentId }, + }, + }); + + if (request && request.status !== 'approved') { + await strapi.documents('api::event-request.event-request').update({ + documentId: request.documentId, + data: { status: 'approved' } as any, + }); + + const reqDetails = await strapi.db.query('api::event-request.event-request').findOne({ + where: { documentId: request.documentId }, + }); + + if (reqDetails?.initiatorEmail) { + await strapi.plugins['email'].services.email.send({ + to: reqDetails.initiatorEmail, + from: 'hello@42.mk', + replyTo: 'hello@42.mk', + subject: 'Your event has been approved! - 42.mk', + html: ` +

Great news! Your event request "${reqDetails.eventName}" has been approved and is now published.

+

You can view it on our platform.

+

Best regards,
42.mk Team

+ `, + }); + } + } + } catch (error) { + strapi.log.error('[Event Request Approval] Error syncing status after publish:', error); + } + } + + return result; + }; +}; + export default { /** * An asynchronous register function that runs before @@ -42,6 +91,7 @@ export default { }); strapi.documents.use(eventNotificationMiddleware()); + strapi.documents.use(eventRequestApprovalMiddleware()); }, /**