From ad977e51918284d827d819fd57ec7d57dc50fcf4 Mon Sep 17 00:00:00 2001 From: Julia Gru <56249914+julczka@users.noreply.github.com> Date: Mon, 4 Sep 2023 10:31:12 +0200 Subject: [PATCH] scripts handlers & data --- .../src/mocks/data/scripts.data.ts | 42 ++++++++-- .../src/mocks/handlers/scripts.handlers.ts | 80 +++++++++++++++++++ 2 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts index 025a1e11ee..3929fc8119 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/scripts.data.ts @@ -1,6 +1,7 @@ import { UmbEntityData } from './entity.data.js'; import { createFileSystemTreeItem, createTextFileItem } from './utils.js'; import { + CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel, FileSystemTreeItemPresentationModel, PagedFileSystemTreeItemPresentationModel, @@ -12,7 +13,7 @@ import { type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel & { id: string }; -export const treeData: Array = [ +export const data: Array = [ { id: 'some-folder', path: 'some-folder', @@ -124,7 +125,7 @@ export const treeData: Array = [ class UmbScriptsTreeData extends UmbEntityData { constructor() { - super(treeData); + super(data); } getTreeRoot(): PagedFileSystemTreeItemPresentationModel { @@ -147,18 +148,47 @@ class UmbScriptsTreeData extends UmbEntityData { + constructor() { + super(data); + } + + getFolder(path: string): FileSystemTreeItemPresentationModel { + const items = data.filter((item) => item.isFolder && item.path === path); + const total = items.length; + return items as FileSystemTreeItemPresentationModel; + } + + postFolder(payload: CreatePathFolderRequestModel) { + const newFolder = { + id: `${payload.parentPath ?? ''}/${payload.name}`, + path: `${payload.parentPath ?? ''}/${payload.name}`, + isFolder: true, + name: payload.name, + type: 'script', + hasChildren: false, + }; + return this.insert(newFolder); + } + + deleteFolder(path: string) { + return this.delete([path]); + } +} + export const umbScriptsTreeData = new UmbScriptsTreeData(); +export const umbScriptsFolderData = new UmbScriptsFolderData(); class UmbScriptsData extends UmbEntityData { constructor() { - super(treeData); + super(data); } - getPartialView(path: string): PartialViewResponseModel | undefined { + getScript(path: string): ScriptResponseModel | undefined { return createTextFileItem(this.data.find((item) => item.path === path)); } - insertPartialView(item: CreateTextFileViewModelBaseModel) { + insertScript(item: CreateTextFileViewModelBaseModel) { const newItem: ScriptsDataItem = { ...item, path: `${item.parentPath}/${item.name}.js}`, @@ -173,4 +203,4 @@ class UmbScriptsData extends UmbEntityData { } } -export const umbPartialViewsData = new UmbScriptsData(); +export const umbScriptsData = new UmbScriptsData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts new file mode 100644 index 0000000000..848c28b3ec --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/scripts.handlers.ts @@ -0,0 +1,80 @@ +const { rest } = window.MockServiceWorker; +import { RestHandler, MockedRequest, DefaultBodyType } from 'msw'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; +import { CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { umbScriptsTreeData, umbScriptsData, umbScriptsFolderData } from '../data/scripts.data.js'; + +const treeHandlers = [ + rest.get(umbracoPath('/tree/script/root'), (req, res, ctx) => { + const response = umbScriptsTreeData.getTreeRoot(); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath('/tree/script/children'), (req, res, ctx) => { + const path = req.url.searchParams.get('path'); + if (!path) return; + + const response = umbScriptsTreeData.getTreeItemChildren(path); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.get(umbracoPath('/tree/script/item'), (req, res, ctx) => { + const paths = req.url.searchParams.getAll('paths'); + if (!paths) return; + + const items = umbScriptsTreeData.getTreeItem(paths); + return res(ctx.status(200), ctx.json(items)); + }), +]; + +const detailHandlers: RestHandler>[] = [ + rest.get(umbracoPath('/script'), (req, res, ctx) => { + const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsData.getScript(path); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.post(umbracoPath('/script'), (req, res, ctx) => { + const requestBody = req.json() as CreateTextFileViewModelBaseModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const response = umbScriptsData.insertScript(requestBody); + return res(ctx.status(200), ctx.json(response)); + }), + + rest.delete(umbracoPath('/script'), (req, res, ctx) => { + const path = req.url.searchParams.get('path'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsData.delete([path]); + return res(ctx.status(200), ctx.json(response)); + }), + rest.put(umbracoPath('/script'), (req, res, ctx) => { + const requestBody = req.json() as CreateTextFileViewModelBaseModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const response = umbScriptsData.updateData(requestBody); + return res(ctx.status(200)); + }), +]; + +const folderHandlers: RestHandler>[] = [ + rest.get(umbracoPath('script/folder'), (req, res, ctx) => { + const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsFolderData.getFolder(path); + return res(ctx.status(200), ctx.json(response)); + }), + rest.post(umbracoPath('script/folder'), (req, res, ctx) => { + const requestBody = req.json() as CreatePathFolderRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + const response = umbScriptsFolderData.postFolder(requestBody); + return res(ctx.status(200)); + }), + rest.delete(umbracoPath('script/folder'), (req, res, ctx) => { + const path = decodeURIComponent(req.url.searchParams.get('path') ?? '').replace('-js', '.js'); + if (!path) return res(ctx.status(400)); + const response = umbScriptsFolderData.deleteFolder(path); + return res(ctx.status(200), ctx.json(response)); + }), +]; + +export const handlers = [...treeHandlers, ...detailHandlers, ...folderHandlers];