From 0314144c8e1fde46f7304233d4a65c1387eef8f7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 30 Jan 2024 12:58:39 +0100 Subject: [PATCH] align user mock data --- .../src/mocks/data/user/user.data.ts | 11 +- .../src/mocks/data/user/user.db.ts | 126 +++++++++--------- .../mocks/handlers/user/current.handlers.ts | 4 +- .../mocks/handlers/user/detail.handlers.ts | 50 ++++--- .../mocks/handlers/user/disable.handlers.ts | 4 +- .../mocks/handlers/user/enable.handlers.ts | 4 +- .../mocks/handlers/user/filter.handlers.ts | 4 +- .../src/mocks/handlers/user/index.ts | 4 +- .../mocks/handlers/user/invite.handlers.ts | 4 +- .../src/mocks/handlers/user/item.handlers.ts | 6 +- .../handlers/user/set-user-groups.handlers.ts | 4 +- .../mocks/handlers/user/unlock.handlers.ts | 4 +- 12 files changed, 112 insertions(+), 113 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts index 41ff5349f0..916f0fb978 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts @@ -1,10 +1,11 @@ -import type { UserResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import type { UserItemResponseModel, UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -export const data: Array = [ +export type UmbMockUserModel = UserResponseModel & UserItemResponseModel; + +export const data: Array = [ { id: 'bca6c733-a63d-4353-a271-9a8b6bcca8bd', - type: 'user', contentStartNodeIds: [], mediaStartNodeIds: [], name: 'Umbraco User', @@ -23,7 +24,6 @@ export const data: Array = [ }, { id: '82e11d3d-b91d-43c9-9071-34d28e62e81d', - type: 'user', contentStartNodeIds: ['simple-document-id'], mediaStartNodeIds: ['f2f81a40-c989-4b6b-84e2-057cecd3adc1'], name: 'Amelie Walker', @@ -42,7 +42,6 @@ export const data: Array = [ }, { id: 'aa1d83a9-bc7f-47d2-b288-58d8a31f5017', - type: 'user', contentStartNodeIds: [], mediaStartNodeIds: [], name: 'Oliver Kim', @@ -61,7 +60,6 @@ export const data: Array = [ }, { id: 'ff2f4a50-d3d4-4bc4-869d-c7948c160e54', - type: 'user', contentStartNodeIds: [], mediaStartNodeIds: [], name: 'Eliana Nieves', @@ -80,7 +78,6 @@ export const data: Array = [ }, { id: 'c290c6d9-9f12-4838-8567-621b52a178de', - type: 'user', contentStartNodeIds: [], mediaStartNodeIds: [], name: 'Jasmine Patel', diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index 3dadcc41e3..e1c2c80ccd 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -1,12 +1,14 @@ -import { UmbEntityData } from '../entity.data.js'; import { umbUserGroupMockDb } from '../user-group/user-group.db.js'; import { arrayFilter, stringFilter, queryFilter } from '../utils.js'; +import { UmbEntityMockDbBase } from '../utils/entity/entity-base.js'; +import { UmbMockEntityItemManager } from '../utils/entity/entity-item.manager.js'; +import { UmbMockEntityDetailManager } from '../utils/entity/entity-detail.manager.js'; +import type { UmbMockUserModel } from './user.data.js'; import { data } from './user.data.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbCurrentUser } from '@umbraco-cms/backoffice/current-user'; import type { CreateUserRequestModel, - CreateUserResponseModel, InviteUserRequestModel, PagedUserResponseModel, UpdateUserGroupsOnUserRequestModel, @@ -15,66 +17,21 @@ import type { } from '@umbraco-cms/backoffice/backend-api'; import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -const createUserItem = (item: UserResponseModel): UserItemResponseModel => { - return { - name: item.name, - id: item.id, - }; -}; - -const userGroupFilter = (filterOptions: any, item: UserResponseModel) => +const userGroupFilter = (filterOptions: any, item: UmbMockUserModel) => arrayFilter(filterOptions.userGroupIds, item.userGroupIds); -const userStateFilter = (filterOptions: any, item: UserResponseModel) => +const userStateFilter = (filterOptions: any, item: UmbMockUserModel) => stringFilter(filterOptions.userStates, item.state); -const userQueryFilter = (filterOptions: any, item: UserResponseModel) => queryFilter(filterOptions.filter, item.name); +const userQueryFilter = (filterOptions: any, item: UmbMockUserModel) => queryFilter(filterOptions.filter, item.name); // Temp mocked database -class UmbUserData extends UmbEntityData { - constructor(data: UserResponseModel[]) { +class UmbUserMockDB extends UmbEntityMockDbBase { + item = new UmbMockEntityItemManager(this, itemMapper); + detail = new UmbMockEntityDetailManager(this, createMockMapper, detailResponseMapper); + + constructor(data: UmbMockUserModel[]) { super(data); } - /** - * Create user - * @param {CreateUserRequestModel} data - * @memberof UmbUserData - */ - createUser = (data: CreateUserRequestModel): CreateUserResponseModel => { - const userId = UmbId.new(); - const initialPassword = 'mocked-initial-password'; - - const user: UserResponseModel = { - id: userId, - languageIsoCode: null, - contentStartNodeIds: [], - mediaStartNodeIds: [], - avatarUrls: [], - state: UserStateModel.INACTIVE, - failedLoginAttempts: 0, - createDate: new Date().toUTCString(), - updateDate: new Date().toUTCString(), - lastLoginDate: null, - lastLockoutDate: null, - lastPasswordChangeDate: null, - ...data, - }; - - this.insert(user); - - return { userId, initialPassword }; - }; - - /** - * Get user items - * @param {Array} ids - * @return {*} {Array} - * @memberof UmbUserData - */ - getItems(ids: Array): Array { - const items = this.data.filter((item) => ids.includes(item.id ?? '')); - return items.map((item) => createUserItem(item)); - } - /** * Set user groups * @param {UpdateUserGroupsOnUserRequestModel} data @@ -129,7 +86,7 @@ class UmbUserData extends UmbEntityData { * @memberof UmbUserData */ enable(ids: Array): void { - const users = this.data.filter((user) => ids.includes(user.id ?? '')); + const users = this.data.filter((user) => ids.includes(user.id)); users.forEach((user) => { user.state = UserStateModel.ACTIVE; }); @@ -141,7 +98,7 @@ class UmbUserData extends UmbEntityData { * @memberof UmbUserData */ unlock(ids: Array): void { - const users = this.data.filter((user) => ids.includes(user.id ?? '')); + const users = this.data.filter((user) => ids.includes(user.id)); users.forEach((user) => { user.failedLoginAttempts = 0; user.state = UserStateModel.ACTIVE; @@ -159,9 +116,9 @@ class UmbUserData extends UmbEntityData { state: UserStateModel.INVITED, }; - const response = this.createUser(invitedUser); + const newUserId = this.detail.create(invitedUser); - return { userId: response.userId }; + return { userId: newUserId }; } filter(options: any): PagedUserResponseModel { @@ -191,4 +148,53 @@ class UmbUserData extends UmbEntityData { } } -export const umbUsersData = new UmbUserData(data); +const itemMapper = (item: UmbMockUserModel): UserItemResponseModel => { + return { + id: item.id, + name: item.name, + }; +}; + +const createMockMapper = (item: CreateUserRequestModel): UmbMockUserModel => { + return { + email: item.email, + userName: item.userName, + name: item.name, + userGroupIds: item.userGroupIds, + id: UmbId.new(), + languageIsoCode: null, + contentStartNodeIds: [], + mediaStartNodeIds: [], + avatarUrls: [], + state: UserStateModel.INACTIVE, + failedLoginAttempts: 0, + createDate: new Date().toUTCString(), + updateDate: new Date().toUTCString(), + lastLoginDate: null, + lastLockoutDate: null, + lastPasswordChangeDate: null, + }; +}; + +const detailResponseMapper = (item: UmbMockUserModel): UserResponseModel => { + return { + email: item.email, + userName: item.userName, + name: item.name, + userGroupIds: item.userGroupIds, + id: item.id, + languageIsoCode: item.languageIsoCode, + contentStartNodeIds: item.contentStartNodeIds, + mediaStartNodeIds: item.mediaStartNodeIds, + avatarUrls: item.avatarUrls, + state: item.state, + failedLoginAttempts: item.failedLoginAttempts, + createDate: item.createDate, + updateDate: item.updateDate, + lastLoginDate: item.lastLoginDate, + lastLockoutDate: item.lastLockoutDate, + lastPasswordChangeDate: item.lastPasswordChangeDate, + }; +}; + +export const umbUserMockDb = new UmbUserMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts index 6ce117649d..b0ac3dd5a8 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts @@ -1,11 +1,11 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ rest.get(umbracoPath(`${UMB_SLUG}/current`), (_req, res, ctx) => { - const loggedInUser = umbUsersData.getCurrentUser(); + const loggedInUser = umbUserMockDb.getCurrentUser(); return res(ctx.status(200), ctx.json(loggedInUser)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts index 67664fd48f..ba2fbdb49b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts @@ -1,49 +1,45 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; +import type { CreateUserRequestModel, UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ - rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { - const response = umbUsersData.getAll(); - return res(ctx.status(200), ctx.json(response)); - }), - +export const detailHandlers = [ rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + const requestBody = (await req.json()) as CreateUserRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); - const response = umbUsersData.createUser(data); + const id = umbUserMockDb.detail.create(requestBody); - return res(ctx.status(200), ctx.json(response)); + return res( + ctx.status(201), + ctx.set({ + Location: req.url.href + '/' + id, + 'Umb-Generated-Resource': id, + }), + ); }), rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - const item = umbUsersData.getById(id); - - return res(ctx.status(200), ctx.json(item)); + if (!id) return res(ctx.status(400)); + const response = umbUserMockDb.detail.read(id); + return res(ctx.status(200), ctx.json(response)); }), rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - const data = await req.json(); - if (!data) return; - - umbUsersData.save(id, data); - + if (!id) return res(ctx.status(400)); + const requestBody = (await req.json()) as UpdateUserRequestModel; + if (!requestBody) return res(ctx.status(400, 'no body found')); + umbUserMockDb.detail.update(id, requestBody); return res(ctx.status(200)); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { + rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { const id = req.params.id as string; - if (!id) return; - - umbUsersData.delete([id]); - + if (!id) return res(ctx.status(400)); + umbUserMockDb.detail.delete(id); return res(ctx.status(200)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts index 22b23d9cd4..1da2fee2c9 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { DisableUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -10,7 +10,7 @@ export const handlers = [ if (!data) return; if (!data.userIds) return; - umbUsersData.disable(data.userIds); + umbUserMockDb.disable(data.userIds); return res(ctx.status(200)); }), diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts index 046a286c54..74f84990df 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { EnableUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -10,7 +10,7 @@ export const handlers = [ if (!data) return; if (!data.userIds) return; - umbUsersData.enable(data.userIds); + umbUserMockDb.enable(data.userIds); return res(ctx.status(200)); }), diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts index cfbbdffd4d..5fad748ccb 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -23,7 +23,7 @@ export const handlers = [ filter: filter || undefined, }; - const response = umbUsersData.filter(options); + const response = umbUserMockDb.filter(options); return res(ctx.status(200), ctx.json(response)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/index.ts index b3e82d084e..43a356f3bb 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/index.ts @@ -1,5 +1,5 @@ -import { handlers as detailHandlers } from './detail.handlers.js'; -import { handlers as itemHandlers } from './item.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; +import { itemHandlers } from './item.handlers.js'; import { handlers as currentHandlers } from './current.handlers.js'; import { handlers as setUserGroupsHandlers } from './set-user-groups.handlers.js'; import { handlers as enableHandlers } from './enable.handlers.js'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts index 9682c2b81e..074c0e416c 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { InviteUserRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -11,7 +11,7 @@ export const handlers = [ const data = await req.json(); if (!data) return; - const { userId } = umbUsersData.invite(data); + const { userId } = umbUserMockDb.invite(data); if (!userId) return res(ctx.status(400)); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts index 1210a0bc54..44179c36c6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts @@ -1,13 +1,13 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const handlers = [ +export const itemHandlers = [ rest.get(umbracoPath(`${UMB_SLUG}/item`), (req, res, ctx) => { const ids = req.url.searchParams.getAll('id'); if (!ids) return; - const items = umbUsersData.getItems(ids); + const items = umbDocumentMockDb.item.getItems(ids); return res(ctx.status(200), ctx.json(items)); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts index d75454521b..98178720b2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -8,7 +8,7 @@ export const handlers = [ const data = await req.json(); if (!data) return; - umbUsersData.setUserGroups(data); + umbUserMockDb.setUserGroups(data); return res(ctx.status(200)); }), diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts index 1d90b62f10..24abc83e47 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts @@ -1,5 +1,5 @@ const { rest } = window.MockServiceWorker; -import { umbUsersData } from '../../data/user/user.db.js'; +import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { UnlockUsersRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -10,7 +10,7 @@ export const handlers = [ if (!data) return; if (!data.userIds) return; - umbUsersData.unlock(data.userIds); + umbUserMockDb.unlock(data.userIds); return res(ctx.status(200)); }),