handle app version: creation, updates, switching versions from app builder

This commit is contained in:
arpitnath 2023-09-03 03:37:17 +05:30
parent 28d46b9f80
commit 983417386f
3 changed files with 162 additions and 67 deletions

View file

@ -627,78 +627,78 @@ const EditorComponent = (props) => {
};
//!--------
const callBack = async (data, startingPageHandle) => {
useAppVersionStore.getState().actions.updateEditingVersion(data.editing_version);
useAppVersionStore.getState().actions.updateReleasedVersionId(data.current_version_id);
const appVersions = await appEnvironmentService.getVersionsByEnvironment(data?.id);
setAppVersions(appVersions.appVersions);
updateState({
slug: data.slug,
isMaintenanceOn: data?.is_maintenance_on,
organizationId: data?.organization_id,
isPublic: data?.is_public,
appName: data?.name,
userId: data?.user_id,
appId: data?.id,
events: data.events,
currentVersionId: data?.editing_version?.id,
});
await fetchDataSources(data.editing_version?.id);
await fetchDataQueries(data.editing_version?.id, true, true);
const appDefData = buildAppDefinition(data);
const appJson = appDefData;
const pages = data.pages;
const startingPageId = pages.filter((page) => page.handle === startingPageHandle)[0]?.id;
const homePageId = !startingPageId || startingPageId === 'null' ? appJson.homePageId : startingPageId;
const currentpageData = {
handle: appJson.pages[homePageId]?.handle,
name: appJson.pages[homePageId]?.name,
id: homePageId,
variables: {},
};
setCurrentPageId(homePageId);
useCurrentStateStore.getState().actions.setCurrentState({
page: currentpageData,
});
updateEditorState({
isLoading: false,
appDefinition: appJson,
});
//! need to handle
const currentPageEvents = data.events.filter((event) => event.target === 'page' && event.sourceId === homePageId);
for (const currentEvent of currentPageEvents ?? []) {
await handleEvent(currentEvent.name, currentPageEvents);
}
};
//****** */
const fetchApp = async (startingPageHandle, onMount = false) => {
const _appId = props?.params?.id;
const callBack = async (data) => {
useAppVersionStore.getState().actions.updateEditingVersion(data.editing_version);
useAppVersionStore.getState().actions.updateReleasedVersionId(data.current_version_id);
const appVersions = await appEnvironmentService.getVersionsByEnvironment(data?.id);
setAppVersions(appVersions.appVersions);
updateState({
slug: data.slug,
isMaintenanceOn: data?.is_maintenance_on,
organizationId: data?.organization_id,
isPublic: data?.is_public,
appName: data?.name,
userId: data?.user_id,
appId: data?.id,
events: data.events,
currentVersionId: data?.editing_version?.id,
});
await fetchDataSources(data.editing_version?.id);
await fetchDataQueries(data.editing_version?.id, true, true);
const appDefData = buildAppDefinition(data);
const appJson = appDefData;
const pages = data.pages;
const startingPageId = pages.filter((page) => page.handle === startingPageHandle)[0]?.id;
const homePageId = !startingPageId || startingPageId === 'null' ? appJson.homePageId : startingPageId;
const currentpageData = {
handle: appJson.pages[homePageId]?.handle,
name: appJson.pages[homePageId]?.name,
id: homePageId,
variables: {},
};
setCurrentPageId(homePageId);
useCurrentStateStore.getState().actions.setCurrentState({
page: currentpageData,
});
updateEditorState({
isLoading: false,
appDefinition: appJson,
});
//! need to handle
const currentPageEvents = data.events.filter((event) => event.target === 'page' && event.sourceId === homePageId);
for (const currentEvent of currentPageEvents ?? []) {
await handleEvent(currentEvent.name, currentPageEvents);
}
};
if (!onMount) {
await appService.getApp(_appId).then(callBack);
await appService.getApp(_appId).then((data) => callBack(data, startingPageHandle));
} else {
callBack(app);
callBack(app, startingPageHandle);
}
};
// !--------
const setAppDefinitionFromVersion = (version, shouldWeEditVersion = true) => {
const setAppDefinitionFromVersion = (appData, shouldWeEditVersion = true) => {
const version = appData?.editing_version?.id;
if (version?.id !== props.editingVersion?.id) {
// !Need to fix this
// appDefinitionChanged(defaults(version.definition, defaultDefinition(props.darkMode)), {
@ -712,15 +712,13 @@ const EditorComponent = (props) => {
canRedo: false,
});
}
useAppVersionStore.getState().actions.updateEditingVersion(version);
updateEditorState({
isUpdatingEditorStateInProcess: false,
isLoading: true,
});
shouldWeEditVersion && saveEditingVersion(true);
fetchDataSources(props.editingVersion?.id);
fetchDataQueries(props.editingVersion?.id, true);
callBack(appData);
initComponentVersioning();
}
};
@ -822,7 +820,7 @@ const EditorComponent = (props) => {
useAppVersionStore.getState().actions.updateEditingVersion(_editingVersion);
if (updateDiff?.type === 'components' && updateDiff?.operation === 'delete') {
const appEvents = JSON.parse(JSON.stringify(events));
const appEvents = Array.isArray(events) && events.length > 0 ? JSON.parse(JSON.stringify(events)) : [];
const updatedEvents = appEvents.filter((event) => {
return !updateDiff?.updateDiff.includes(event.sourceId);

View file

@ -300,7 +300,22 @@ export class AppsController {
);
}
return { ...appVersion, data_queries: appVersion.dataQueries };
const pagesForVersion = await this.pageService.findPagesForVersion(versionId);
const appCurrentEditingVersion = JSON.parse(JSON.stringify(appVersion));
delete appCurrentEditingVersion['app'];
const appData = {
...app,
};
delete appData['editingVersion'];
return {
...appData,
editing_version: camelizeKeys(appCurrentEditingVersion),
pages: pagesForVersion,
};
}
@UseGuards(JwtAuthGuard)

View file

@ -30,7 +30,11 @@ import { DataSourceScopes } from 'src/helpers/data_source.constants';
import { DataBaseConstraints } from 'src/helpers/db_constraints.constants';
import { Page } from 'src/entities/page.entity';
import { AppVersionUpdateDto } from '@dto/app-version-update.dto';
import { Layout } from 'src/entities/layout.entity';
import { Component } from 'src/entities/component.entity';
const uuid = require('uuid');
@Injectable()
export class AppsService {
constructor(
@ -371,10 +375,88 @@ export class AppsService {
);
await this.createNewDataSourcesAndQueriesForVersion(manager, appVersion, versionFrom, organizationId);
if (versionFrom) {
(appVersion.showViewerNavigation = versionFrom.showViewerNavigation),
(appVersion.globalSettings = versionFrom.globalSettings),
await manager.save(appVersion);
await this.createNewPagesAndComponentsForVersion(manager, appVersion, versionFrom.id, versionFrom.homePageId);
}
return appVersion;
}, manager);
}
async createNewPagesAndComponentsForVersion(
manager: EntityManager,
appVersion: AppVersion,
versionFromId: string,
prevHomePagePage: string
) {
const pages = await manager
.createQueryBuilder(Page, 'page')
.leftJoinAndSelect('page.components', 'component')
.leftJoinAndSelect('component.layouts', 'layout')
.where('page.appVersionId = :appVersionId', { appVersionId: versionFromId })
.getMany();
let homePageId = prevHomePagePage;
const newComponents = [];
const newComponentLayouts = [];
for (const page of pages) {
const savedPage = await manager.save(
manager.create(Page, {
name: page.name,
handle: page.handle,
index: page.index,
appVersionId: appVersion.id,
})
);
if (page.id === prevHomePagePage) {
homePageId = savedPage.id;
}
page.components.forEach(async (component) => {
const newComponent = new Component();
newComponent.id = uuid.v4();
newComponent.name = component.name;
newComponent.type = component.type;
newComponent.pageId = savedPage.id;
newComponent.properties = component.properties;
newComponent.styles = component.styles;
newComponent.validations = component.validations;
newComponent.page = savedPage;
newComponents.push(newComponent);
component.layouts.forEach((layout) => {
const newLayout = new Layout();
newLayout.id = uuid.v4();
newLayout.type = layout.type;
newLayout.top = layout.top;
newLayout.left = layout.left;
newLayout.width = layout.width;
newLayout.height = layout.height;
newLayout.componentId = layout.componentId;
newLayout.component = newComponent;
newComponentLayouts.push(newLayout);
});
});
await manager.save(newComponents);
await manager.save(newComponentLayouts);
}
return await manager.update(AppVersion, { id: appVersion.id }, { homePageId });
}
async deleteVersion(app: App, version: AppVersion): Promise<void> {
if (app.currentVersionId === version.id) {
throw new BadRequestException('You cannot delete a released version');