Files
Umbraco-CMS/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts
Mads Rasmussen d6b4dd2e30 mapping
2024-02-02 12:48:30 +01:00

201 lines
5.7 KiB
TypeScript

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 {
CreateUserRequestModel,
CurrentUserResponseModel,
InviteUserRequestModel,
PagedUserResponseModel,
UpdateUserGroupsOnUserRequestModel,
UserItemResponseModel,
UserResponseModel,
} from '@umbraco-cms/backoffice/backend-api';
import { UserStateModel } from '@umbraco-cms/backoffice/backend-api';
const userGroupFilter = (filterOptions: any, item: UmbMockUserModel) =>
arrayFilter(filterOptions.userGroupIds, item.userGroupIds);
const userStateFilter = (filterOptions: any, item: UmbMockUserModel) =>
stringFilter(filterOptions.userStates, item.state);
const userQueryFilter = (filterOptions: any, item: UmbMockUserModel) => queryFilter(filterOptions.filter, item.name);
// Temp mocked database
class UmbUserMockDB extends UmbEntityMockDbBase<UmbMockUserModel> {
item = new UmbMockEntityItemManager<UmbMockUserModel>(this, itemMapper);
detail = new UmbMockEntityDetailManager<UmbMockUserModel>(this, createMockMapper, detailResponseMapper);
constructor(data: UmbMockUserModel[]) {
super(data);
}
/**
* Set user groups
* @param {UpdateUserGroupsOnUserRequestModel} data
* @memberof UmbUserData
*/
setUserGroups(data: UpdateUserGroupsOnUserRequestModel): void {
const users = this.data.filter((user) => data.userIds?.includes(user.id ?? ''));
users.forEach((user) => {
user.userGroupIds = data.userGroupIds;
});
}
/**
* Get current user
* @return {*} {UmbLoggedInUser}
* @memberof UmbUserData
*/
getCurrentUser(): CurrentUserResponseModel {
const firstUser = this.data[0];
const permissions = firstUser.userGroupIds?.length ? umbUserGroupMockDb.getPermissions(firstUser.userGroupIds) : [];
return {
id: firstUser.id,
name: firstUser.name,
email: firstUser.email,
userName: firstUser.email,
avatarUrls: [],
hasAccessToAllLanguages: true,
languageIsoCode: firstUser.languageIsoCode,
languages: [],
documentStartNodeIds: firstUser.contentStartNodeIds,
mediaStartNodeIds: firstUser.mediaStartNodeIds,
permissions,
};
}
/**
* Disable users
* @param {Array<string>} ids
* @memberof UmbUserData
*/
disable(ids: Array<string>): void {
const users = this.data.filter((user) => ids.includes(user.id ?? ''));
users.forEach((user) => {
user.state = UserStateModel.DISABLED;
});
}
/**
* Enable users
* @param {Array<string>} ids
* @memberof UmbUserData
*/
enable(ids: Array<string>): void {
const users = this.data.filter((user) => ids.includes(user.id));
users.forEach((user) => {
user.state = UserStateModel.ACTIVE;
});
}
/**
* Unlock users
* @param {Array<string>} ids
* @memberof UmbUserData
*/
unlock(ids: Array<string>): void {
const users = this.data.filter((user) => ids.includes(user.id));
users.forEach((user) => {
user.failedLoginAttempts = 0;
user.state = UserStateModel.ACTIVE;
});
}
/**
* Invites a user
* @param {InviteUserRequestModel} data
* @memberof UmbUserData
*/
invite(data: InviteUserRequestModel) {
const invitedUser = {
...data,
state: UserStateModel.INVITED,
};
const newUserId = this.detail.create(invitedUser);
return { userId: newUserId };
}
filter(options: any): PagedUserResponseModel {
const allItems = this.getAll();
const filterOptions = {
skip: options.skip || 0,
take: options.take || 25,
orderBy: options.orderBy || 'name',
orderDirection: options.orderDirection || 'asc',
userGroupIds: options.userGroupIds,
userStates: options.userStates,
filter: options.filter,
};
const filteredItems = allItems.filter(
(item) =>
userGroupFilter(filterOptions, item) &&
userStateFilter(filterOptions, item) &&
userQueryFilter(filterOptions, item),
);
const totalItems = filteredItems.length;
const paginatedItems = filteredItems.slice(filterOptions.skip, filterOptions.skip + filterOptions.take);
return { total: totalItems, items: paginatedItems };
}
}
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);