From 5a7d8b6747bcc64cf5c11c9321ea24a26e8d466a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 16 Dec 2023 19:42:09 +0100 Subject: [PATCH] wip split file system mock db into reusable managers --- .../src/mocks/data/data.ts | 5 +- .../file-system/file-system-folder-manager.ts | 29 +++++ .../file-system/file-system-tree-manager.ts | 32 +++++ .../src/mocks/data/scripts.data.ts | 116 ++++-------------- 4 files changed, 89 insertions(+), 93 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-folder-manager.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-tree-manager.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts index 8f08949ada..d26dc233ff 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data.ts @@ -1,4 +1,3 @@ -// Temp mocked database export class UmbData { protected data: Array = []; @@ -6,6 +5,10 @@ export class UmbData { this.data = data; } + getData() { + return this.data; + } + get total() { return this.data.length; } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-folder-manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-folder-manager.ts new file mode 100644 index 0000000000..ac5bbded13 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-folder-manager.ts @@ -0,0 +1,29 @@ +import { UmbData } from '../data.js'; +import { CreatePathFolderRequestModel, PathFolderModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockFileSystemFolderManager { + #db: UmbData; + + constructor(db: UmbData) { + this.#db = db; + } + + create(request: CreatePathFolderRequestModel) { + const newFolder = { + path: `${request.parentPath ?? ''}/${request.name}`, + name: request.name, + hasChildren: false, + isFolder: true, + }; + + this.#db.getData().push(newFolder); + } + + read(path: string) { + return this.#db.getData().find((item) => item.path === path); + } + + delete(path: string) { + alert('delete folder'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-tree-manager.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-tree-manager.ts new file mode 100644 index 0000000000..a3e1b4395f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/file-system/file-system-tree-manager.ts @@ -0,0 +1,32 @@ +import { UmbData } from '../data.js'; +import { createFileSystemTreeItem } from '../utils.js'; +import { + FileSystemTreeItemPresentationModel, + PagedFileSystemTreeItemPresentationModel, +} from '@umbraco-cms/backoffice/backend-api'; + +export class UmbMockFileSystemTreeManager { + #db: UmbData; + + constructor(mockDb: UmbData) { + this.#db = mockDb; + } + + getTreeRoot(): PagedFileSystemTreeItemPresentationModel { + const items = this.#db.getData().filter((item) => item.path?.includes('/') === false); + const treeItems = items.map((item) => createFileSystemTreeItem(item)); + const total = items.length; + return { items: treeItems, total }; + } + + getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { + const items = this.#db.getData().filter((item) => item.path?.startsWith(parentPath)); + const treeItems = items.map((item) => createFileSystemTreeItem(item)); + const total = items.length; + return { items: treeItems, total }; + } + + getTreeItem(path: string): FileSystemTreeItemPresentationModel | undefined { + return this.#db.getData().find((item) => item.path === path); + } +} 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 a90b109642..9fec2eaf7a 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,18 +1,18 @@ import { UmbData } from './data.js'; -import { createFileItemResponseModelBaseModel, createFileSystemTreeItem, createTextFileItem } from './utils.js'; +import { UmbMockFileSystemFolderManager } from './file-system/file-system-folder-manager.js'; +import { UmbMockFileSystemTreeManager } from './file-system/file-system-tree-manager.js'; +import { createFileItemResponseModelBaseModel, createTextFileItem } from './utils.js'; import { - CreatePathFolderRequestModel, CreateTextFileViewModelBaseModel, FileSystemTreeItemPresentationModel, - PagedFileSystemTreeItemPresentationModel, ScriptItemResponseModel, ScriptResponseModel, UpdateScriptRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -type ScriptsDataItem = ScriptResponseModel & FileSystemTreeItemPresentationModel; +type UmbMockScriptModel = ScriptResponseModel & FileSystemTreeItemPresentationModel; -export const data: Array = [ +export const data: Array = [ { path: 'some-folder', isFolder: true, @@ -125,123 +125,55 @@ export const data: Array = [ }, ]; -class UmbScriptsData extends UmbData { +class UmbScriptsData extends UmbData { + tree = new UmbMockFileSystemTreeManager(this); + folder = new UmbMockFileSystemFolderManager(this); + constructor() { super(data); } - getTreeRoot(): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.includes('/') === false); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItemChildren(parentPath: string): PagedFileSystemTreeItemPresentationModel { - const items = this.data.filter((item) => item.path?.startsWith(parentPath)); - const treeItems = items.map((item) => createFileSystemTreeItem(item)); - const total = items.length; - return { items: treeItems, total }; - } - - getTreeItem(paths: Array): Array { - const items = this.data.filter((item) => paths.includes(item.path ?? '')); - return items.map((item) => createFileSystemTreeItem(item)); - } - getItem(paths: Array): Array { const items = this.data.filter((item) => paths.includes(item.path ?? '')); return items.map((item) => createFileItemResponseModelBaseModel(item)); } - getFolder(path: string) { - return data.find((item) => item.isFolder && item.path === path); - } - - postFolder(payload: CreatePathFolderRequestModel) { - const newFolder = { - path: `${payload.parentPath ?? ''}/${payload.name}`, - isFolder: true, - name: payload.name, - type: 'script', - hasChildren: false, - content: '', - }; - return this.insert(newFolder); - } - - deleteFolder(path: string) { - return this.delete([path]); - } - - getScript(path: string): ScriptResponseModel | undefined { - return createTextFileItem(this.data.find((item) => item.path === path)); - } - - insertScript(item: CreateTextFileViewModelBaseModel) { - const newItem: ScriptsDataItem = { - ...item, - path: `${item.parentPath}/${item.name}.js}`, + create(item: CreateTextFileViewModelBaseModel) { + const newItem: UmbMockScriptModel = { + name: item.name, + content: item.content, + //parentPath: item.parentPath, + path: `${item.parentPath}` ? `${item.parentPath}/${item.name}}` : item.name, isFolder: false, hasChildren: false, type: 'script', }; - this.insert(newItem); - return newItem; + this.data.push(newItem); } - insert(item: ScriptsDataItem) { - const exits = this.data.find((i) => i.path === item.path); - - if (exits) { - throw new Error(`Item with path ${item.path} already exists`); - } - - this.data.push(item); - - return item; + read(path: string): ScriptResponseModel | undefined { + const item = this.data.find((item) => item.path === path); + return createTextFileItem(item); } - updateData(updateItem: UpdateScriptRequestModel) { + update(updateItem: UpdateScriptRequestModel) { const itemIndex = this.data.findIndex((item) => item.path === updateItem.existingPath); const item = this.data[itemIndex]; - if (!item) return; + if (!item) throw new Error('Item not found'); - // TODO: revisit this code, seems like something we can solve smarter/type safer now: - const itemKeys = Object.keys(item); - const newItem = { ...item }; + const updatedItem = { + path: item, + }; - for (const [key] of Object.entries(updateItem)) { - if (itemKeys.indexOf(key) !== -1) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - newItem[key] = updateItem[key]; - } - } - // Specific to fileSystem, we need to update path based on name: - const dirName = updateItem.existingPath?.substring(0, updateItem.existingPath.lastIndexOf('/')); - newItem.path = `${dirName}${dirName ? '/' : ''}${updateItem.name}`; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore this.data[itemIndex] = newItem; } delete(paths: Array) { - const pathsOfItemsToDelete = this.data - .filter((item) => { - if (!item.path) throw new Error('Item has no path'); - return paths.includes(item.path); - }) - .map((item) => item.path); - this.data = this.data.filter((item) => { if (!item.path) throw new Error('Item has no path'); return paths.indexOf(item.path) === -1; }); - - return pathsOfItemsToDelete; } }