@atlantjs/backend 5.0.3 → 5.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,9 +20,9 @@ export declare abstract class DatabaseHelperAbstract {
20
20
  [K in keyof InstanceType<T>]?: InstanceType<T>[K];
21
21
  }, relations: FindOptionsRelations<E>): Promise<Return<Optional<InstanceType<T>[]>, FailureAbstract>>;
22
22
  write(schemaEntities: SchemaEntity[]): Promise<Return<SchemaEntityReturn[], FailureAbstract>>;
23
- delete<T extends Newable<ObjectLiteral>>(entity: T, condition: {
23
+ delete<T extends Newable<ObjectLiteral>>(schema: T, condition: {
24
24
  [K in keyof InstanceType<T>]?: InstanceType<T>[K];
25
- }): Promise<Return<undefined, undefined>>;
25
+ }, isSoft?: boolean): Promise<Return<undefined, FailureAbstract>>;
26
26
  private getManager;
27
27
  private openTransaction;
28
28
  private commit;
@@ -0,0 +1,4 @@
1
+ import { FailureAbstract } from "@atlantjs/arch";
2
+ export declare class DatabaseHelperAbstractDeleteFailure extends FailureAbstract {
3
+ constructor(isSoft: boolean, error?: any);
4
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseHelperAbstractDeleteFailure = void 0;
4
+ const arch_1 = require("@atlantjs/arch");
5
+ class DatabaseHelperAbstractDeleteFailure extends arch_1.FailureAbstract {
6
+ constructor(isSoft, error) {
7
+ super({
8
+ className: DatabaseHelperAbstractDeleteFailure.name,
9
+ message: `Failed to ${arch_1._.isTruthy(isSoft) ? "soft" : "hard"} delete the record in the database`,
10
+ error,
11
+ });
12
+ }
13
+ }
14
+ exports.DatabaseHelperAbstractDeleteFailure = DatabaseHelperAbstractDeleteFailure;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DatabaseHelperAbstract = void 0;
4
4
  const arch_1 = require("@atlantjs/arch");
5
5
  const database_helper_abstract_commit_failure_1 = require("./database.helper.abstract.commit.failure");
6
+ const database_helper_abstract_delete_failure_1 = require("./database.helper.abstract.delete.failure");
6
7
  const database_helper_abstract_get_manager_failure_1 = require("./database.helper.abstract.get-manager.failure");
7
8
  const database_helper_abstract_rollback_failure_1 = require("./database.helper.abstract.rollback.failure");
8
9
  const database_helper_abstract_write_failure_1 = require("./database.helper.abstract.write.failure");
@@ -27,9 +28,33 @@ class DatabaseHelperAbstract {
27
28
  const client = clientWrapped.unwrap();
28
29
  const repository = client.getRepository(schema);
29
30
  const registryPacked = (0, arch_1.Optional)((await repository.find({
30
- where: condition,
31
+ where: { ...condition, deleted: false },
31
32
  relations,
32
33
  })));
34
+ // Remove related entities that have deleted: true
35
+ if (relations && registryPacked.hasSomething()) {
36
+ const filterDeleted = (obj, rels) => {
37
+ for (const key of Object.keys(rels)) {
38
+ if (Array.isArray(obj[key])) {
39
+ obj[key] = obj[key].filter((item) => !item.deleted);
40
+ // Recursively filter nested relations
41
+ if (typeof rels[key] === "object") {
42
+ obj[key].forEach((item) => filterDeleted(item, rels[key]));
43
+ }
44
+ }
45
+ else if (obj[key] && typeof obj[key] === "object") {
46
+ if (obj[key].deleted)
47
+ obj[key] = undefined;
48
+ else if (typeof rels[key] === "object") {
49
+ filterDeleted(obj[key], rels[key]);
50
+ }
51
+ }
52
+ }
53
+ };
54
+ registryPacked
55
+ .unpack()
56
+ .forEach((entity) => filterDeleted(entity, relations));
57
+ }
33
58
  return (0, arch_1.Success)(registryPacked);
34
59
  }
35
60
  async write(schemaEntities) {
@@ -64,15 +89,31 @@ class DatabaseHelperAbstract {
64
89
  return (0, arch_1.Failure)(new database_helper_abstract_write_failure_1.DatabaseHelperAbstractWriteFailure(error));
65
90
  }
66
91
  }
67
- async delete(entity, condition) {
68
- const client = await this.openTransaction();
69
- const repository = client.getRepository(entity);
70
- const registryPacked = (0, arch_1.Optional)(await repository.find({ where: condition }));
71
- if (registryPacked.hasNothing()) {
72
- return (0, arch_1.Failure)();
92
+ async delete(schema, condition, isSoft = true) {
93
+ try {
94
+ const client = await this.openTransaction();
95
+ const repository = client.getRepository(schema);
96
+ const registriesPacked = (0, arch_1.Optional)(await repository.find({ where: condition }));
97
+ if (registriesPacked.hasNothing()) {
98
+ return (0, arch_1.Failure)(new database_helper_abstract_delete_failure_1.DatabaseHelperAbstractDeleteFailure(isSoft));
99
+ }
100
+ if (arch_1._.isFalsy(isSoft)) {
101
+ repository.delete(condition);
102
+ }
103
+ else {
104
+ const registries = registriesPacked.unpack();
105
+ for (const registry of registries) {
106
+ registry.deleted = true;
107
+ await repository.update({ id: registry.id.toString() }, registry);
108
+ }
109
+ }
110
+ await this.commit();
111
+ return (0, arch_1.Success)();
112
+ }
113
+ catch (error) {
114
+ await this.rollback();
115
+ return (0, arch_1.Failure)(new database_helper_abstract_delete_failure_1.DatabaseHelperAbstractDeleteFailure(isSoft, error));
73
116
  }
74
- repository.delete(condition);
75
- return (0, arch_1.Success)();
76
117
  }
77
118
  getManager() {
78
119
  if (this.database.hasNothing()) {
@@ -1,4 +1,8 @@
1
1
  import { EntityAbstract } from "../../../domain/entities/entity.abstract";
2
2
  export declare abstract class SchemaAbstract {
3
+ abstract id: string;
4
+ abstract deleted: boolean;
5
+ abstract createdAt: string;
6
+ abstract updatedAt: string;
3
7
  abstract toSolid(): EntityAbstract;
4
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlantjs/backend",
3
- "version": "5.0.3",
3
+ "version": "5.0.5",
4
4
  "main": "index.js",
5
5
  "license": "UNLICENSED",
6
6
  "publishConfig": {