Skip to content

Commit 52f42e7

Browse files
Add deletionDate to relationship's deletion info (#290)
* 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>
1 parent 6a46d44 commit 52f42e7

File tree

12 files changed

+84
-17
lines changed

12 files changed

+84
-17
lines changed

package-lock.json

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"test:teardown": "docker compose -f .dev/compose.yml down -fsv"
2828
},
2929
"devDependencies": {
30-
"@js-soft/eslint-config-ts": "^1.6.9",
30+
"@js-soft/eslint-config-ts": "^1.6.10",
3131
"@js-soft/license-check": "^1.0.9",
3232
"@types/jest": "^29.5.13",
3333
"@types/node": "^22.7.4",

packages/runtime/src/dataViews/DataViewExpander.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,6 +1782,7 @@ export class DataViewExpander {
17821782
type: "RelationshipDVO",
17831783
status: relationship.status,
17841784
peerDeletionStatus: relationship.peerDeletionInfo?.deletionStatus,
1785+
peerDeletionDate: relationship.peerDeletionInfo?.deletionDate,
17851786
statusText: statusText,
17861787
direction: direction,
17871788
isPinned: relationshipSetting.isPinned,

packages/runtime/src/dataViews/transport/RelationshipDVO.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface RelationshipDVO extends DataViewObject {
1111
type: "RelationshipDVO";
1212
status: string;
1313
peerDeletionStatus?: PeerDeletionStatus;
14+
peerDeletionDate?: string;
1415
direction: RelationshipDirection;
1516
statusText: string;
1617
isPinned: boolean;

packages/runtime/src/types/transport/RelationshipDTO.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export enum PeerDeletionStatus {
4444

4545
export interface PeerDeletionInfoDTO {
4646
deletionStatus: PeerDeletionStatus;
47+
deletionDate: string;
4748
}
4849

4950
export interface RelationshipDTO {

packages/runtime/test/transport/identityDeletionPeerProcessing.test.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ beforeAll(async () => {
1414
relationshipId = (await establishRelationship(services1.transport, services2.transport)).id;
1515
}, 30000);
1616

17+
afterAll(async () => {
18+
return await serviceProvider.stop();
19+
});
20+
1721
beforeEach(() => {
1822
services1.eventBus.reset();
1923
services2.eventBus.reset();
2024
});
2125

22-
afterAll(async () => {
23-
return await serviceProvider.stop();
24-
});
25-
2626
afterEach(async () => {
2727
const activeIdentityDeletionProcess = await services1.transport.identityDeletionProcesses.getActiveIdentityDeletionProcess();
2828
if (!activeIdentityDeletionProcess.isSuccess) {
@@ -34,6 +34,7 @@ afterEach(async () => {
3434
} else if (activeIdentityDeletionProcess.value.status === IdentityDeletionProcessStatus.WaitingForApproval) {
3535
abortResult = await services1.transport.identityDeletionProcesses.rejectIdentityDeletionProcess();
3636
}
37+
await syncUntilHasEvent(services2, PeerDeletionCancelledEvent, (e) => e.data.id === relationshipId);
3738

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

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

5254
test("peer should be notified about cancelled deletion process", async function () {

packages/transport/src/modules/relationships/local/PeerDeletionInfo.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ISerializable, Serializable, serialize, validate } from "@js-soft/ts-serval";
2+
import { CoreDate } from "@nmshd/core-types";
23

34
export enum PeerDeletionStatus {
45
ToBeDeleted = "ToBeDeleted",
@@ -7,10 +8,12 @@ export enum PeerDeletionStatus {
78

89
export interface PeerDeletionInfoJSON {
910
deletionStatus: PeerDeletionStatus;
11+
deletionDate: string;
1012
}
1113

1214
export interface IPeerDeletionInfo extends ISerializable {
1315
deletionStatus: PeerDeletionStatus;
16+
deletionDate: CoreDate;
1417
}
1518

1619
export class PeerDeletionInfo extends Serializable implements IPeerDeletionInfo {
@@ -20,6 +23,25 @@ export class PeerDeletionInfo extends Serializable implements IPeerDeletionInfo
2023
})
2124
public deletionStatus: PeerDeletionStatus;
2225

26+
@serialize()
27+
@validate()
28+
public deletionDate: CoreDate;
29+
30+
public static override preFrom(value: any): any {
31+
if (!value.deletionDate) {
32+
switch (value.deletionStatus as PeerDeletionStatus) {
33+
case PeerDeletionStatus.ToBeDeleted:
34+
value.deletionDate = CoreDate.local().add({ days: 14 }).toString();
35+
break;
36+
case PeerDeletionStatus.Deleted:
37+
value.deletionDate = CoreDate.local().toString();
38+
break;
39+
}
40+
}
41+
42+
return value;
43+
}
44+
2345
public static from(value: IPeerDeletionInfo | PeerDeletionInfoJSON): PeerDeletionInfo {
2446
return this.fromAny(value);
2547
}

packages/transport/src/modules/sync/externalEventProcessors/PeerDeletedExternalEventProcessor.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Serializable, serialize, validate } from "@js-soft/ts-serval";
2-
import { CoreId } from "@nmshd/core-types";
2+
import { CoreDate, CoreId } from "@nmshd/core-types";
33
import { PeerDeletedEvent } from "../../../events";
44
import { PeerDeletionInfo, PeerDeletionStatus } from "../../relationships/local/PeerDeletionInfo";
55
import { Relationship } from "../../relationships/local/Relationship";
@@ -10,13 +10,17 @@ class PeerDeletedExternalEventData extends Serializable {
1010
@serialize()
1111
@validate()
1212
public relationshipId: string;
13+
14+
@serialize()
15+
@validate()
16+
public deletionDate: CoreDate;
1317
}
1418

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

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

2226
this.eventBus.publish(new PeerDeletedEvent(this.ownAddress, relationship));

packages/transport/src/modules/sync/externalEventProcessors/PeerToBeDeletedExternalEventProcessor.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Serializable, serialize, validate } from "@js-soft/ts-serval";
2-
import { CoreId } from "@nmshd/core-types";
2+
import { CoreDate, CoreId } from "@nmshd/core-types";
33
import { PeerToBeDeletedEvent } from "../../../events";
44
import { PeerDeletionInfo, PeerDeletionStatus } from "../../relationships/local/PeerDeletionInfo";
55
import { Relationship } from "../../relationships/local/Relationship";
@@ -10,13 +10,17 @@ class PeerToBeDeletedExternalEventData extends Serializable {
1010
@serialize()
1111
@validate()
1212
public relationshipId: string;
13+
14+
@serialize()
15+
@validate()
16+
public deletionDate: CoreDate;
1317
}
1418

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

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

2226
this.eventBus.publish(new PeerToBeDeletedEvent(this.ownAddress, relationship));
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { CoreDate } from "@nmshd/core-types";
2+
import { PeerDeletionInfo, PeerDeletionStatus } from "../../../src";
3+
4+
describe("PeerDeletionInfo", () => {
5+
test("PeerDeletionInfo in status ToBeDeleted should have a default deletionDate in the Future", () => {
6+
const peerDeletionInfoToBeDeleted = PeerDeletionInfo.fromAny({
7+
deletionStatus: PeerDeletionStatus.ToBeDeleted
8+
});
9+
10+
expect(peerDeletionInfoToBeDeleted.deletionDate.isAfter(CoreDate.local())).toBeTruthy();
11+
});
12+
13+
test("PeerDeletionInfo in status Deleted should have a default deletionDate now or in the past", () => {
14+
const peerDeletionInfoDeleted = PeerDeletionInfo.fromAny({
15+
deletionStatus: PeerDeletionStatus.Deleted
16+
});
17+
18+
expect(peerDeletionInfoDeleted.deletionDate.isSameOrBefore(CoreDate.local())).toBeTruthy();
19+
});
20+
});

0 commit comments

Comments
 (0)