From 4eb9742d3e15c561b38878bfb38397c69ceb0489 Mon Sep 17 00:00:00 2001 From: arpitnath Date: Thu, 24 Aug 2023 04:13:43 +0530 Subject: [PATCH] update/refactor: new event flow for builder events --- frontend/src/Editor/Box.jsx | 8 +- frontend/src/Editor/EditorFunc.jsx | 3 +- .../Inspector/Components/DefaultComponent.jsx | 5 +- .../src/Editor/Inspector/Components/Form.jsx | 5 +- .../src/Editor/Inspector/Components/Icon.jsx | 5 +- .../Inspector/Components/Table/Table.jsx | 15 ++- .../src/Editor/Inspector/EventManager.jsx | 101 ++++++++++++------ frontend/src/Editor/Inspector/Inspector.jsx | 66 ++++++------ .../SidebarPageSelector/SettingsModal.jsx | 5 +- .../Components/QueryManagerBody.jsx | 5 +- frontend/src/_helpers/appUtils.js | 34 +++--- frontend/src/_services/appVersion.service.js | 42 ++++++++ frontend/src/_stores/appDataStore.js | 56 +++++++++- server/src/controllers/apps.controller.v2.ts | 25 ++++- server/src/services/events_handler.service.ts | 76 ++++++++----- 15 files changed, 319 insertions(+), 132 deletions(-) diff --git a/frontend/src/Editor/Box.jsx b/frontend/src/Editor/Box.jsx index 03cb1e9f24..308a0f34ab 100644 --- a/frontend/src/Editor/Box.jsx +++ b/frontend/src/Editor/Box.jsx @@ -67,6 +67,7 @@ import _ from 'lodash'; import { EditorContext } from '@/Editor/Context/EditorContextWrapper'; import { useTranslation } from 'react-i18next'; import { useCurrentState } from '@/_stores/currentStateStore'; +import { useAppInfo } from '@/_stores/appDataStore'; const AllComponents = { Button, @@ -163,6 +164,8 @@ export const Box = function Box({ }; } + const { events } = useAppInfo(); + const componentMeta = useMemo(() => { return componentTypes.find((comp) => component.component === comp.component); }, [component]); @@ -258,7 +261,10 @@ export const Box = function Box({ if (mode === 'edit' && eventName === 'onClick') { onComponentClick(id, component); } - onEvent(eventName, { ...options, customVariables: { ...customResolvables }, component }); + + const componentEvents = events.filter((event) => event.sourceId === id); + + onEvent(eventName, componentEvents, { ...options, customVariables: { ...customResolvables } }); }; const validate = (value) => validateWidget({ diff --git a/frontend/src/Editor/EditorFunc.jsx b/frontend/src/Editor/EditorFunc.jsx index 69bfcb054d..e19d98c980 100644 --- a/frontend/src/Editor/EditorFunc.jsx +++ b/frontend/src/Editor/EditorFunc.jsx @@ -494,7 +494,7 @@ const EditorComponent = (props) => { }; //! Needs attention - const handleEvent = (eventName, options) => onEvent(editorRef, eventName, options, 'edit'); + const handleEvent = (eventName, event, options) => onEvent(editorRef, eventName, event, options, 'edit'); const handleRunQuery = (queryId, queryName) => runQuery(editorRef, queryId, queryName); @@ -649,6 +649,7 @@ const EditorComponent = (props) => { userId: data?.user_id, appId: data?.id, events: data.events, + currentVersionId: data?.editing_version?.id, }); await fetchDataSources(data.editing_version?.id); diff --git a/frontend/src/Editor/Inspector/Components/DefaultComponent.jsx b/frontend/src/Editor/Inspector/Components/DefaultComponent.jsx index b0c9cf0199..d61d01213d 100644 --- a/frontend/src/Editor/Inspector/Components/DefaultComponent.jsx +++ b/frontend/src/Editor/Inspector/Components/DefaultComponent.jsx @@ -98,8 +98,9 @@ export const baseComponentProperties = ( isOpen: true, children: ( component.component.definition.events || []); + const { updateAppVersionEventHandlers, createAppVersionEventHandlers, deleteAppVersionEventHandler } = + useAppDataActions(); + + const currentEvents = allAppEvents.filter((event) => event.sourceId === sourceId); + console.log('----arpit currentEvents ', { currentEvents }); + + const [events, setEvents] = useState([]); const [focusedEventIndex, setFocusedEventIndex] = useState(null); const { t } = useTranslation(); useEffect(() => { - setEvents(component.component.definition.events || []); - }, [component?.component?.definition?.events]); + console.log('----arpit current events changed ', { currentEvents, events }); + if (_.isEqual(currentEvents, events)) return; + + setEvents(currentEvents || []); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [JSON.stringify(currentEvents)]); let actionOptions = ActionTypes.map((action) => { return { name: action.name, value: action.id }; @@ -102,11 +115,11 @@ export const EventManager = ({ excludeEvents = excludeEvents || []; /* Filter events based on excludesEvents ( a list of event ids to exclude ) */ - let possibleEvents = Object.keys(componentMeta.events) + let possibleEvents = Object.keys(eventMetaDefinition.events) .filter((eventId) => !excludeEvents.includes(eventId)) .map((eventId) => { return { - name: componentMeta.events[eventId].displayName, + name: eventMetaDefinition?.events[eventId]?.displayName, value: eventId, }; }); @@ -153,7 +166,7 @@ export const EventManager = ({ const actions = targetComponentMeta.actions; const options = actions.map((action) => ({ - name: action.displayName, + name: action?.displayName, value: action.handle, })); @@ -202,36 +215,53 @@ export const EventManager = ({ } function handlerChanged(index, param, value) { - let newEvents = [...events]; + let newEvents = _.cloneDeep(events); let updatedEvent = newEvents[index]; - updatedEvent[param] = value; + updatedEvent.event[param] = value; newEvents[index] = updatedEvent; + const diffPatches = diff(currentEvents[index], updatedEvent); + const isDeepEqual = _.isEqual(currentEvents[index], updatedEvent); setEvents(newEvents); - eventsChanged(newEvents); + + console.log('----moh handler changed-arpit ', { diffPatches, isDeepEqual }); + + updateAppVersionEventHandlers( + [ + { + event_id: updatedEvent.id, + diff: diffPatches, + }, + ], + 'update' + ); } function removeHandler(index) { - let newEvents = component.component.definition.events; - newEvents.splice(index, 1); - setEvents(newEvents); - eventsChanged(newEvents); + const eventsHandler = _.cloneDeep(events); + + const eventId = eventsHandler[index].id; + + deleteAppVersionEventHandler(eventId); } function addHandler() { - let newEvents = component.component.definition.events; + let newEvents = events; const eventIndex = newEvents.length; - newEvents.push({ - eventId: Object.keys(componentMeta.events)[0], - actionId: 'show-alert', - message: 'Hello world!', - alertType: 'info', - eventIndex: eventIndex, + + createAppVersionEventHandlers({ + event: { + eventId: Object.keys(eventMetaDefinition?.events)[0], + actionId: 'show-alert', + message: 'Hello world!', + alertType: 'info', + eventIndex: eventIndex, + }, + eventType: eventSourceType, + attachedTo: sourceId, }); - setEvents(newEvents); - eventsChanged(newEvents, false, true); } //following two are functions responsible for on change and value for the control specific actions @@ -722,8 +752,8 @@ export const EventManager = ({ event?.componentSpecificActionHandle && (getAction(event?.componentId, event?.componentSpecificActionHandle).params ?? []).map((param) => (
-
- {param.displayName} +
+ {param?.displayName}
{param.type === 'select' ? (
@@ -758,7 +788,7 @@ export const EventManager = ({ enablePreview={true} type={param?.type} fieldMeta={{ options: param?.options }} - cyLabel={param.displayName} + cyLabel={param?.displayName} />
)} @@ -784,7 +814,7 @@ export const EventManager = ({ } const reorderEvents = (startIndex, endIndex) => { - const result = [...component.component.definition.events]; + const result = _.cloneDeep(events); const [removed] = result.splice(startIndex, 1); result.splice(endIndex, 0, removed); setEvents(result); @@ -812,7 +842,8 @@ export const EventManager = ({ {({ innerRef, droppableProps, placeholder }) => (
{events.map((event, index) => { - const actionMeta = ActionTypes.find((action) => action.id === event.actionId); + const actionMeta = ActionTypes.find((action) => action.id === event.event.actionId); + const rowClassName = `card-body p-0 ${focusedEventIndex === index ? ' bg-azure-lt' : ''}`; return ( @@ -826,7 +857,7 @@ export const EventManager = ({ trigger="click" placement={popoverPlacement || 'left'} rootClose={true} - overlay={eventPopover(event, index)} + overlay={eventPopover(event.event, index)} onHide={() => setFocusedEventIndex(null)} onToggle={(showing) => { if (showing) { @@ -888,7 +919,7 @@ export const EventManager = ({
- {componentMeta.events[event.eventId]['displayName']} + {eventMetaDefinition?.events[event.event.eventId]?.displayName}
@@ -956,7 +987,7 @@ export const EventManager = ({ ); }; - const componentName = componentMeta.name ? componentMeta.name : 'query'; + const componentName = eventMetaDefinition?.name ? eventMetaDefinition.name : 'query'; if (events.length === 0) { return ( diff --git a/frontend/src/Editor/Inspector/Inspector.jsx b/frontend/src/Editor/Inspector/Inspector.jsx index 765f6fdd35..40de8505d0 100644 --- a/frontend/src/Editor/Inspector/Inspector.jsx +++ b/frontend/src/Editor/Inspector/Inspector.jsx @@ -196,49 +196,49 @@ export const Inspector = ({ } } - function eventUpdated(event, actionId) { - let newDefinition = JSON.parse(JSON.stringify(component.component.definition)); - newDefinition.events[event.name] = { actionId }; + // function eventUpdated(event, actionId) { + // let newDefinition = JSON.parse(JSON.stringify(component.component.definition)); + // newDefinition.events[event.name] = { actionId }; - let newComponent = { - ...component, - }; + // let newComponent = { + // ...component, + // }; - componentDefinitionChanged(newComponent, { eventUpdated: true }); - } + // // componentDefinitionChanged(newComponent, { eventUpdated: true }); + // } - function eventsChanged(newEvents, isReordered = false, isNew = false) { - let newComponent = JSON.parse(JSON.stringify(component)); - let newDefinition = JSON.parse(JSON.stringify(newComponent.component.definition)); + // function eventsChanged(newEvents, isReordered = false, isNew = false) { + // let newComponent = JSON.parse(JSON.stringify(component)); + // let newDefinition = JSON.parse(JSON.stringify(newComponent.component.definition)); - newDefinition.events = newEvents; + // newDefinition.events = newEvents; - newComponent.component.definition = newDefinition; + // newComponent.component.definition = newDefinition; - const opts = { - componentsEventsChanged: true, - }; + // // const opts = { + // // componentsEventsChanged: true, + // // }; - if (isReordered) opts.eventsReOrdered = true; - if (isNew) opts.newEvent = true; + // // if (isReordered) opts.eventsReOrdered = true; + // // if (isNew) opts.newEvent = true; - componentDefinitionChanged(newComponent, opts); - } + // // componentDefinitionChanged(newComponent, opts); + // } - function eventOptionUpdated(event, option, value) { - console.log('eventOptionUpdated', event, option, value); + // function eventOptionUpdated(event, option, value) { + // console.log('eventOptionUpdated--moh', event, option, value); - let newDefinition = JSON.parse(JSON.stringify(component.component.definition)); - let eventDefinition = newDefinition.events[event.name] || { options: {} }; + // let newDefinition = JSON.parse(JSON.stringify(component.component.definition)); + // let eventDefinition = newDefinition.events[event.name] || { options: {} }; - newDefinition.events[event.name] = { ...eventDefinition, options: { ...eventDefinition.options, [option]: value } }; + // newDefinition.events[event.name] = { ...eventDefinition, options: { ...eventDefinition.options, [option]: value } }; - let newComponent = { - ...component, - }; + // let newComponent = { + // ...component, + // }; - componentDefinitionChanged(newComponent, { eventOptionUpdated: true }); - } + // componentDefinitionChanged(newComponent, { eventOptionUpdated: true }); + // } const buildGeneralStyle = () => { const items = []; @@ -273,12 +273,12 @@ export const Inspector = ({ paramUpdated={paramUpdated} dataQueries={dataQueries} componentMeta={componentMeta} - eventUpdated={eventUpdated} - eventOptionUpdated={eventOptionUpdated} + // eventUpdated={eventUpdated} + // eventOptionUpdated={eventOptionUpdated} components={allComponents} currentState={currentState} darkMode={darkMode} - eventsChanged={eventsChanged} + // eventsChanged={eventsChanged} pages={pages} allComponents={allComponents} /> diff --git a/frontend/src/Editor/LeftSidebar/SidebarPageSelector/SettingsModal.jsx b/frontend/src/Editor/LeftSidebar/SidebarPageSelector/SettingsModal.jsx index b0edf606ab..214a4d12c9 100644 --- a/frontend/src/Editor/LeftSidebar/SidebarPageSelector/SettingsModal.jsx +++ b/frontend/src/Editor/LeftSidebar/SidebarPageSelector/SettingsModal.jsx @@ -55,6 +55,7 @@ export const SettingsModal = ({ pinPagesPopover(true)}> Events {t('editor.queryManager.eventsHandler', 'Events')}
event.eventId === eventId); +export async function executeActionsForEventId(_ref, eventId, events = [], mode, customVariables) { + const filteredEvents = events.filter((event) => event?.event.eventId === eventId); for (const event of filteredEvents) { - await executeAction(_ref, event, mode, customVariables); // skipcq: JS-0032 + await executeAction(_ref, event.event, mode, customVariables); // skipcq: JS-0032 } } @@ -584,12 +583,12 @@ function executeActionWithDebounce(_ref, event, mode, customVariables) { } } -export async function onEvent(_ref, eventName, options, mode = 'edit') { +export async function onEvent(_ref, eventName, events, options = {}, mode = 'edit') { let _self = _ref; const { customVariables } = options; if (eventName === 'onPageLoad') { - await executeActionsForEventId(_ref, 'onPageLoad', { definition: { events: [options] } }, mode, customVariables); + await executeActionsForEventId(_ref, 'onPageLoad', events, mode, customVariables); } if (eventName === 'onTrigger') { @@ -616,7 +615,7 @@ export async function onEvent(_ref, eventName, options, mode = 'edit') { }, }, }); - executeActionsForEventId(_ref, 'onCalendarEventSelect', component, mode, customVariables); + executeActionsForEventId(_ref, 'onCalendarEventSelect', events, mode, customVariables); } if (eventName === 'onCalendarSlotSelect') { @@ -630,7 +629,7 @@ export async function onEvent(_ref, eventName, options, mode = 'edit') { }, }, }); - executeActionsForEventId(_ref, 'onCalendarSlotSelect', component, mode, customVariables); + executeActionsForEventId(_ref, 'onCalendarSlotSelect', events, mode, customVariables); } if (eventName === 'onTableActionButtonClicked') { @@ -734,18 +733,15 @@ export async function onEvent(_ref, eventName, options, mode = 'edit') { 'onNewRowsAdded', ].includes(eventName) ) { - const { component } = options; - executeActionsForEventId(_ref, eventName, component, mode, customVariables); + executeActionsForEventId(_ref, eventName, events, mode, customVariables); } if (eventName === 'onBulkUpdate') { - onComponentOptionChanged(options.component, 'isSavingChanges', true); - await executeActionsForEventId(_self, eventName, options.component, mode, customVariables); - onComponentOptionChanged(options.component, 'isSavingChanges', false); + await executeActionsForEventId(_self, eventName, events, mode, customVariables); } if (['onDataQuerySuccess', 'onDataQueryFailure'].includes(eventName)) { - await executeActionsForEventId(_self, eventName, options, mode, customVariables); + await executeActionsForEventId(_self, eventName, events, mode, customVariables); } } @@ -1007,9 +1003,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode = }, }); resolve(data); - onEvent(_self, 'onDataQueryFailure', { - definition: { events: dataQuery.options.events }, - }); + onEvent(_self, 'onDataQueryFailure', dataQuery.options.events); if (mode !== 'view') { const err = query.kind == 'tooljetdb' ? data?.error || data : _.isEmpty(data.data) ? data : data.data; toast.error(err?.message); @@ -1047,9 +1041,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode = }, }); resolve(finalData); - onEvent(_self, 'onDataQueryFailure', { - definition: { events: dataQuery.options.events }, - }); + onEvent(_self, 'onDataQueryFailure', dataQuery.options.events); return; } } @@ -1088,7 +1080,7 @@ export function runQuery(_ref, queryId, queryName, confirmed = undefined, mode = }, }); resolve({ status: 'ok', data: finalData }); - onEvent(_self, 'onDataQuerySuccess', { definition: { events: dataQuery.options.events } }, mode); + onEvent(_self, 'onDataQuerySuccess', dataQuery.options.events, mode); } }) .catch(({ error }) => { diff --git a/frontend/src/_services/appVersion.service.js b/frontend/src/_services/appVersion.service.js index d9e97f0ac0..c599f6bb66 100644 --- a/frontend/src/_services/appVersion.service.js +++ b/frontend/src/_services/appVersion.service.js @@ -8,6 +8,9 @@ export const appVersionService = { del, save, autoSaveApp, + saveAppVersionEventHandlers, + createAppVersionEventHandler, + deleteAppVersionEventHandler, }; function getAll(appId) { @@ -99,3 +102,42 @@ function autoSaveApp(appId, versionId, diff, type, pageId, operation, isUserSwit return fetch(url, requestOptions).then(handleResponse); } + +function saveAppVersionEventHandlers(appId, versionId, events) { + const body = { + events, + }; + + const requestOptions = { + method: 'PUT', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify(body), + }; + return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events`, requestOptions).then(handleResponse); +} + +function createAppVersionEventHandler(appId, versionId, event) { + const body = { + event, + }; + + const requestOptions = { + method: 'POST', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify(body), + }; + return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events`, requestOptions).then(handleResponse); +} + +function deleteAppVersionEventHandler(appId, versionId, eventId) { + const requestOptions = { + method: 'DELETE', + headers: authHeader(), + credentials: 'include', + }; + return fetch(`${config.apiUrl}/v2/apps/${appId}/versions/${versionId}/events/${eventId}`, requestOptions).then( + handleResponse + ); +} diff --git a/frontend/src/_stores/appDataStore.js b/frontend/src/_stores/appDataStore.js index dfae050fb1..b7fb02ab80 100644 --- a/frontend/src/_stores/appDataStore.js +++ b/frontend/src/_stores/appDataStore.js @@ -26,7 +26,7 @@ const initialState = { export const useAppDataStore = create( zustandDevTools( - (set) => ({ + (set, get) => ({ ...initialState, actions: { updateEditingVersion: (version) => set(() => ({ editingVersion: version })), @@ -44,6 +44,54 @@ export const useAppDataStore = create( isUserSwitchedVersion ); }, + updateAppVersionEventHandlers: async (events) => { + const appId = get().appId; + const versionId = get().currentVersionId; + + const response = await appVersionService.saveAppVersionEventHandlers(appId, versionId, events); + + const updatedEvents = get().events; + + updatedEvents.forEach((e, index) => { + if (e.id === response[index].id) { + updatedEvents[index] = response[index]; + } + }); + + console.log('----arpit should update events store', { updatedEvents, response }); + + set(() => ({ events: updatedEvents })); + }, + + createAppVersionEventHandlers: async (event) => { + const appId = get().appId; + const versionId = get().currentVersionId; + + const updatedEvents = get().events; + const response = await appVersionService.createAppVersionEventHandler(appId, versionId, event); + updatedEvents.push(response); + + set(() => ({ events: updatedEvents })); + }, + + deleteAppVersionEventHandler: async (eventId) => { + const appId = get().appId; + const versionId = get().currentVersionId; + + const updatedEvents = get().events; + + const response = await appVersionService.deleteAppVersionEventHandler(appId, versionId, eventId); + + if (response?.affected === 1) { + updatedEvents.splice( + updatedEvents.findIndex((e) => e.id === eventId), + 1 + ); + + set(() => ({ events: updatedEvents })); + } + }, + setIsSaving: (isSaving) => set(() => ({ isSaving })), setAppId: (appId) => set(() => ({ appId })), }, @@ -58,3 +106,9 @@ export const useUpdateEditingVersion = () => useAppDataStore((state) => state.ac export const useCurrentUser = () => useAppDataStore((state) => state.currentUser); export const useAppInfo = () => useAppDataStore((state) => state); export const useAppDataActions = () => useAppDataStore((state) => state.actions); + +// if (operation === 'delete') { +// const response = await appVersionService.deleteAppVersionEventHandler(appId, versionId, eventId); +// const updatedEvents = get().events.filter((e) => e.id !== response.id); +// set(() => ({ events: updatedEvents })); +// } diff --git a/server/src/controllers/apps.controller.v2.ts b/server/src/controllers/apps.controller.v2.ts index a7c187e0a0..8562e17990 100644 --- a/server/src/controllers/apps.controller.v2.ts +++ b/server/src/controllers/apps.controller.v2.ts @@ -327,7 +327,9 @@ export class AppsControllerV2 { throw new ForbiddenException('You do not have permissions to perform this action'); } - return this.eventService.createEvent(body, versionId); + const { event } = body; + + return this.eventService.createEvent(event, versionId); } @UseGuards(JwtAuthGuard) @UseInterceptors(ValidAppInterceptor) @@ -345,8 +347,25 @@ export class AppsControllerV2 { throw new ForbiddenException('You do not have permissions to perform this action'); } - console.log('-----arpit update events', { body }); + return await this.eventService.updateEvent(body?.events); + } - // return await this.eventService.updateEvent(body, versionId); + @UseGuards(JwtAuthGuard) + @UseInterceptors(ValidAppInterceptor) + @Delete(':id/versions/:versionId/events/:eventId') + async deleteEvents(@User() user, @Param('id') id, @Param('versionId') versionId, @Param('eventId') eventId) { + const version = await this.appsService.findVersion(versionId); + const app = version.app; + + if (app.id !== id) { + throw new BadRequestException(); + } + const ability = await this.appsAbilityFactory.appsActions(user, id); + + if (!ability.can('updateVersions', app)) { + throw new ForbiddenException('You do not have permissions to perform this action'); + } + + return await this.eventService.deleteEvent(eventId); } } diff --git a/server/src/services/events_handler.service.ts b/server/src/services/events_handler.service.ts index 49bb26ee6b..c780e63c86 100644 --- a/server/src/services/events_handler.service.ts +++ b/server/src/services/events_handler.service.ts @@ -1,4 +1,4 @@ -import { BadRequestException, Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { EntityManager, Repository } from 'typeorm'; import { Component } from 'src/entities/component.entity'; @@ -42,46 +42,70 @@ export class EventsService { }); } - async createEvent(options, versionId) { - if (Object.keys(options).length === 0) { + async createEvent(eventObj, versionId) { + if (Object.keys(eventObj).length === 0) { return new BadRequestException('No event found'); } const newEvent = { - name: options.event.eventId, - sourceId: options.attachedTo, - target: options.eventType, - event: options.event, + name: eventObj.event.eventId, + sourceId: eventObj.attachedTo, + target: eventObj.eventType, + event: eventObj.event, appVersionId: versionId, }; - console.log('---arpit || create events', { newEvent }); - return await dbTransactionWrap(async (manager: EntityManager) => { const event = await manager.save(EventHandler, newEvent); return event; }); } - async updateEvent(options = [], versionId: string) { - const eventHandlers = []; + async updateEvent(events: []) { + return await dbTransactionWrap(async (manager: EntityManager) => { + return await Promise.all( + events.map(async (event) => { + const { event_id, diff } = event as any; - options.forEach((option) => { - eventHandlers.push({ - event: option.event, - name: option.event.eventId, - sourceId: option.attachedTo, - target: option.eventType, - }); + const eventDiff = diff?.event; + const eventToUpdate = await manager.findOne(EventHandler, { + where: { id: event_id }, + }); + + if (!eventToUpdate) { + return new BadRequestException('No event found'); + } + + const updatedEvent = { + ...eventToUpdate, + event: { + ...eventToUpdate.event, + ...eventDiff, + }, + }; + + return await manager.save(EventHandler, updatedEvent); + }) + ); }); - - console.log('---arpit || createOrUpdateEvent', { eventHandlers }); - - return { - status: 'success', - data: eventHandlers, - }; } - // utitlity functions + async deleteEvent(eventId: string) { + return await dbTransactionWrap(async (manager: EntityManager) => { + const event = await manager.findOne(EventHandler, { + where: { id: eventId }, + }); + + if (!event) { + return new BadRequestException('No event found'); + } + + const deleteResponse = await manager.delete(EventHandler, event.id); + + if (!deleteResponse?.affected) { + throw new NotFoundException(); + } + return deleteResponse; + }); + } }