Skip to content

Commit

Permalink
Add deletionDate to relationship's deletion info (#290)
Browse files Browse the repository at this point in the history
* feat: add deletion date to the deletion info of an relationship

* chore: remove test for the deletion date to be in the future

* chore: make deletion date not optional

* chore: add deletionDate from PeerDeleted external event

* chore: fix PeerDeletedExternalEventProcessor test

* chore: add default for deletionDate

* chore: add test for default deletionDate

* chore: split PeerDeletionInfo tests

* test: add test for saving the deletionDate via external event

* chore: add switch case

* chore: remove test state

* fix: overwriting of deletiong date

* test: use same date object in external event processor test

* chore: consisten indentation

* chore: consisten indentation

* chore: short hand declaration

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
sebbi08 and mergify[bot] authored Oct 8, 2024
1 parent 6a46d44 commit 52f42e7
Show file tree
Hide file tree
Showing 12 changed files with 84 additions and 17 deletions.
9 changes: 5 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"test:teardown": "docker compose -f .dev/compose.yml down -fsv"
},
"devDependencies": {
"@js-soft/eslint-config-ts": "^1.6.9",
"@js-soft/eslint-config-ts": "^1.6.10",
"@js-soft/license-check": "^1.0.9",
"@types/jest": "^29.5.13",
"@types/node": "^22.7.4",
Expand Down
1 change: 1 addition & 0 deletions packages/runtime/src/dataViews/DataViewExpander.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1782,6 +1782,7 @@ export class DataViewExpander {
type: "RelationshipDVO",
status: relationship.status,
peerDeletionStatus: relationship.peerDeletionInfo?.deletionStatus,
peerDeletionDate: relationship.peerDeletionInfo?.deletionDate,
statusText: statusText,
direction: direction,
isPinned: relationshipSetting.isPinned,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export interface RelationshipDVO extends DataViewObject {
type: "RelationshipDVO";
status: string;
peerDeletionStatus?: PeerDeletionStatus;
peerDeletionDate?: string;
direction: RelationshipDirection;
statusText: string;
isPinned: boolean;
Expand Down
1 change: 1 addition & 0 deletions packages/runtime/src/types/transport/RelationshipDTO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export enum PeerDeletionStatus {

export interface PeerDeletionInfoDTO {
deletionStatus: PeerDeletionStatus;
deletionDate: string;
}

export interface RelationshipDTO {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ beforeAll(async () => {
relationshipId = (await establishRelationship(services1.transport, services2.transport)).id;
}, 30000);

afterAll(async () => {
return await serviceProvider.stop();
});

beforeEach(() => {
services1.eventBus.reset();
services2.eventBus.reset();
});

afterAll(async () => {
return await serviceProvider.stop();
});

afterEach(async () => {
const activeIdentityDeletionProcess = await services1.transport.identityDeletionProcesses.getActiveIdentityDeletionProcess();
if (!activeIdentityDeletionProcess.isSuccess) {
Expand All @@ -34,6 +34,7 @@ afterEach(async () => {
} else if (activeIdentityDeletionProcess.value.status === IdentityDeletionProcessStatus.WaitingForApproval) {
abortResult = await services1.transport.identityDeletionProcesses.rejectIdentityDeletionProcess();
}
await syncUntilHasEvent(services2, PeerDeletionCancelledEvent, (e) => e.data.id === relationshipId);

if (abortResult?.isError) throw abortResult.error;
});
Expand All @@ -47,6 +48,7 @@ describe("IdentityDeletionProcess", () => {

const updatedRelationship = (await services2.transport.relationships.getRelationship({ id: relationshipId })).value;
expect(updatedRelationship.peerDeletionInfo!.deletionStatus).toBe(PeerDeletionStatus.ToBeDeleted);
expect(updatedRelationship.peerDeletionInfo!.deletionDate).toBeDefined();
});

test("peer should be notified about cancelled deletion process", async function () {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ISerializable, Serializable, serialize, validate } from "@js-soft/ts-serval";
import { CoreDate } from "@nmshd/core-types";

export enum PeerDeletionStatus {
ToBeDeleted = "ToBeDeleted",
Expand All @@ -7,10 +8,12 @@ export enum PeerDeletionStatus {

export interface PeerDeletionInfoJSON {
deletionStatus: PeerDeletionStatus;
deletionDate: string;
}

export interface IPeerDeletionInfo extends ISerializable {
deletionStatus: PeerDeletionStatus;
deletionDate: CoreDate;
}

export class PeerDeletionInfo extends Serializable implements IPeerDeletionInfo {
Expand All @@ -20,6 +23,25 @@ export class PeerDeletionInfo extends Serializable implements IPeerDeletionInfo
})
public deletionStatus: PeerDeletionStatus;

@serialize()
@validate()
public deletionDate: CoreDate;

public static override preFrom(value: any): any {
if (!value.deletionDate) {
switch (value.deletionStatus as PeerDeletionStatus) {
case PeerDeletionStatus.ToBeDeleted:
value.deletionDate = CoreDate.local().add({ days: 14 }).toString();
break;
case PeerDeletionStatus.Deleted:
value.deletionDate = CoreDate.local().toString();
break;
}
}

return value;
}

public static from(value: IPeerDeletionInfo | PeerDeletionInfoJSON): PeerDeletionInfo {
return this.fromAny(value);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Serializable, serialize, validate } from "@js-soft/ts-serval";
import { CoreId } from "@nmshd/core-types";
import { CoreDate, CoreId } from "@nmshd/core-types";
import { PeerDeletedEvent } from "../../../events";
import { PeerDeletionInfo, PeerDeletionStatus } from "../../relationships/local/PeerDeletionInfo";
import { Relationship } from "../../relationships/local/Relationship";
Expand All @@ -10,13 +10,17 @@ class PeerDeletedExternalEventData extends Serializable {
@serialize()
@validate()
public relationshipId: string;

@serialize()
@validate()
public deletionDate: CoreDate;
}

export class PeerDeletedExternalEventProcessor extends ExternalEventProcessor {
public override async execute(externalEvent: BackboneExternalEvent): Promise<Relationship> {
const payload = PeerDeletedExternalEventData.fromAny(externalEvent.payload);

const peerDeletionInfo = PeerDeletionInfo.from({ deletionStatus: PeerDeletionStatus.Deleted });
const peerDeletionInfo = PeerDeletionInfo.from({ deletionStatus: PeerDeletionStatus.Deleted, deletionDate: payload.deletionDate });
const relationship = await this.accountController.relationships.setPeerDeletionInfo(CoreId.from(payload.relationshipId), peerDeletionInfo);

this.eventBus.publish(new PeerDeletedEvent(this.ownAddress, relationship));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Serializable, serialize, validate } from "@js-soft/ts-serval";
import { CoreId } from "@nmshd/core-types";
import { CoreDate, CoreId } from "@nmshd/core-types";
import { PeerToBeDeletedEvent } from "../../../events";
import { PeerDeletionInfo, PeerDeletionStatus } from "../../relationships/local/PeerDeletionInfo";
import { Relationship } from "../../relationships/local/Relationship";
Expand All @@ -10,13 +10,17 @@ class PeerToBeDeletedExternalEventData extends Serializable {
@serialize()
@validate()
public relationshipId: string;

@serialize()
@validate()
public deletionDate: CoreDate;
}

export class PeerToBeDeletedExternalEventProcessor extends ExternalEventProcessor {
public override async execute(externalEvent: BackboneExternalEvent): Promise<Relationship> {
const payload = PeerToBeDeletedExternalEventData.fromAny(externalEvent.payload);

const peerDeletionInfo = PeerDeletionInfo.from({ deletionStatus: PeerDeletionStatus.ToBeDeleted });
const peerDeletionInfo = PeerDeletionInfo.from({ deletionStatus: PeerDeletionStatus.ToBeDeleted, deletionDate: payload.deletionDate });
const relationship = await this.accountController.relationships.setPeerDeletionInfo(CoreId.from(payload.relationshipId), peerDeletionInfo);

this.eventBus.publish(new PeerToBeDeletedEvent(this.ownAddress, relationship));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { CoreDate } from "@nmshd/core-types";
import { PeerDeletionInfo, PeerDeletionStatus } from "../../../src";

describe("PeerDeletionInfo", () => {
test("PeerDeletionInfo in status ToBeDeleted should have a default deletionDate in the Future", () => {
const peerDeletionInfoToBeDeleted = PeerDeletionInfo.fromAny({
deletionStatus: PeerDeletionStatus.ToBeDeleted
});

expect(peerDeletionInfoToBeDeleted.deletionDate.isAfter(CoreDate.local())).toBeTruthy();
});

test("PeerDeletionInfo in status Deleted should have a default deletionDate now or in the past", () => {
const peerDeletionInfoDeleted = PeerDeletionInfo.fromAny({
deletionStatus: PeerDeletionStatus.Deleted
});

expect(peerDeletionInfoDeleted.deletionDate.isSameOrBefore(CoreDate.local())).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { IDatabaseConnection } from "@js-soft/docdb-access-abstractions";
import { CoreId } from "@nmshd/core-types";
import { CoreDate, CoreId } from "@nmshd/core-types";
import { AccountController, PeerDeletionStatus, Transport } from "../../../../src";
import { PeerDeletedExternalEventProcessor } from "../../../../src/modules/sync/externalEventProcessors/PeerDeletedExternalEventProcessor";
import { TestUtil } from "../../../testHelpers/TestUtil";
Expand Down Expand Up @@ -35,8 +35,17 @@ describe("PeerDeletedExternalEventProcessor", function () {

test("PeerDeletedExternalEventProcessor should mark peer as deleted", async function () {
const eventProcessor = new PeerDeletedExternalEventProcessor(recipient.identityDeletionProcess.eventBus, recipient);
await eventProcessor.execute({ id: "anId", createdAt: "aDate", index: 1, syncErrorCount: 0, type: "PeerDeleted", payload: { relationshipId: relationshipId.toString() } });
const deletionDate = CoreDate.local();
await eventProcessor.execute({
id: "anId",
createdAt: "aDate",
index: 1,
syncErrorCount: 0,
type: "PeerDeleted",
payload: { relationshipId: relationshipId.toString(), deletionDate }
});
const relationship = await recipient.relationships.getRelationship(relationshipId);
expect(relationship!.peerDeletionInfo!.deletionStatus).toBe(PeerDeletionStatus.Deleted);
expect(relationship!.peerDeletionInfo!.deletionDate.isSame(deletionDate)).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { IDatabaseConnection } from "@js-soft/docdb-access-abstractions";
import { CoreId } from "@nmshd/core-types";
import { CoreDate, CoreId } from "@nmshd/core-types";
import { AccountController, PeerDeletionStatus, Transport } from "../../../../src";
import { PeerToBeDeletedExternalEventProcessor } from "../../../../src/modules/sync/externalEventProcessors/PeerToBeDeletedExternalEventProcessor";
import { TestUtil } from "../../../testHelpers/TestUtil";
Expand Down Expand Up @@ -35,15 +35,17 @@ describe("PeerToBeDeletedExternalEventProcessor", function () {

test("PeerToBeDeletedExternalEventProcessor should mark peer as deleted", async function () {
const eventProcessor = new PeerToBeDeletedExternalEventProcessor(recipient.identityDeletionProcess.eventBus, recipient);
const deletionDate = CoreDate.local().add({ days: 14 });
await eventProcessor.execute({
id: "anId",
createdAt: "aDate",
index: 1,
syncErrorCount: 0,
type: "PeerToBeDeleted",
payload: { relationshipId: relationshipId.toString() }
payload: { relationshipId: relationshipId.toString(), deletionDate }
});
const relationship = await recipient.relationships.getRelationship(relationshipId);
expect(relationship!.peerDeletionInfo!.deletionStatus).toBe(PeerDeletionStatus.ToBeDeleted);
expect(relationship!.peerDeletionInfo!.deletionDate.isSame(deletionDate)).toBeTruthy();
});
});

0 comments on commit 52f42e7

Please sign in to comment.