Skip to content
This repository has been archived by the owner on Feb 10, 2024. It is now read-only.

Commit

Permalink
Improved illegal DTO explaning in debug log and fixed room creation h…
Browse files Browse the repository at this point in the history
  • Loading branch information
thejhh committed Aug 6, 2022
1 parent c3c2be3 commit 6edb1c3
Show file tree
Hide file tree
Showing 13 changed files with 299 additions and 62 deletions.
34 changes: 20 additions & 14 deletions server/types/repository/room/RoomRepositoryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,7 @@ export class RoomRepositoryService implements RepositoryService<StoredRoomReposi
public async getAllRooms () : Promise<readonly RoomRepositoryItem[]> {
const list : readonly RepositoryEntry<StoredRoomRepositoryItem>[] = await this._getAllRooms();
return map(list, (item: RepositoryEntry<StoredRoomRepositoryItem>) : RoomRepositoryItem => {
return parseRoomRepositoryItem(
item.id,
item.data
);
return this._toRoomRepositoryItem(item);
});
}

Expand All @@ -71,21 +68,15 @@ export class RoomRepositoryService implements RepositoryService<StoredRoomReposi
) : Promise<readonly RoomRepositoryItem[]> {
const list : readonly RepositoryEntry<StoredRoomRepositoryItem>[] = await this._getSomeRooms(idList);
return map(list, (item: RepositoryEntry<StoredRoomRepositoryItem>) : RoomRepositoryItem => {
return parseRoomRepositoryItem(
item.id,
item.data
);
return this._toRoomRepositoryItem(item);
});
}

public async getRoomById (id: string) : Promise<RoomRepositoryItem | undefined> {
await this._sharedClientService.waitForInitialization();
const foundItem : RepositoryEntry<StoredRoomRepositoryItem> | undefined = await this._repository.findById(id);
if (!foundItem) return undefined;
return parseRoomRepositoryItem(
foundItem.id,
foundItem.data
);
return this._toRoomRepositoryItem(foundItem);
}

public async deleteAllRooms () : Promise<void> {
Expand All @@ -107,15 +98,15 @@ export class RoomRepositoryService implements RepositoryService<StoredRoomReposi
) : Promise<RoomRepositoryItem> {
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 (
item : RoomRepositoryItem
) : Promise<RoomRepositoryItem> {
await this._sharedClientService.waitForInitialization();
const foundItem = await this._repository.updateOrCreateItem(toStoredRoomRepositoryItem(item));
return parseRoomRepositoryItem(foundItem.id, foundItem.data);
return this._toRoomRepositoryItem(foundItem);
}

// PRIVATE METHODS
Expand All @@ -130,4 +121,19 @@ export class RoomRepositoryService implements RepositoryService<StoredRoomReposi
return await this._repository.getSome(idList);
}

private _toRoomRepositoryItem (storedItem: RepositoryEntry<StoredRoomRepositoryItem>) : 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;
}

}
15 changes: 14 additions & 1 deletion types/MatrixRoomVersion.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// Copyright (c) 2022. Heusala Group Oy <info@heusalagroup.fi>. All rights reserved.

import { explainNot, explainOk, explainOr } from "../../core/modules/lodash";

export enum MatrixRoomVersion {
V1 = "1",
V2 = "2",
Expand Down Expand Up @@ -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';
Expand Down
26 changes: 24 additions & 2 deletions types/core/MatrixStateEvent.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
// Copyright (c) 2021. Sendanor <info@sendanor.fi>. 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";

Expand Down Expand Up @@ -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})`;
}
Expand Down
6 changes: 5 additions & 1 deletion types/core/MatrixUserId.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) 2021. Sendanor <info@sendanor.fi>. All rights reserved.

import { isString } from "../../../core/modules/lodash";
import { explainNot, explainOk, isString } from "../../../core/modules/lodash";

export type MatrixUserId = string;

Expand All @@ -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})`;
}
Expand Down
12 changes: 12 additions & 0 deletions types/event/roomCreate/MatrixRoomCreateEventDTO.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
// Copyright (c) 2022. Heusala Group Oy <info@heusalagroup.fi>. All rights reserved.
// Copyright (c) 2021. Sendanor <info@sendanor.fi>. All rights reserved.

