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
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