Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
import { IdentityDeletionProcessDTO } from "@nmshd/runtime-types";
import { IdentityDeletionProcess } from "@nmshd/transport";
import { RuntimeErrors } from "../../common";

export class IdentityDeletionProcessMapper {
public static toIdentityDeletionProcessDTO(identityDeletionProcess: IdentityDeletionProcess): IdentityDeletionProcessDTO {
if (!identityDeletionProcess.cache) {
throw RuntimeErrors.general.cacheEmpty(IdentityDeletionProcess, identityDeletionProcess.id.toString());
}

return {
id: identityDeletionProcess.id.toString(),
createdAt: identityDeletionProcess.cache.createdAt?.toString(),
createdByDevice: identityDeletionProcess.cache.createdByDevice?.toString(),
approvalPeriodEndsAt: identityDeletionProcess.cache.approvalPeriodEndsAt?.toString(),
rejectedAt: identityDeletionProcess.cache.rejectedAt?.toString(),
rejectedByDevice: identityDeletionProcess.cache.rejectedByDevice?.toString(),
approvedAt: identityDeletionProcess.cache.approvedAt?.toString(),
approvedByDevice: identityDeletionProcess.cache.approvedByDevice?.toString(),
gracePeriodEndsAt: identityDeletionProcess.cache.gracePeriodEndsAt?.toString(),
status: identityDeletionProcess.cache.status,
cancelledAt: identityDeletionProcess.cache.cancelledAt?.toString(),
cancelledByDevice: identityDeletionProcess.cache.cancelledByDevice?.toString()
createdAt: identityDeletionProcess.createdAt?.toString(),
createdByDevice: identityDeletionProcess.createdByDevice?.toString(),
approvalPeriodEndsAt: identityDeletionProcess.approvalPeriodEndsAt?.toString(),
rejectedAt: identityDeletionProcess.rejectedAt?.toString(),
rejectedByDevice: identityDeletionProcess.rejectedByDevice?.toString(),
approvedAt: identityDeletionProcess.approvedAt?.toString(),
approvedByDevice: identityDeletionProcess.approvedByDevice?.toString(),
gracePeriodEndsAt: identityDeletionProcess.gracePeriodEndsAt?.toString(),
status: identityDeletionProcess.status,
cancelledAt: identityDeletionProcess.cancelledAt?.toString(),
cancelledByDevice: identityDeletionProcess.cancelledByDevice?.toString()
};
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import { log } from "@js-soft/ts-utils";
import { CoreId } from "@nmshd/core-types";
import { ClientResult, ControllerName, DbCollectionName, TransportController } from "../../core";
import { IdentityDeletionProcessStatusChangedEvent } from "../../events";
import { AccountController } from "../accounts/AccountController";
import { SynchronizedCollection } from "../sync/SynchronizedCollection";
import { BackboneIdentityDeletionProcess } from "./backbone/BackboneIdentityDeletionProcess";
import { IdentityDeletionProcessClient } from "./backbone/IdentityDeletionProcessClient";
import { CachedIdentityDeletionProcess } from "./data/CachedIdentityDeletionProcess";
import { IdentityDeletionProcess } from "./data/IdentityDeletionProcess";
import { IdentityDeletionProcessStatus } from "./data/IdentityDeletionProcessStatus";

Expand Down Expand Up @@ -37,7 +35,7 @@ export class IdentityDeletionProcessController extends TransportController {
return newIdentityDeletionProcess;
}

public async updateCacheOfExistingIdentityDeletionProcess(identityDeletionProcess: string): Promise<IdentityDeletionProcess> {
public async updateExistingIdentityDeletionProcessFromBackbone(identityDeletionProcess: string): Promise<IdentityDeletionProcess> {
const identityDeletionProcessJSONResponse = await this.identityDeletionProcessClient.getIdentityDeletionProcess(identityDeletionProcess);
const newIdentityDeletionProcess = this.createIdentityDeletionProcessFromBackboneResponse(identityDeletionProcessJSONResponse);

Expand All @@ -52,11 +50,7 @@ export class IdentityDeletionProcessController extends TransportController {
}

public createIdentityDeletionProcessFromBackboneResponse(response: ClientResult<BackboneIdentityDeletionProcess>): IdentityDeletionProcess {
const { id, ...cache } = response.value;

const identityDeletionProcess = IdentityDeletionProcess.from({ id: id });
const cachedIdentityDeletionProcess = CachedIdentityDeletionProcess.from(cache);
identityDeletionProcess.setCache(cachedIdentityDeletionProcess);
const identityDeletionProcess = IdentityDeletionProcess.from({ ...response.value });
return identityDeletionProcess;
}

Expand Down Expand Up @@ -103,27 +97,12 @@ export class IdentityDeletionProcessController extends TransportController {
.filter((identityDeletionProcess) => !!identityDeletionProcess);
}

public async getIdentityDeletionProcessByStatus(...identityDeletionProcessStatus: IdentityDeletionProcessStatus[]): Promise<IdentityDeletionProcess | undefined> {
const identityDeletionProcess = await this.identityDeletionProcessCollection.findOne({
$or: identityDeletionProcessStatus.map((status) => {
return { "cache.status": status };
})
});
return identityDeletionProcess ? IdentityDeletionProcess.from(identityDeletionProcess) : undefined;
}

public async fetchCaches(ids: CoreId[]): Promise<{ id: CoreId; cache: CachedIdentityDeletionProcess }[]> {
if (ids.length === 0) return [];
const getIdentityDeletionPromises = ids.map((id) => this.identityDeletionProcessClient.getIdentityDeletionProcess(id.toString()));
const backboneTokens: { id: CoreId; cache: CachedIdentityDeletionProcess }[] = [];
public async getIdentityDeletionProcessByStatus(
...identityDeletionProcessStatus: [IdentityDeletionProcessStatus, ...IdentityDeletionProcessStatus[]]
): Promise<IdentityDeletionProcess | undefined> {
const query: any = { $or: identityDeletionProcessStatus.map((status) => ({ status: status })) };

const identityDeletionProcesses = await Promise.all(getIdentityDeletionPromises);

for (const identityDeletionProcess of identityDeletionProcesses) {
const { id, ...cache } = identityDeletionProcess.value;
backboneTokens.push({ id: CoreId.from(id), cache: CachedIdentityDeletionProcess.from(cache) });
}

return backboneTokens;
const identityDeletionProcess = await this.identityDeletionProcessCollection.findOne(query);
return identityDeletionProcess ? IdentityDeletionProcess.from(identityDeletionProcess) : undefined;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,103 @@ import { serialize, type, validate } from "@js-soft/ts-serval";
import { CoreDate, CoreId } from "@nmshd/core-types";
import { nameof } from "ts-simple-nameof";
import { CoreSynchronizable } from "../../../core";
import { CachedIdentityDeletionProcess, CachedIdentityDeletionProcessJSON } from "./CachedIdentityDeletionProcess";
import { IdentityDeletionProcessStatus } from "./IdentityDeletionProcessStatus";

export interface IdentityDeletionProcessJSON {
id: string;
cache?: CachedIdentityDeletionProcessJSON;
cachedAt?: string;
status: IdentityDeletionProcessStatus;
createdAt?: string;
createdByDevice?: string;
approvalPeriodEndsAt?: string;
rejectedAt?: string;
rejectedByDevice?: string;
approvedAt?: string;
approvedByDevice?: string;
gracePeriodEndsAt?: string;
cancelledAt?: string;
cancelledByDevice?: string;
}

export interface IIdentityDeletionProcess {
id: CoreId;
cache?: CachedIdentityDeletionProcess;
cachedAt?: CoreDate;
status: IdentityDeletionProcessStatus;
createdAt?: CoreDate;
createdByDevice?: CoreId;
approvalPeriodEndsAt?: CoreDate;
rejectedAt?: CoreDate;
rejectedByDevice?: CoreId;
approvedAt?: CoreDate;
approvedByDevice?: CoreId;
gracePeriodEndsAt?: CoreDate;
cancelledAt?: CoreDate;
cancelledByDevice?: CoreId;
}

@type("IdentityDeletionProcess")
export class IdentityDeletionProcess extends CoreSynchronizable implements IIdentityDeletionProcess {
public override readonly technicalProperties = [nameof<IdentityDeletionProcess>((r) => r.id)];
public override readonly technicalProperties = [
nameof<IdentityDeletionProcess>((r) => r.id),
nameof<IdentityDeletionProcess>((r) => r.status),
nameof<IdentityDeletionProcess>((r) => r.createdAt),
nameof<IdentityDeletionProcess>((r) => r.createdByDevice),
nameof<IdentityDeletionProcess>((r) => r.approvalPeriodEndsAt)
];

public override readonly contentProperties = [
nameof<IdentityDeletionProcess>((r) => r.rejectedAt),
nameof<IdentityDeletionProcess>((r) => r.rejectedByDevice),
nameof<IdentityDeletionProcess>((r) => r.approvedAt),
nameof<IdentityDeletionProcess>((r) => r.approvedByDevice),
nameof<IdentityDeletionProcess>((r) => r.gracePeriodEndsAt),
nameof<IdentityDeletionProcess>((r) => r.cancelledAt),
nameof<IdentityDeletionProcess>((r) => r.cancelledByDevice)
];
Comment thread
britsta marked this conversation as resolved.

@validate()
@serialize()
public status: IdentityDeletionProcessStatus;

@validate({ nullable: true })
@serialize()
public createdAt?: CoreDate;

@validate({ nullable: true })
@serialize()
public createdByDevice?: CoreId;

@validate({ nullable: true })
@serialize()
public approvalPeriodEndsAt?: CoreDate;

@validate({ nullable: true })
@serialize()
public rejectedAt?: CoreDate;

@validate({ nullable: true })
@serialize()
public cache?: CachedIdentityDeletionProcess;
public rejectedByDevice?: CoreId;

@validate({ nullable: true })
@serialize()
public cachedAt?: CoreDate;
public approvedAt?: CoreDate;

@validate({ nullable: true })
@serialize()
public approvedByDevice?: CoreId;

@validate({ nullable: true })
@serialize()
public gracePeriodEndsAt?: CoreDate;

@validate({ nullable: true })
@serialize()
public cancelledAt?: CoreDate;

@validate({ nullable: true })
@serialize()
public cancelledByDevice?: CoreId;

public static from(value: IIdentityDeletionProcess | IdentityDeletionProcessJSON): IdentityDeletionProcess {
return this.fromAny(value);
}

public setCache(cache: CachedIdentityDeletionProcess): this {
this.cache = cache;
this.cachedAt = CoreDate.utc();
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@ import _ from "lodash";
import { TransportCoreErrors, TransportError, TransportIds } from "../../core";
import { DbCollectionName } from "../../core/DbCollectionName";
import { ICacheable } from "../../core/ICacheable";
import { CachedIdentityDeletionProcess } from "../accounts/data/CachedIdentityDeletionProcess";
import { IdentityDeletionProcess } from "../accounts/data/IdentityDeletionProcess";
import { IdentityDeletionProcessController } from "../accounts/IdentityDeletionProcessController";
import { FileController } from "../files/FileController";
import { CachedFile } from "../files/local/CachedFile";
import { File } from "../files/local/File";
Expand Down Expand Up @@ -42,7 +39,7 @@ export class DatawalletModificationsProcessor {
this.cacheChanges = modifications.filter((m) => m.type === DatawalletModificationType.CacheChanged);
}

private readonly collectionsWithCacheableItems: string[] = [DbCollectionName.Files, DbCollectionName.RelationshipTemplates, DbCollectionName.IdentityDeletionProcess];
private readonly collectionsWithCacheableItems: string[] = [DbCollectionName.Files, DbCollectionName.RelationshipTemplates];

public async execute(): Promise<void> {
await this.applyModifications();
Expand Down Expand Up @@ -137,13 +134,11 @@ export class DatawalletModificationsProcessor {

const caches = await this.cacheFetcher.fetchCacheFor({
files: cacheChangesGroupedByCollection.fileIds,
relationshipTemplates: cacheChangesGroupedByCollection.relationshipTemplateIds,
identityDeletionProcesses: cacheChangesGroupedByCollection.identityDeletionProcessIds
relationshipTemplates: cacheChangesGroupedByCollection.relationshipTemplateIds
});

await this.saveNewCaches(caches.files, DbCollectionName.Files, File);
await this.saveNewCaches(caches.relationshipTemplates, DbCollectionName.RelationshipTemplates, RelationshipTemplate);
await this.saveNewCaches(caches.identityDeletionProcesses, DbCollectionName.IdentityDeletionProcess, IdentityDeletionProcess);
}

@log()
Expand All @@ -163,13 +158,9 @@ export class DatawalletModificationsProcessor {
const groups = _.groupBy(cacheChanges, (c) => c.collection);

const fileIds = (groups[DbCollectionName.Files] ?? []).map((m) => m.objectIdentifier);
const messageIds = (groups[DbCollectionName.Messages] ?? []).map((m) => m.objectIdentifier);
const relationshipIds = (groups[DbCollectionName.Relationships] ?? []).map((m) => m.objectIdentifier);
const relationshipTemplateIds = (groups[DbCollectionName.RelationshipTemplates] ?? []).map((m) => m.objectIdentifier);
const tokenIds = (groups[DbCollectionName.Tokens] ?? []).map((m) => m.objectIdentifier);
const identityDeletionProcessIds = (groups[DbCollectionName.IdentityDeletionProcess] ?? []).map((m) => m.objectIdentifier);

return { fileIds, messageIds, relationshipTemplateIds, tokenIds, relationshipIds, identityDeletionProcessIds };
return { fileIds, relationshipTemplateIds };
}

private async saveNewCaches<T extends ICacheable>(caches: FetchCacheOutputItem<any>[], collectionName: DbCollectionName, constructorOfT: new () => T) {
Expand All @@ -191,18 +182,12 @@ export class DatawalletModificationsProcessor {
export class CacheFetcher {
public constructor(
private readonly fileController: FileController,
private readonly relationshipTemplateController: RelationshipTemplateController,
private readonly identityDeletionProcessController: IdentityDeletionProcessController
private readonly relationshipTemplateController: RelationshipTemplateController
) {}

public async fetchCacheFor(input: FetchCacheInput): Promise<FetchCacheOutput> {
const caches = await Promise.all([
this.fetchCaches(this.fileController, input.files),
this.fetchCaches(this.relationshipTemplateController, input.relationshipTemplates),
this.fetchCaches(this.identityDeletionProcessController, input.identityDeletionProcesses)
]);

const output: FetchCacheOutput = { files: caches[0], relationshipTemplates: caches[1], identityDeletionProcesses: caches[2] };
const caches = await Promise.all([this.fetchCaches(this.fileController, input.files), this.fetchCaches(this.relationshipTemplateController, input.relationshipTemplates)]);
const output: FetchCacheOutput = { files: caches[0], relationshipTemplates: caches[1] };

return output;
}
Expand All @@ -225,7 +210,6 @@ interface FetchCacheInput {
interface FetchCacheOutput {
files: FetchCacheOutputItem<CachedFile>[];
relationshipTemplates: FetchCacheOutputItem<CachedRelationshipTemplate>[];
identityDeletionProcesses: FetchCacheOutputItem<CachedIdentityDeletionProcess>[];
}

interface FetchCacheOutputItem<TCache> {
Expand Down
2 changes: 1 addition & 1 deletion packages/transport/src/modules/sync/SyncController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export class SyncController extends TransportController {

private _cacheFetcher?: CacheFetcher;
private get cacheFetcher() {
this._cacheFetcher ??= new CacheFetcher(this.parent.files, this.parent.relationshipTemplates, this.parent.identityDeletionProcess);
this._cacheFetcher ??= new CacheFetcher(this.parent.files, this.parent.relationshipTemplates);

return this._cacheFetcher;
}
Expand Down
Loading