From 6edb1c3511b70d992c616f41f732bf3cd950833b Mon Sep 17 00:00:00 2001 From: Jaakko Heusala Date: Sun, 7 Aug 2022 02:10:58 +0300 Subject: [PATCH] Improved illegal DTO explaning in debug log and fixed room creation https://github.com/heusalagroup/hghs/issues/13 --- .../repository/room/RoomRepositoryService.ts | 34 ++++---- types/MatrixRoomVersion.ts | 15 +++- types/core/MatrixStateEvent.ts | 26 ++++++- types/core/MatrixUserId.ts | 6 +- .../roomCreate/MatrixRoomCreateEventDTO.ts | 12 +++ .../request/createRoom/MatrixCreateRoomDTO.ts | 77 ++++++++++++++----- .../types/MatrixCreateRoomPreset.ts | 17 +++- .../types/MatrixEventPowerLevelsDTO.ts | 22 +++++- .../createRoom/types/MatrixInvite3PidDTO.ts | 24 +++++- .../types/MatrixNotificationPowerLevelsDTO.ts | 25 +++++- .../types/MatrixRoomPowerLevelsEventDTO.ts | 63 ++++++++++++--- .../types/MatrixUserPowerLevelsDTO.ts | 19 ++++- .../createRoom/types/MatrixVisibility.ts | 21 ++++- 13 files changed, 299 insertions(+), 62 deletions(-) diff --git a/server/types/repository/room/RoomRepositoryService.ts b/server/types/repository/room/RoomRepositoryService.ts index 609fa4e..3e46df9 100644 --- a/server/types/repository/room/RoomRepositoryService.ts +++ b/server/types/repository/room/RoomRepositoryService.ts @@ -59,10 +59,7 @@ export class RoomRepositoryService implements RepositoryService { const list : readonly RepositoryEntry[] = await this._getAllRooms(); return map(list, (item: RepositoryEntry) : RoomRepositoryItem => { - return parseRoomRepositoryItem( - item.id, - item.data - ); + return this._toRoomRepositoryItem(item); }); } @@ -71,10 +68,7 @@ export class RoomRepositoryService implements RepositoryService { const list : readonly RepositoryEntry[] = await this._getSomeRooms(idList); return map(list, (item: RepositoryEntry) : RoomRepositoryItem => { - return parseRoomRepositoryItem( - item.id, - item.data - ); + return this._toRoomRepositoryItem(item); }); } @@ -82,10 +76,7 @@ export class RoomRepositoryService implements RepositoryService | undefined = await this._repository.findById(id); if (!foundItem) return undefined; - return parseRoomRepositoryItem( - foundItem.id, - foundItem.data - ); + return this._toRoomRepositoryItem(foundItem); } public async deleteAllRooms () : Promise { @@ -107,7 +98,7 @@ export class RoomRepositoryService implements RepositoryService { await this._sharedClientService.waitForInitialization(); const createdItem = await this._repository.createItem(toStoredRoomRepositoryItem(item)); - return parseRoomRepositoryItem(createdItem.id, createdItem.data); + return this._toRoomRepositoryItem(createdItem); } public async saveRoom ( @@ -115,7 +106,7 @@ export class RoomRepositoryService implements RepositoryService { await this._sharedClientService.waitForInitialization(); const foundItem = await this._repository.updateOrCreateItem(toStoredRoomRepositoryItem(item)); - return parseRoomRepositoryItem(foundItem.id, foundItem.data); + return this._toRoomRepositoryItem(foundItem); } // PRIVATE METHODS @@ -130,4 +121,19 @@ export class RoomRepositoryService implements RepositoryService) : RoomRepositoryItem { + const id = storedItem.id; + const target = storedItem.data?.target; + LOG.debug(`Room with id "${id}": `, storedItem, target); + const item = parseRoomRepositoryItem( + id, + target + ); + LOG.debug(`Room "${id}" as: `, item); + if (!item) { + throw new TypeError(`RoomRepositoryService: Could not parse "${storedItem.id}" and ${JSON.stringify(target)}`); + } + return item; + } + } diff --git a/types/MatrixRoomVersion.ts b/types/MatrixRoomVersion.ts index 04c17d3..f563c65 100644 --- a/types/MatrixRoomVersion.ts +++ b/types/MatrixRoomVersion.ts @@ -1,5 +1,7 @@ // Copyright (c) 2022. Heusala Group Oy . All rights reserved. +import { explainNot, explainOk, explainOr } from "../../core/modules/lodash"; + export enum MatrixRoomVersion { V1 = "1", V2 = "2", @@ -27,10 +29,21 @@ export function isMatrixRoomVersion (value: any): value is MatrixRoomVersion { default: return false; - } } +export function explainMatrixRoomVersion (value : any) : string { + return isMatrixRoomVersion(value) ? explainOk() : explainNot("MatrixRoomVersion"); +} + +export function isMatrixRoomVersionOrUndefined (value: any): value is MatrixRoomVersion | undefined { + return value === undefined || isMatrixRoomVersion(value); +} + +export function explainMatrixRoomVersionOrUndefined (value : any) : string { + return isMatrixRoomVersionOrUndefined(value) ? explainOk() : explainNot(explainOr(["MatrixRoomVersion", "undefined"])); +} + export function stringifyMatrixRoomVersion (value: MatrixRoomVersion): string { switch (value) { case MatrixRoomVersion.V1 : return '1'; diff --git a/types/core/MatrixStateEvent.ts b/types/core/MatrixStateEvent.ts index de58bff..356bfc1 100644 --- a/types/core/MatrixStateEvent.ts +++ b/types/core/MatrixStateEvent.ts @@ -1,12 +1,18 @@ // Copyright (c) 2021. Sendanor . All rights reserved. import { + explain, + explainNoOtherKeys, + explainProperty, + explainRegularObject, + explainString, + explainStringOrUndefined, hasNoOtherKeysInDevelopment, isRegularObject, isString, isStringOrUndefined } from "../../../core/modules/lodash"; -import { JsonObject } from "../../../core/Json"; +import { explainJsonObject, isJsonObject, JsonObject } from "../../../core/Json"; import { MatrixStateEventOf } from "./MatrixStateEventOf"; import { MatrixType } from "./MatrixType"; @@ -38,10 +44,26 @@ export function isMatrixStateEvent (value: any): value is MatrixStateEvent { ]) && isString(value?.type) && isStringOrUndefined(value?.state_key) - && isString(value?.content) + && isJsonObject(value?.content) ); } +export function explainMatrixStateEvent (value : any) : string { + return explain( + [ + explainRegularObject(value), + explainNoOtherKeys(value, [ + 'type', + 'state_key', + 'content' + ]), + explainProperty("type", explainString(value?.type)), + explainProperty("state_key", explainStringOrUndefined(value?.state_key)), + explainProperty("content", explainJsonObject(value?.content)) + ] + ) +} + export function stringifyMatrixStateEvent (value: MatrixStateEvent): string { return `MatrixStateEvent(${value})`; } diff --git a/types/core/MatrixUserId.ts b/types/core/MatrixUserId.ts index 592c5f0..45c6e10 100644 --- a/types/core/MatrixUserId.ts +++ b/types/core/MatrixUserId.ts @@ -1,6 +1,6 @@ // Copyright (c) 2021. Sendanor . All rights reserved. -import { isString } from "../../../core/modules/lodash"; +import { explainNot, explainOk, isString } from "../../../core/modules/lodash"; export type MatrixUserId = string; @@ -12,6 +12,10 @@ export function isMatrixUserId (value: any): value is MatrixUserId { ); } +export function explainMatrixUserId (value: any) : string { + return isMatrixUserId(value) ? explainOk() : explainNot('MatrixUserId'); +} + export function stringifyMatrixUserId (value: MatrixUserId): string { return `MatrixUserId(${value})`; } diff --git a/types/event/roomCreate/MatrixRoomCreateEventDTO.ts b/types/event/roomCreate/MatrixRoomCreateEventDTO.ts index 3459408..2afe4a6 100644 --- a/types/event/roomCreate/MatrixRoomCreateEventDTO.ts +++ b/types/event/roomCreate/MatrixRoomCreateEventDTO.ts @@ -1,6 +1,9 @@ +// Copyright (c) 2022. Heusala Group Oy . All rights reserved. // Copyright (c) 2021. Sendanor . All rights reserved. import { + explainNot, + explainOk, explainOr, hasNoOtherKeysInDevelopment, isBooleanOrUndefined, isRegularObject, @@ -49,6 +52,15 @@ export function isPartialMatrixCreationContentDTO (value: any): value is Partial ); } + +export function isPartialMatrixCreationContentDTOOrUndefined (value: any) : value is Partial | undefined { + return value === undefined || isPartialMatrixCreationContentDTO(value); +} + +export function explainPartialMatrixCreationContentDTOOrUndefined (value: any) : string { + return isPartialMatrixCreationContentDTOOrUndefined(value) ? explainOk() : explainNot( explainOr(['Partial', "undefined"]) ); +} + export function stringifyMatrixCreationContentDTO (value: MatrixRoomCreateEventDTO): string { return `MatrixCreationContentDTO(${value})`; } diff --git a/types/request/createRoom/MatrixCreateRoomDTO.ts b/types/request/createRoom/MatrixCreateRoomDTO.ts index eef7b27..3487413 100644 --- a/types/request/createRoom/MatrixCreateRoomDTO.ts +++ b/types/request/createRoom/MatrixCreateRoomDTO.ts @@ -1,22 +1,29 @@ +// Copyright (c) 2022. Heusala Group Oy . All rights reserved. // Copyright (c) 2021. Sendanor . All rights reserved. import { + explain, + explainArrayOfOrUndefined, + explainBooleanOrUndefined, + explainNoOtherKeys, + explainProperty, + explainRegularObject, + explainStringOrUndefined, hasNoOtherKeysInDevelopment, - isArrayOf, + isArrayOfOrUndefined, isBooleanOrUndefined, isRegularObject, - isStringOrUndefined, - isUndefined + isStringOrUndefined } from "../../../../core/modules/lodash"; -import { MatrixVisibility, isMatrixVisibility } from "./types/MatrixVisibility"; -import { isMatrixInvite3PidDTO } from "./types/MatrixInvite3PidDTO"; -import { MatrixRoomCreateEventDTO, isPartialMatrixCreationContentDTO } from "../../event/roomCreate/MatrixRoomCreateEventDTO"; -import { MatrixStateEvent, isMatrixStateEvent } from "../../core/MatrixStateEvent"; -import { MatrixCreateRoomPreset, isMatrixCreateRoomPreset } from "./types/MatrixCreateRoomPreset"; -import { MatrixRoomPowerLevelsEventDTO, isMatrixPowerLevelEventContentDTO } from "./types/MatrixRoomPowerLevelsEventDTO"; +import { MatrixVisibility, isMatrixVisibilityOrUndefined, explainMatrixVisibilityOrUndefined } from "./types/MatrixVisibility"; +import { explainMatrixInvite3PidDTO, isMatrixInvite3PidDTO } from "./types/MatrixInvite3PidDTO"; +import { MatrixRoomCreateEventDTO, isPartialMatrixCreationContentDTOOrUndefined, explainPartialMatrixCreationContentDTOOrUndefined } from "../../event/roomCreate/MatrixRoomCreateEventDTO"; +import { MatrixStateEvent, isMatrixStateEvent, explainMatrixStateEvent } from "../../core/MatrixStateEvent"; +import { MatrixCreateRoomPreset, isMatrixCreateRoomPresetOrUndefined, explainMatrixCreateRoomPresetOrUndefined } from "./types/MatrixCreateRoomPreset"; +import { MatrixRoomPowerLevelsEventDTO, isMatrixPowerLevelEventContentDTOOrUndefined, explainMatrixPowerLevelEventContentDTOOrUndefined } from "./types/MatrixRoomPowerLevelsEventDTO"; import { MatrixInvite3PidDTO } from "./types/MatrixInvite3PidDTO"; -import { MatrixUserId, isMatrixUserId } from "../../core/MatrixUserId"; -import { MatrixRoomVersion } from "../../MatrixRoomVersion"; +import { MatrixUserId, isMatrixUserId, explainMatrixUserId } from "../../core/MatrixUserId"; +import { explainMatrixRoomVersionOrUndefined, isMatrixRoomVersionOrUndefined, MatrixRoomVersion } from "../../MatrixRoomVersion"; export interface MatrixCreateRoomDTO { @@ -57,21 +64,53 @@ export function isMatrixCreateRoomDTO (value: any): value is MatrixCreateRoomDTO 'is_direct', 'power_level_content_override' ]) - && (isUndefined(value?.visibility) || isMatrixVisibility(value?.visibility)) + && isMatrixVisibilityOrUndefined(value?.visibility) && isStringOrUndefined(value?.room_alias_name) && isStringOrUndefined(value?.name) && isStringOrUndefined(value?.topic) - && (isUndefined(value?.invite) || isArrayOf(value?.invite, isMatrixUserId)) - && (isUndefined(value?.invite_3pid) || isArrayOf(value?.invite_3pid, isMatrixInvite3PidDTO)) - && isStringOrUndefined(value?.room_version) - && (isUndefined(value?.creation_content) || isPartialMatrixCreationContentDTO(value?.creation_content)) - && (isUndefined(value?.initial_state) || isArrayOf(value?.initial_state, isMatrixStateEvent)) - && (isUndefined(value?.preset) || isMatrixCreateRoomPreset(value?.preset)) + && isArrayOfOrUndefined(value?.invite, isMatrixUserId) + && isArrayOfOrUndefined(value?.invite_3pid, isMatrixInvite3PidDTO) + && isMatrixRoomVersionOrUndefined(value?.room_version) + && isPartialMatrixCreationContentDTOOrUndefined(value?.creation_content) + && isArrayOfOrUndefined(value?.initial_state, isMatrixStateEvent) + && isMatrixCreateRoomPresetOrUndefined(value?.preset) && isBooleanOrUndefined(value?.is_direct) - && (isUndefined(value?.power_level_content_override) || isMatrixPowerLevelEventContentDTO(value?.power_level_content_override)) + && isMatrixPowerLevelEventContentDTOOrUndefined(value?.power_level_content_override) ); } +export function explainMatrixCreateRoomDTO (value: any): string { + return explain([ + explainRegularObject(value), + explainNoOtherKeys(value, [ + 'visibility', + 'room_alias_name', + 'name', + 'topic', + 'invite', + 'invite_3pid', + 'room_version', + 'creation_content', + 'initial_state', + 'preset', + 'is_direct', + 'power_level_content_override' + ]), + explainProperty('visibility', explainMatrixVisibilityOrUndefined(value?.visibility)), + explainProperty('room_alias_name', explainStringOrUndefined(value?.room_alias_name)), + explainProperty('name', explainStringOrUndefined(value?.name)), + explainProperty('topic', explainStringOrUndefined(value?.topic)), + explainProperty('invite', explainArrayOfOrUndefined("MatrixUserId", explainMatrixUserId, value?.invite, isMatrixUserId)), + explainProperty('invite_3pid', explainArrayOfOrUndefined("MatrixInvite3PidDTO", explainMatrixInvite3PidDTO, value?.invite_3pid, isMatrixInvite3PidDTO)), + explainProperty('room_version', explainMatrixRoomVersionOrUndefined(value?.room_version)), + explainProperty('creation_content', explainPartialMatrixCreationContentDTOOrUndefined(value?.creation_content)), + explainProperty('initial_state', explainArrayOfOrUndefined("MatrixStateEvent", explainMatrixStateEvent, value?.initial_state, isMatrixStateEvent)), + explainProperty('preset', explainMatrixCreateRoomPresetOrUndefined(value?.preset)), + explainProperty('explain_direct', explainBooleanOrUndefined(value?.explain_direct)), + explainProperty('power_level_content_override', explainMatrixPowerLevelEventContentDTOOrUndefined(value?.power_level_content_override)) + ]); +} + export function stringifyMatrixCreateRoomDTO (value: MatrixCreateRoomDTO): string { return `MatrixCreateRoomDTO(${value})`; } diff --git a/types/request/createRoom/types/MatrixCreateRoomPreset.ts b/types/request/createRoom/types/MatrixCreateRoomPreset.ts index a288764..ab4ec76 100644 --- a/types/request/createRoom/types/MatrixCreateRoomPreset.ts +++ b/types/request/createRoom/types/MatrixCreateRoomPreset.ts @@ -1,5 +1,7 @@ // Copyright (c) 2021. Sendanor . All rights reserved. +import { explainNot, explainOk, explainOr } from "../../../../../core/modules/lodash"; + export enum MatrixCreateRoomPreset { PRIVATE_CHAT = "private_chat", PUBLIC_CHAT = "public_chat", @@ -8,18 +10,27 @@ export enum MatrixCreateRoomPreset { export function isMatrixCreateRoomPreset (value: any): value is MatrixCreateRoomPreset { switch (value) { - case MatrixCreateRoomPreset.PRIVATE_CHAT: case MatrixCreateRoomPreset.PUBLIC_CHAT: case MatrixCreateRoomPreset.TRUSTED_PRIVATE_CHAT: return true; - default: return false; - } } +export function explainMatrixCreateRoomPreset (value: any): string { + return isMatrixCreateRoomPreset(value) ? explainOk() : explainNot("MatrixCreateRoomPreset"); +} + +export function isMatrixCreateRoomPresetOrUndefined (value: any): value is MatrixCreateRoomPreset | undefined { + return value === undefined || isMatrixCreateRoomPreset(value); +} + +export function explainMatrixCreateRoomPresetOrUndefined (value: any): string { + return isMatrixCreateRoomPresetOrUndefined(value) ? explainOk() : explainNot( explainOr(["MatrixCreateRoomPreset", "undefined"])); +} + export function stringifyMatrixCreateRoomPreset (value: MatrixCreateRoomPreset): string { switch (value) { case MatrixCreateRoomPreset.PRIVATE_CHAT : return 'private_chat'; diff --git a/types/request/createRoom/types/MatrixEventPowerLevelsDTO.ts b/types/request/createRoom/types/MatrixEventPowerLevelsDTO.ts index 787b50c..3d389be 100644 --- a/types/request/createRoom/types/MatrixEventPowerLevelsDTO.ts +++ b/types/request/createRoom/types/MatrixEventPowerLevelsDTO.ts @@ -2,8 +2,12 @@ // Copyright (c) 2021. Sendanor . All rights reserved. import { + explainNot, + explainOk, + explainOr, isInteger, - isRegularObjectOf + isRegularObjectOf, + isUndefined } from "../../../../../core/modules/lodash"; import { isMatrixType, MatrixType } from "../../../core/MatrixType"; @@ -12,9 +16,19 @@ export type MatrixEventPowerLevelsDTO = { } export function isMatrixEventPowerLevelsDTO (value: any): value is MatrixEventPowerLevelsDTO { - return ( - isRegularObjectOf(value, isMatrixType, isInteger) - ); + return isRegularObjectOf(value, isMatrixType, isInteger); +} + +export function explainMatrixEventPowerLevelsDTO (value: any): string { + return isMatrixEventPowerLevelsDTO(value) ? explainOk() : explainNot("MatrixEventPowerLevelsDTO"); +} + +export function isMatrixEventPowerLevelsDTOOrUndefined (value: any): value is MatrixEventPowerLevelsDTO | undefined { + return isUndefined(value) || isMatrixEventPowerLevelsDTO(value); +} + +export function explainMatrixEventPowerLevelsDTOOrUndefined (value: any): string { + return isMatrixEventPowerLevelsDTO(value) ? explainOk() : explainNot(explainOr(["MatrixEventPowerLevelsDTO", "undefined"])); } export function stringifyMatrixEventPowerLevelsDTO (value: MatrixEventPowerLevelsDTO): string { diff --git a/types/request/createRoom/types/MatrixInvite3PidDTO.ts b/types/request/createRoom/types/MatrixInvite3PidDTO.ts index bac8c21..7626c13 100644 --- a/types/request/createRoom/types/MatrixInvite3PidDTO.ts +++ b/types/request/createRoom/types/MatrixInvite3PidDTO.ts @@ -1,12 +1,12 @@ -import { hasNoOtherKeysInDevelopment, isRegularObject, isString } from "../../../../../core/modules/lodash"; +// Copyright (c) 2021-2022. Heusala Group Oy . All rights reserved. -export interface MatrixInvite3PidDTO { +import { explain, explainNoOtherKeys, explainProperty, explainRegularObject, explainString, hasNoOtherKeysInDevelopment, isRegularObject, isString } from "../../../../../core/modules/lodash"; +export interface MatrixInvite3PidDTO { readonly id_server : string; readonly id_access_token : string; readonly medium : string; readonly address : string; - } export function isMatrixInvite3PidDTO (value: any): value is MatrixInvite3PidDTO { @@ -25,6 +25,24 @@ export function isMatrixInvite3PidDTO (value: any): value is MatrixInvite3PidDTO ); } +export function explainMatrixInvite3PidDTO (value : any) : string { + return explain( + [ + explainRegularObject(value), + explainNoOtherKeys(value, [ + 'id_server', + 'id_access_token', + 'medium', + 'address' + ]), + explainProperty("id_server", explainString(value?.id_server)), + explainProperty("id_access_token", explainString(value?.id_access_token)), + explainProperty("medium", explainString(value?.medium)), + explainProperty("address", explainString(value?.address)) + ] + ); +} + export function stringifyMatrixInvite3PidDTO (value: MatrixInvite3PidDTO): string { return `MatrixInvite3PidDTO(${value})`; } diff --git a/types/request/createRoom/types/MatrixNotificationPowerLevelsDTO.ts b/types/request/createRoom/types/MatrixNotificationPowerLevelsDTO.ts index 9684fe4..0894074 100644 --- a/types/request/createRoom/types/MatrixNotificationPowerLevelsDTO.ts +++ b/types/request/createRoom/types/MatrixNotificationPowerLevelsDTO.ts @@ -1,10 +1,13 @@ // Copyright (c) 2021. Sendanor . All rights reserved. import { + explain, explainNoOtherKeys, explainNot, explainNumberOrUndefined, explainOk, explainOr, explainProperty, explainRegularObject, hasNoOtherKeysInDevelopment, isNumberOrUndefined, - isRegularObject + isRegularObject, isUndefined } from "../../../../../core/modules/lodash"; +import { isMatrixEventPowerLevelsDTO, MatrixEventPowerLevelsDTO } from "./MatrixEventPowerLevelsDTO"; +import { isMatrixUserPowerLevelsDTOOrUndefined } from "./MatrixUserPowerLevelsDTO"; export interface MatrixNotificationPowerLevelsDTO { readonly room: number; @@ -20,6 +23,26 @@ export function isMatrixNotificationPowerLevelsDTO (value: any): value is Matrix ); } +export function explainMatrixNotificationPowerLevelsDTO (value: any): string { + return explain( + [ + explainRegularObject(value), + explainNoOtherKeys(value, [ + 'room' + ]), + explainProperty("room", explainNumberOrUndefined(value?.room)) + ] + ); +} + +export function isMatrixNotificationPowerLevelsDTOOrUndefined (value: any): value is MatrixNotificationPowerLevelsDTO | undefined { + return isUndefined(value) || isMatrixNotificationPowerLevelsDTO(value); +} + +export function explainMatrixNotificationPowerLevelsDTOOrUndefined (value: any): string { + return isMatrixNotificationPowerLevelsDTOOrUndefined(value) ? explainOk() : explainNot(explainOr(["MatrixNotificationPowerLevelsDTO", "undefined"])); +} + export function stringifyMatrixNotificationPowerLevelsDTO (value: MatrixNotificationPowerLevelsDTO): string { return `MatrixNotificationPowerLevelsDTO(${value})`; } diff --git a/types/request/createRoom/types/MatrixRoomPowerLevelsEventDTO.ts b/types/request/createRoom/types/MatrixRoomPowerLevelsEventDTO.ts index b68c64e..b8b0ec6 100644 --- a/types/request/createRoom/types/MatrixRoomPowerLevelsEventDTO.ts +++ b/types/request/createRoom/types/MatrixRoomPowerLevelsEventDTO.ts @@ -1,16 +1,24 @@ // Copyright (c) 2021. Sendanor . All rights reserved. import { + explain, + explainIntegerOrUndefined, + explainNoOtherKeys, + explainNot, + explainOk, + explainOr, + explainProperty, + explainRegularObject, hasNoOtherKeysInDevelopment, isIntegerOrUndefined, - isRegularObject, isUndefined + isRegularObject, + isUndefined } from "../../../../../core/modules/lodash"; -import { MatrixEventPowerLevelsDTO, isMatrixEventPowerLevelsDTO } from "./MatrixEventPowerLevelsDTO"; -import { MatrixUserPowerLevelsDTO, isMatrixUserPowerLevelsDTO } from "./MatrixUserPowerLevelsDTO"; -import { MatrixNotificationPowerLevelsDTO, isMatrixNotificationPowerLevelsDTO } from "./MatrixNotificationPowerLevelsDTO"; +import { MatrixEventPowerLevelsDTO, isMatrixEventPowerLevelsDTOOrUndefined, explainMatrixEventPowerLevelsDTOOrUndefined } from "./MatrixEventPowerLevelsDTO"; +import { MatrixUserPowerLevelsDTO, isMatrixUserPowerLevelsDTOOrUndefined, explainMatrixUserPowerLevelsDTOOrUndefined } from "./MatrixUserPowerLevelsDTO"; +import { MatrixNotificationPowerLevelsDTO, isMatrixNotificationPowerLevelsDTOOrUndefined, explainMatrixNotificationPowerLevelsDTOOrUndefined } from "./MatrixNotificationPowerLevelsDTO"; export interface MatrixRoomPowerLevelsEventDTO { - readonly ban ?: number; readonly events ?: MatrixEventPowerLevelsDTO; readonly events_default ?: number; @@ -21,7 +29,6 @@ export interface MatrixRoomPowerLevelsEventDTO { readonly users ?: MatrixUserPowerLevelsDTO; readonly users_default ?: number; readonly notifications ?: MatrixNotificationPowerLevelsDTO; - } export function isMatrixPowerLevelEventContentDTO (value: any): value is MatrixRoomPowerLevelsEventDTO { @@ -40,18 +47,56 @@ export function isMatrixPowerLevelEventContentDTO (value: any): value is MatrixR 'notifications' ]) && isIntegerOrUndefined(value?.ban) - && isMatrixEventPowerLevelsDTO(value?.events) + && isMatrixEventPowerLevelsDTOOrUndefined(value?.events) && isIntegerOrUndefined(value?.events_default) && isIntegerOrUndefined(value?.invite) && isIntegerOrUndefined(value?.kick) && isIntegerOrUndefined(value?.redact) && isIntegerOrUndefined(value?.state_default) - && ( isUndefined(value?.users) || isMatrixUserPowerLevelsDTO(value?.users) ) + && isMatrixUserPowerLevelsDTOOrUndefined(value?.users) && isIntegerOrUndefined(value?.users_default) - && ( isUndefined(value?.users) || isMatrixNotificationPowerLevelsDTO(value?.notifications) ) + && isMatrixNotificationPowerLevelsDTOOrUndefined(value?.notifications) + ); +} + +export function explainMatrixPowerLevelEventContentDTO (value : any) : string { + return explain( + [ + explainRegularObject(value), + explainNoOtherKeys(value, [ + 'ban', + 'events', + 'events_default', + 'invite', + 'kick', + 'redact', + 'state_default', + 'users', + 'users_default', + 'notifications' + ]), + explainProperty("ban", explainIntegerOrUndefined(value?.ban)), + explainProperty("events", explainMatrixEventPowerLevelsDTOOrUndefined(value?.events)), + explainProperty("events_default", explainIntegerOrUndefined(value?.events_default)), + explainProperty("invite", explainIntegerOrUndefined(value?.invite)), + explainProperty("kick", explainIntegerOrUndefined(value?.kick)), + explainProperty("redact", explainIntegerOrUndefined(value?.redact)), + explainProperty("state_default", explainIntegerOrUndefined(value?.state_default)), + explainProperty("users", explainMatrixUserPowerLevelsDTOOrUndefined(value?.users)), + explainProperty("users_default", explainIntegerOrUndefined(value?.users_default)), + explainProperty("notifications", explainMatrixNotificationPowerLevelsDTOOrUndefined(value?.notifications)) + ] ); } +export function isMatrixPowerLevelEventContentDTOOrUndefined (value: any): value is MatrixRoomPowerLevelsEventDTO | undefined { + return isUndefined(value) || isMatrixPowerLevelEventContentDTO(value); +} + +export function explainMatrixPowerLevelEventContentDTOOrUndefined (value: any): string { + return isMatrixPowerLevelEventContentDTOOrUndefined(value) ? explainOk() : explainNot(explainOr(["MatrixPowerLevelEventContentDTO", "undefined"])); +} + export function stringifyMatrixPowerLevelEventContentDTO (value: MatrixRoomPowerLevelsEventDTO): string { return `MatrixPowerLevelEventContentDTO(${value})`; } diff --git a/types/request/createRoom/types/MatrixUserPowerLevelsDTO.ts b/types/request/createRoom/types/MatrixUserPowerLevelsDTO.ts index 05435e5..5371df1 100644 --- a/types/request/createRoom/types/MatrixUserPowerLevelsDTO.ts +++ b/types/request/createRoom/types/MatrixUserPowerLevelsDTO.ts @@ -1,6 +1,7 @@ +// Copyright (c) 2022. Heusala Group Oy . All rights reserved. // Copyright (c) 2021. Sendanor . All rights reserved. -import { isInteger, isRegularObjectOf } from "../../../../../core/modules/lodash"; +import { explainNot, explainOk, explainOr, isInteger, isRegularObjectOf, isUndefined } from "../../../../../core/modules/lodash"; import { MatrixUserId, isMatrixUserId } from "../../../core/MatrixUserId"; export type MatrixUserPowerLevelsDTO = { @@ -8,9 +9,19 @@ export type MatrixUserPowerLevelsDTO = { } export function isMatrixUserPowerLevelsDTO (value: any): value is MatrixUserPowerLevelsDTO { - return ( - isRegularObjectOf(value, isMatrixUserId, isInteger) - ); + return isRegularObjectOf(value, isMatrixUserId, isInteger); +} + +export function explainMatrixUserPowerLevelsDTO (value: any): string { + return isMatrixUserPowerLevelsDTO(value) ? explainOk() : explainNot("MatrixUserPowerLevelsDTO"); +} + +export function isMatrixUserPowerLevelsDTOOrUndefined (value: any): value is MatrixUserPowerLevelsDTO | undefined { + return isUndefined(value) || isMatrixUserPowerLevelsDTO(value); +} + +export function explainMatrixUserPowerLevelsDTOOrUndefined (value: any): string { + return isMatrixUserPowerLevelsDTOOrUndefined(value) ? explainOk() : explainNot(explainOr(["MatrixUserPowerLevelsDTO", "undefined"])); } export function stringifyMatrixUserPowerLevelsDTO (value: MatrixUserPowerLevelsDTO): string { diff --git a/types/request/createRoom/types/MatrixVisibility.ts b/types/request/createRoom/types/MatrixVisibility.ts index 61beb2b..f0be9f6 100644 --- a/types/request/createRoom/types/MatrixVisibility.ts +++ b/types/request/createRoom/types/MatrixVisibility.ts @@ -1,5 +1,7 @@ // Copyright (c) 2021. Sendanor . All rights reserved. +import { explainNot, explainOk, explainOr } from "../../../../../core/modules/lodash"; + export enum MatrixVisibility { PUBLIC = "public", PRIVATE = "private" @@ -10,13 +12,30 @@ export function isMatrixVisibility (value: any): value is MatrixVisibility { case MatrixVisibility.PUBLIC: case MatrixVisibility.PRIVATE: return true; - default: return false; + } +} +export function explainMatrixVisibility (value: any): string { + return isMatrixVisibility(value) ? explainOk() : explainNot('MatrixVisibility'); +} + +export function isMatrixVisibilityOrUndefined (value: any): value is MatrixVisibility | undefined { + if (value === undefined) return true; + switch (value) { + case MatrixVisibility.PUBLIC: + case MatrixVisibility.PRIVATE: + return true; + default: + return false; } } +export function explainMatrixVisibilityOrUndefined (value: any): string { + return isMatrixVisibilityOrUndefined(value) ? explainOk() : explainNot(explainOr(['MatrixVisibility', 'undefined'])); +} + export function stringifyMatrixVisibility (value: MatrixVisibility): string { switch (value) { case MatrixVisibility.PUBLIC :