import {
explainNot,
explainOk, explainOr,
hasNoOtherKeysInDevelopment,
isBooleanOrUndefined,
isRegularObject,
Expand Down Expand Up @@ -49,6 +52,15 @@ export function isPartialMatrixCreationContentDTO (value: any): value is Partial
);
}


export function isPartialMatrixCreationContentDTOOrUndefined (value: any) : value is Partial<MatrixRoomCreateEventDTO> | undefined {
return value === undefined || isPartialMatrixCreationContentDTO(value);
}

export function explainPartialMatrixCreationContentDTOOrUndefined (value: any) : string {
return isPartialMatrixCreationContentDTOOrUndefined(value) ? explainOk() : explainNot( explainOr(['Partial<MatrixCreationContentDTO>', "undefined"]) );
}

export function stringifyMatrixCreationContentDTO (value: MatrixRoomCreateEventDTO): string {
return `MatrixCreationContentDTO(${value})`;
}
Expand Down
77 changes: 58 additions & 19 deletions types/request/createRoom/MatrixCreateRoomDTO.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
// Copyright (c) 2022. Heusala Group Oy <info@heusalagroup.fi>. All rights reserved.
// Copyright (c) 2021. Sendanor <info@sendanor.fi>. 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 {

Expand Down Expand Up @@ -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<MatrixUserId>(value?.invite, isMatrixUserId))
&& (isUndefined(value?.invite_3pid) || isArrayOf<MatrixInvite3PidDTO>(value?.invite_3pid, isMatrixInvite3PidDTO))
&& isStringOrUndefined(value?.room_version)
&& (isUndefined(value?.creation_content) || isPartialMatrixCreationContentDTO(value?.creation_content))
&& (isUndefined(value?.initial_state) || isArrayOf<MatrixStateEvent>(value?.initial_state, isMatrixStateEvent))
&& (isUndefined(value?.preset) || isMatrixCreateRoomPreset(value?.preset))
&& isArrayOfOrUndefined<MatrixUserId>(value?.invite, isMatrixUserId)
&& isArrayOfOrUndefined<MatrixInvite3PidDTO>(value?.invite_3pid, isMatrixInvite3PidDTO)
&& isMatrixRoomVersionOrUndefined(value?.room_version)
&& isPartialMatrixCreationContentDTOOrUndefined(value?.creation_content)
&& isArrayOfOrUndefined<MatrixStateEvent>(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>("MatrixUserId", explainMatrixUserId, value?.invite, isMatrixUserId)),
explainProperty('invite_3pid', explainArrayOfOrUndefined<MatrixInvite3PidDTO>("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>("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})`;
}
Expand Down
17 changes: 14 additions & 3 deletions types/request/createRoom/types/MatrixCreateRoomPreset.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// Copyright (c) 2021. Sendanor <info@sendanor.fi>. All rights reserved.

import { explainNot, explainOk, explainOr } from "../../../../../core/modules/lodash";

export enum MatrixCreateRoomPreset {
PRIVATE_CHAT = "private_chat",
PUBLIC_CHAT = "public_chat",
Expand All @@ -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';
Expand Down
22 changes: 18 additions & 4 deletions types/request/createRoom/types/MatrixEventPowerLevelsDTO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@
// Copyright (c) 2021. Sendanor <info@sendanor.fi>. All rights reserved.

import {
explainNot,
explainOk,
explainOr,
isInteger,
isRegularObjectOf
isRegularObjectOf,
isUndefined
} from "../../../../../core/modules/lodash";
import { isMatrixType, MatrixType } from "../../../core/MatrixType";

Expand All @@ -12,9 +16,19 @@ export type MatrixEventPowerLevelsDTO = {
}

export function isMatrixEventPowerLevelsDTO (value: any): value is MatrixEventPowerLevelsDTO {
return (
isRegularObjectOf<MatrixType, number>(value, isMatrixType, isInteger)
);
return isRegularObjectOf<MatrixType, number>(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 {
Expand Down
Loading

0 comments on commit 6edb1c3

Please sign in to comment.