update/refactor: new event flow for builder events

This commit is contained in:
arpitnath 2023-08-24 04:13:43 +05:30
parent 683fe331e4
commit 4eb9742d3e
15 changed files with 319 additions and 132 deletions

View file

@ -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({

View file

@ -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);

View file

@ -98,8 +98,9 @@ export const baseComponentProperties = (
isOpen: true,
children: (
<EventManager
component={component}
componentMeta={componentMeta}
sourceId={component?.id}
eventSourceType="component"
eventMetaDefinition={componentMeta}
currentState={currentState}
dataQueries={dataQueries}
components={allComponents}

View file

@ -94,8 +94,9 @@ export const baseComponentProperties = (
isOpen: true,
children: (
<EventManager
component={component}
componentMeta={componentMeta}
sourceId={component?.id}
eventSourceType="component"
eventMetaDefinition={componentMeta}
currentState={currentState}
dataQueries={dataQueries}
components={allComponents}

View file

@ -139,8 +139,9 @@ export function Icon({ componentMeta, darkMode, ...restProps }) {
isOpen: false,
children: (
<EventManager
component={component}
componentMeta={componentMeta}
sourceId={component?.id}
eventSourceType="component"
eventMetaDefinition={componentMeta}
currentState={currentState}
dataQueries={dataQueries}
components={allComponents}

View file

@ -430,6 +430,7 @@ class TableComponent extends React.Component {
/>
</div>
<EventManager
//!have to check
component={{
component: {
definition: {
@ -437,8 +438,10 @@ class TableComponent extends React.Component {
},
},
}}
sourceId={this.props?.component?.id}
eventSourceType="component"
hideEmptyEventsAlert={true}
componentMeta={{ events: { onChange: { displayName: 'On change' } } }}
eventMetaDefinition={{ events: { onChange: { displayName: 'On change' } } }}
currentState={this.props.currentState}
dataQueries={this.props.dataQueries}
components={this.props.components}
@ -796,8 +799,11 @@ class TableComponent extends React.Component {
paramType="properties"
/>
<EventManager
//!have to check
component={dummyComponentForActionButton}
componentMeta={{ events: { onClick: { displayName: 'On click' } } }}
sourceId={this.props?.component?.id}
eventSourceType="component"
eventMetaDefinition={{ events: { onClick: { displayName: 'On click' } } }}
currentState={this.state.currentState}
dataQueries={this.props.dataQueries}
components={this.props.components}
@ -1143,8 +1149,11 @@ class TableComponent extends React.Component {
isOpen: true,
children: (
<EventManager
//!have to check
component={component}
componentMeta={componentMeta}
sourceId={this.props?.component?.id}
eventSourceType="component"
eventMetaDefinition={componentMeta}
currentState={currentState}
dataQueries={dataQueries}
components={components}

View file

@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react';
import React, { useState, useEffect, useMemo } from 'react';
import { ActionTypes } from '../ActionTypes';
import OverlayTrigger from 'react-bootstrap/OverlayTrigger';
import Popover from 'react-bootstrap/Popover';
@ -18,13 +18,16 @@ import AddRectangle from '@/_ui/Icon/bulkIcons/AddRectangle';
import { Tooltip } from 'react-tooltip';
import { ButtonSolid } from '@/_ui/AppButton/AppButton';
import RunjsParameters from './ActionConfigurationPanels/RunjsParamters';
import { useAppInfo } from '@/_stores/appDataStore';
import { useAppDataActions, useAppInfo } from '@/_stores/appDataStore';
import { isQueryRunnable } from '@/_helpers/utils';
import { shallow } from 'zustand/shallow';
// eslint-disable-next-line import/no-unresolved
import { diff } from 'deep-object-diff';
export const EventManager = ({
component,
componentMeta,
sourceId,
eventSourceType,
eventMetaDefinition,
components,
eventsChanged,
excludeEvents,
@ -41,15 +44,25 @@ export const EventManager = ({
}
return dataQueries;
}, shallow);
const { apps, appId } = useAppInfo();
const { apps, appId, events: allAppEvents } = useAppInfo();
const [events, setEvents] = useState(() => 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) => (
<div className="row mt-2" key={param.handle}>
<div className="col-3 p-1" data-cy={`action-options-${param.displayName}-field-label`}>
{param.displayName}
<div className="col-3 p-1" data-cy={`action-options-${param?.displayName}-field-label`}>
{param?.displayName}
</div>
{param.type === 'select' ? (
<div className="col-9" data-cy="action-options-action-selection-field">
@ -758,7 +788,7 @@ export const EventManager = ({
enablePreview={true}
type={param?.type}
fieldMeta={{ options: param?.options }}
cyLabel={param.displayName}
cyLabel={param?.displayName}
/>
</div>
)}
@ -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 }) => (
<div {...droppableProps} ref={innerRef}>
{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 (
<Draggable key={index} draggableId={`${event.eventId}-${index}`} index={index}>
@ -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 = ({
</svg>
</div>
<div className="col text-truncate" data-cy="event-handler">
{componentMeta.events[event.eventId]['displayName']}
{eventMetaDefinition?.events[event.event.eventId]?.displayName}
</div>
<div className="col text-truncate color-slate11" data-cy="event-name">
<small className="event-action font-weight-light text-truncate">
@ -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 (

View file

@ -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}
/>

View file

@ -55,6 +55,7 @@ export const SettingsModal = ({
<Modal.Body onClick={() => pinPagesPopover(true)}>
<b data-cy={'page-events-labe'}>Events</b>
<EventManager
//!page
component={{
component: {
definition: {
@ -62,7 +63,9 @@ export const SettingsModal = ({
},
},
}}
componentMeta={{ events: { onPageLoad: { displayName: 'On page load' } }, name: 'page' }}
sourceId={page?.id}
eventSourceType="page"
eventMetaDefinition={{ events: { onPageLoad: { displayName: 'On page load' } }, name: 'page' }}
components={components}
apps={apps}
pages={allpages}

View file

@ -186,9 +186,12 @@ export const QueryManagerBody = ({
<div className={`form-label`}>{t('editor.queryManager.eventsHandler', 'Events')}</div>
<div className="query-manager-events pb-4 flex-grow-1">
<EventManager
//!Query events
eventsChanged={eventsChanged}
component={queryComponent.component}
componentMeta={queryComponent.componentMeta}
sourceId={selectedQuery?.id}
eventSourceType="data_query"
eventMetaDefinition={queryComponent.componentMeta}
currentState={currentState}
components={allComponents}
callerQueryId={selectedQueryId}

View file

@ -314,12 +314,11 @@ export async function runTransformation(
}
}
export async function executeActionsForEventId(_ref, eventId, component, mode, customVariables) {
const events = component?.definition?.events || [];
const filteredEvents = events.filter((event) => 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 }) => {

View file

@ -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
);
}

View file

@ -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 }));
// }

View file

@ -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);
}
}

View file

@ -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;
});
}
}