@octo-cyber/kinship-calc 0.5.2

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.
Files changed (98) hide show
  1. package/.turbo/turbo-build.log +22 -0
  2. package/dist/controllers/family-tree.controller.d.ts +27 -0
  3. package/dist/controllers/family-tree.controller.d.ts.map +1 -0
  4. package/dist/controllers/family-tree.controller.js +88 -0
  5. package/dist/controllers/family-tree.controller.js.map +1 -0
  6. package/dist/controllers/kinship-calc.controller.d.ts +15 -0
  7. package/dist/controllers/kinship-calc.controller.d.ts.map +1 -0
  8. package/dist/controllers/kinship-calc.controller.js +45 -0
  9. package/dist/controllers/kinship-calc.controller.js.map +1 -0
  10. package/dist/engine/index.d.ts +7 -0
  11. package/dist/engine/index.d.ts.map +1 -0
  12. package/dist/engine/index.js +15 -0
  13. package/dist/engine/index.js.map +1 -0
  14. package/dist/engine/kinship-data.d.ts +31 -0
  15. package/dist/engine/kinship-data.d.ts.map +1 -0
  16. package/dist/engine/kinship-data.js +150 -0
  17. package/dist/engine/kinship-data.js.map +1 -0
  18. package/dist/engine/kinship-engine.d.ts +44 -0
  19. package/dist/engine/kinship-engine.d.ts.map +1 -0
  20. package/dist/engine/kinship-engine.js +184 -0
  21. package/dist/engine/kinship-engine.js.map +1 -0
  22. package/dist/engine/relation-path.d.ts +37 -0
  23. package/dist/engine/relation-path.d.ts.map +1 -0
  24. package/dist/engine/relation-path.js +60 -0
  25. package/dist/engine/relation-path.js.map +1 -0
  26. package/dist/entities/family-tree-person.entity.d.ts +12 -0
  27. package/dist/entities/family-tree-person.entity.d.ts.map +1 -0
  28. package/dist/entities/family-tree-person.entity.js +61 -0
  29. package/dist/entities/family-tree-person.entity.js.map +1 -0
  30. package/dist/entities/family-tree-relation.entity.d.ts +15 -0
  31. package/dist/entities/family-tree-relation.entity.d.ts.map +1 -0
  32. package/dist/entities/family-tree-relation.entity.js +58 -0
  33. package/dist/entities/family-tree-relation.entity.js.map +1 -0
  34. package/dist/entities/family-tree.entity.d.ts +9 -0
  35. package/dist/entities/family-tree.entity.d.ts.map +1 -0
  36. package/dist/entities/family-tree.entity.js +50 -0
  37. package/dist/entities/family-tree.entity.js.map +1 -0
  38. package/dist/entities/index.d.ts +12 -0
  39. package/dist/entities/index.d.ts.map +1 -0
  40. package/dist/entities/index.js +22 -0
  41. package/dist/entities/index.js.map +1 -0
  42. package/dist/entities/kinship-title.entity.d.ts +18 -0
  43. package/dist/entities/kinship-title.entity.d.ts.map +1 -0
  44. package/dist/entities/kinship-title.entity.js +59 -0
  45. package/dist/entities/kinship-title.entity.js.map +1 -0
  46. package/dist/index.d.ts +12 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +33 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/kinship-calc.module.d.ts +9 -0
  51. package/dist/kinship-calc.module.d.ts.map +1 -0
  52. package/dist/kinship-calc.module.js +45 -0
  53. package/dist/kinship-calc.module.js.map +1 -0
  54. package/dist/schemas/kinship.schema.d.ts +129 -0
  55. package/dist/schemas/kinship.schema.d.ts.map +1 -0
  56. package/dist/schemas/kinship.schema.js +50 -0
  57. package/dist/schemas/kinship.schema.js.map +1 -0
  58. package/dist/services/family-tree.service.d.ts +38 -0
  59. package/dist/services/family-tree.service.d.ts.map +1 -0
  60. package/dist/services/family-tree.service.js +179 -0
  61. package/dist/services/family-tree.service.js.map +1 -0
  62. package/dist/services/kinship-calc.service.d.ts +26 -0
  63. package/dist/services/kinship-calc.service.d.ts.map +1 -0
  64. package/dist/services/kinship-calc.service.js +66 -0
  65. package/dist/services/kinship-calc.service.js.map +1 -0
  66. package/package.json +60 -0
  67. package/src/controllers/family-tree.controller.ts +102 -0
  68. package/src/controllers/kinship-calc.controller.ts +50 -0
  69. package/src/engine/index.ts +6 -0
  70. package/src/engine/kinship-data.ts +188 -0
  71. package/src/engine/kinship-engine.ts +230 -0
  72. package/src/engine/relation-path.ts +63 -0
  73. package/src/entities/family-tree-person.entity.ts +37 -0
  74. package/src/entities/family-tree-relation.entity.ts +36 -0
  75. package/src/entities/family-tree.entity.ts +28 -0
  76. package/src/entities/index.ts +18 -0
  77. package/src/entities/kinship-title.entity.ts +38 -0
  78. package/src/index.ts +33 -0
  79. package/src/kinship-calc.module.ts +51 -0
  80. package/src/schemas/kinship.schema.ts +70 -0
  81. package/src/services/family-tree.service.ts +211 -0
  82. package/src/services/kinship-calc.service.ts +68 -0
  83. package/tsconfig.build.json +4 -0
  84. package/tsconfig.json +10 -0
  85. package/web/components/FamilyTreeCanvas.tsx +177 -0
  86. package/web/components/FamilyTreeDialogs.tsx +275 -0
  87. package/web/components/KinshipResultCard.tsx +98 -0
  88. package/web/components/RegionSelector.tsx +32 -0
  89. package/web/components/RelationChainBuilder.tsx +104 -0
  90. package/web/index.ts +29 -0
  91. package/web/manifest.ts +24 -0
  92. package/web/messages/en-US.json +108 -0
  93. package/web/messages/zh-CN.json +108 -0
  94. package/web/pages/FamilyTreePage.tsx +240 -0
  95. package/web/pages/KinshipCalcPage.tsx +140 -0
  96. package/web/services/kinship-service.ts +140 -0
  97. package/web/stores/kinship-store.ts +80 -0
  98. package/web/types/kinship.ts +85 -0
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.KinshipTitle = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ /**
15
+ * Stores a computed kinship title for a specific relation path + region.
16
+ * relationPath is the canonical encoded path, e.g. "F" (father), "FF" (paternal grandfather).
17
+ */
18
+ let KinshipTitle = class KinshipTitle {
19
+ id;
20
+ /** Encoded relation path, e.g. "F", "M", "FF", "MF", "FB+", "MS" */
21
+ relationPath;
22
+ region;
23
+ /** How ego calls the relative, e.g. 爷爷, 外公 */
24
+ title;
25
+ /** How the relative calls ego back, e.g. 孙子/孙女 */
26
+ reverseTitle;
27
+ /** Description / mnemonic for this term */
28
+ description;
29
+ };
30
+ exports.KinshipTitle = KinshipTitle;
31
+ __decorate([
32
+ (0, core_1.PrimaryGeneratedColumn)(),
33
+ __metadata("design:type", Number)
34
+ ], KinshipTitle.prototype, "id", void 0);
35
+ __decorate([
36
+ (0, core_1.Column)({ type: 'varchar', length: 100, name: 'relation_path' }),
37
+ __metadata("design:type", String)
38
+ ], KinshipTitle.prototype, "relationPath", void 0);
39
+ __decorate([
40
+ (0, core_1.Column)({ type: 'varchar', length: 20 }),
41
+ __metadata("design:type", String)
42
+ ], KinshipTitle.prototype, "region", void 0);
43
+ __decorate([
44
+ (0, core_1.Column)({ type: 'varchar', length: 30 }),
45
+ __metadata("design:type", String)
46
+ ], KinshipTitle.prototype, "title", void 0);
47
+ __decorate([
48
+ (0, core_1.Column)({ type: 'varchar', length: 30, name: 'reverse_title', nullable: true }),
49
+ __metadata("design:type", Object)
50
+ ], KinshipTitle.prototype, "reverseTitle", void 0);
51
+ __decorate([
52
+ (0, core_1.Column)({ type: 'text', nullable: true }),
53
+ __metadata("design:type", Object)
54
+ ], KinshipTitle.prototype, "description", void 0);
55
+ exports.KinshipTitle = KinshipTitle = __decorate([
56
+ (0, core_1.Entity)('kinship_title'),
57
+ (0, core_1.Index)(['relationPath', 'region'], { unique: true })
58
+ ], KinshipTitle);
59
+ //# sourceMappingURL=kinship-title.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinship-title.entity.js","sourceRoot":"","sources":["../../src/entities/kinship-title.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKyB;AAIzB;;;GAGG;AAGI,IAAM,YAAY,GAAlB,MAAM,YAAY;IAEvB,EAAE,CAAS;IAEX,oEAAoE;IAEpE,YAAY,CAAS;IAGrB,MAAM,CAAgB;IAEtB,8CAA8C;IAE9C,KAAK,CAAS;IAEd,kDAAkD;IAElD,YAAY,CAAgB;IAE5B,2CAA2C;IAE3C,WAAW,CAAgB;CAC5B,CAAA;AAtBY,oCAAY;AAEvB;IADC,IAAA,6BAAsB,GAAE;;wCACd;AAIX;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;kDAC3C;AAGrB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;4CAClB;AAItB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;2CAC1B;AAId;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACnD;AAI5B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDACd;uBArBhB,YAAY;IAFxB,IAAA,aAAM,EAAC,eAAe,CAAC;IACvB,IAAA,YAAK,EAAC,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;GACvC,YAAY,CAsBxB"}
@@ -0,0 +1,12 @@
1
+ export { KinshipCalcModule } from './kinship-calc.module.js';
2
+ export { FamilyTree, FamilyTreePerson, FamilyTreeRelation, KinshipTitle, KINSHIP_CALC_ENTITIES, } from './entities/index.js';
3
+ export type { KinshipRegion, PersonGender } from './entities/index.js';
4
+ export { KinshipCalcService } from './services/kinship-calc.service.js';
5
+ export { FamilyTreeService } from './services/family-tree.service.js';
6
+ export { calculateKinship, detectGenerationConflict } from './engine/index.js';
7
+ export type { KinshipResult, CalcOptions, Region } from './engine/index.js';
8
+ export { KINSHIP_TABLE } from './engine/index.js';
9
+ export type { KinshipEntry } from './engine/index.js';
10
+ export { CalculateKinshipSchema, PathFromChainSchema, CreateFamilyTreeSchema, CreatePersonSchema, CreateRelationSchema, } from './schemas/kinship.schema.js';
11
+ export declare const version = "0.1.0";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,GACtB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAGrE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC9E,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AAEpC,eAAO,MAAM,OAAO,UAAU,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.version = exports.CreateRelationSchema = exports.CreatePersonSchema = exports.CreateFamilyTreeSchema = exports.PathFromChainSchema = exports.CalculateKinshipSchema = exports.KINSHIP_TABLE = exports.detectGenerationConflict = exports.calculateKinship = exports.FamilyTreeService = exports.KinshipCalcService = exports.KINSHIP_CALC_ENTITIES = exports.KinshipTitle = exports.FamilyTreeRelation = exports.FamilyTreePerson = exports.FamilyTree = exports.KinshipCalcModule = void 0;
4
+ // Module
5
+ var kinship_calc_module_js_1 = require("./kinship-calc.module.js");
6
+ Object.defineProperty(exports, "KinshipCalcModule", { enumerable: true, get: function () { return kinship_calc_module_js_1.KinshipCalcModule; } });
7
+ // Entities
8
+ var index_js_1 = require("./entities/index.js");
9
+ Object.defineProperty(exports, "FamilyTree", { enumerable: true, get: function () { return index_js_1.FamilyTree; } });
10
+ Object.defineProperty(exports, "FamilyTreePerson", { enumerable: true, get: function () { return index_js_1.FamilyTreePerson; } });
11
+ Object.defineProperty(exports, "FamilyTreeRelation", { enumerable: true, get: function () { return index_js_1.FamilyTreeRelation; } });
12
+ Object.defineProperty(exports, "KinshipTitle", { enumerable: true, get: function () { return index_js_1.KinshipTitle; } });
13
+ Object.defineProperty(exports, "KINSHIP_CALC_ENTITIES", { enumerable: true, get: function () { return index_js_1.KINSHIP_CALC_ENTITIES; } });
14
+ // Services
15
+ var kinship_calc_service_js_1 = require("./services/kinship-calc.service.js");
16
+ Object.defineProperty(exports, "KinshipCalcService", { enumerable: true, get: function () { return kinship_calc_service_js_1.KinshipCalcService; } });
17
+ var family_tree_service_js_1 = require("./services/family-tree.service.js");
18
+ Object.defineProperty(exports, "FamilyTreeService", { enumerable: true, get: function () { return family_tree_service_js_1.FamilyTreeService; } });
19
+ // Engine (public API)
20
+ var index_js_2 = require("./engine/index.js");
21
+ Object.defineProperty(exports, "calculateKinship", { enumerable: true, get: function () { return index_js_2.calculateKinship; } });
22
+ Object.defineProperty(exports, "detectGenerationConflict", { enumerable: true, get: function () { return index_js_2.detectGenerationConflict; } });
23
+ var index_js_3 = require("./engine/index.js");
24
+ Object.defineProperty(exports, "KINSHIP_TABLE", { enumerable: true, get: function () { return index_js_3.KINSHIP_TABLE; } });
25
+ // Schemas
26
+ var kinship_schema_js_1 = require("./schemas/kinship.schema.js");
27
+ Object.defineProperty(exports, "CalculateKinshipSchema", { enumerable: true, get: function () { return kinship_schema_js_1.CalculateKinshipSchema; } });
28
+ Object.defineProperty(exports, "PathFromChainSchema", { enumerable: true, get: function () { return kinship_schema_js_1.PathFromChainSchema; } });
29
+ Object.defineProperty(exports, "CreateFamilyTreeSchema", { enumerable: true, get: function () { return kinship_schema_js_1.CreateFamilyTreeSchema; } });
30
+ Object.defineProperty(exports, "CreatePersonSchema", { enumerable: true, get: function () { return kinship_schema_js_1.CreatePersonSchema; } });
31
+ Object.defineProperty(exports, "CreateRelationSchema", { enumerable: true, get: function () { return kinship_schema_js_1.CreateRelationSchema; } });
32
+ exports.version = '0.1.0';
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,SAAS;AACT,mEAA4D;AAAnD,2HAAA,iBAAiB,OAAA;AAE1B,WAAW;AACX,gDAM4B;AAL1B,sGAAA,UAAU,OAAA;AACV,4GAAA,gBAAgB,OAAA;AAChB,8GAAA,kBAAkB,OAAA;AAClB,wGAAA,YAAY,OAAA;AACZ,iHAAA,qBAAqB,OAAA;AAIvB,WAAW;AACX,8EAAuE;AAA9D,6HAAA,kBAAkB,OAAA;AAC3B,4EAAqE;AAA5D,2HAAA,iBAAiB,OAAA;AAE1B,sBAAsB;AACtB,8CAA8E;AAArE,4GAAA,gBAAgB,OAAA;AAAE,oHAAA,wBAAwB,OAAA;AAEnD,8CAAiD;AAAxC,yGAAA,aAAa,OAAA;AAGtB,UAAU;AACV,iEAMoC;AALlC,2HAAA,sBAAsB,OAAA;AACtB,wHAAA,mBAAmB,OAAA;AACnB,2HAAA,sBAAsB,OAAA;AACtB,uHAAA,kBAAkB,OAAA;AAClB,yHAAA,oBAAoB,OAAA;AAGT,QAAA,OAAO,GAAG,OAAO,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { Express } from '@octo-cyber/core';
2
+ import type { IModule, IModuleContext } from '@octo-cyber/core';
3
+ export declare class KinshipCalcModule implements IModule {
4
+ readonly name = "kinship-calc";
5
+ readonly entities: (typeof import("./entities/family-tree.entity.js").FamilyTree | typeof import("./entities/family-tree-person.entity.js").FamilyTreePerson | typeof import("./entities/family-tree-relation.entity.js").FamilyTreeRelation | typeof import("./entities/kinship-title.entity.js").KinshipTitle)[];
6
+ initialize(_context: IModuleContext): Promise<void>;
7
+ registerRoutes(app: Express): void;
8
+ }
9
+ //# sourceMappingURL=kinship-calc.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinship-calc.module.d.ts","sourceRoot":"","sources":["../src/kinship-calc.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAS/D,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,QAAQ,CAAC,IAAI,kBAAiB;IAC9B,QAAQ,CAAC,QAAQ,kSAA6B;IAExC,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;CA2BnC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KinshipCalcModule = void 0;
4
+ const core_1 = require("@octo-cyber/core");
5
+ const auth_1 = require("@octo-cyber/auth");
6
+ const index_js_1 = require("./entities/index.js");
7
+ const kinship_calc_service_js_1 = require("./services/kinship-calc.service.js");
8
+ const family_tree_service_js_1 = require("./services/family-tree.service.js");
9
+ const kinship_calc_controller_js_1 = require("./controllers/kinship-calc.controller.js");
10
+ const family_tree_controller_js_1 = require("./controllers/family-tree.controller.js");
11
+ class KinshipCalcModule {
12
+ name = 'kinship-calc';
13
+ entities = [...index_js_1.KINSHIP_CALC_ENTITIES];
14
+ async initialize(_context) {
15
+ const logger = core_1.Container.get(core_1.LoggerService);
16
+ core_1.Container.get(kinship_calc_service_js_1.KinshipCalcService).initialize();
17
+ core_1.Container.get(family_tree_service_js_1.FamilyTreeService).initialize();
18
+ logger.info('KinshipCalcModule initialized');
19
+ }
20
+ registerRoutes(app) {
21
+ const calcCtrl = new kinship_calc_controller_js_1.KinshipCalcController();
22
+ const treeCtrl = new family_tree_controller_js_1.FamilyTreeController();
23
+ const auth = (0, auth_1.authMiddleware)();
24
+ // ── Public calculation endpoints (no auth required for standalone use) ──
25
+ app.post('/api/v1/kinship/calculate', calcCtrl.calculate);
26
+ app.post('/api/v1/kinship/chain', calcCtrl.calculateFromChain);
27
+ app.post('/api/v1/kinship/conflict-check', calcCtrl.checkConflict);
28
+ app.get('/api/v1/kinship/titles', calcCtrl.listTitles);
29
+ app.get('/api/v1/kinship/atoms', calcCtrl.getAtoms);
30
+ // ── Family tree endpoints (require auth) ──
31
+ app.get('/api/v1/kinship/trees', auth, treeCtrl.listTrees);
32
+ app.post('/api/v1/kinship/trees', auth, treeCtrl.createTree);
33
+ app.get('/api/v1/kinship/trees/:id', auth, treeCtrl.getTree);
34
+ app.put('/api/v1/kinship/trees/:id', auth, treeCtrl.updateTree);
35
+ app.delete('/api/v1/kinship/trees/:id', auth, treeCtrl.deleteTree);
36
+ app.post('/api/v1/kinship/persons', auth, treeCtrl.addPerson);
37
+ app.put('/api/v1/kinship/persons/:id', auth, treeCtrl.updatePerson);
38
+ app.delete('/api/v1/kinship/persons/:id', auth, treeCtrl.deletePerson);
39
+ app.post('/api/v1/kinship/relations', auth, treeCtrl.addRelation);
40
+ app.delete('/api/v1/kinship/relations/:id', auth, treeCtrl.deleteRelation);
41
+ app.post('/api/v1/kinship/resolve', auth, treeCtrl.resolveKinship);
42
+ }
43
+ }
44
+ exports.KinshipCalcModule = KinshipCalcModule;
45
+ //# sourceMappingURL=kinship-calc.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinship-calc.module.js","sourceRoot":"","sources":["../src/kinship-calc.module.ts"],"names":[],"mappings":";;;AAEA,2CAA2D;AAC3D,2CAAiD;AACjD,kDAA2D;AAC3D,gFAAuE;AACvE,8EAAqE;AACrE,yFAAgF;AAChF,uFAA8E;AAE9E,MAAa,iBAAiB;IACnB,IAAI,GAAG,cAAc,CAAA;IACrB,QAAQ,GAAG,CAAC,GAAG,gCAAqB,CAAC,CAAA;IAE9C,KAAK,CAAC,UAAU,CAAC,QAAwB;QACvC,MAAM,MAAM,GAAG,gBAAS,CAAC,GAAG,CAAC,oBAAa,CAAC,CAAA;QAE3C,gBAAS,CAAC,GAAG,CAAC,4CAAkB,CAAC,CAAC,UAAU,EAAE,CAAA;QAC9C,gBAAS,CAAC,GAAG,CAAC,0CAAiB,CAAC,CAAC,UAAU,EAAE,CAAA;QAE7C,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC9C,CAAC;IAED,cAAc,CAAC,GAAY;QACzB,MAAM,QAAQ,GAAG,IAAI,kDAAqB,EAAE,CAAA;QAC5C,MAAM,QAAQ,GAAG,IAAI,gDAAoB,EAAE,CAAA;QAC3C,MAAM,IAAI,GAAG,IAAA,qBAAc,GAAE,CAAA;QAE7B,2EAA2E;QAC3E,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAM,QAAQ,CAAC,SAAS,CAAC,CAAA;QAC7D,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAU,QAAQ,CAAC,kBAAkB,CAAC,CAAA;QACtE,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAA;QAClE,GAAG,CAAC,GAAG,CAAC,wBAAwB,EAAU,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC9D,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAW,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAE5D,6CAA6C;QAC7C,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAa,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;QACrE,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAY,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;QACtE,GAAG,CAAC,GAAG,CAAC,2BAA2B,EAAS,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACnE,GAAG,CAAC,GAAG,CAAC,2BAA2B,EAAS,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;QACtE,GAAG,CAAC,MAAM,CAAC,2BAA2B,EAAM,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;QAEtE,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAU,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;QACrE,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAO,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;QACxE,GAAG,CAAC,MAAM,CAAC,6BAA6B,EAAI,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;QAExE,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAQ,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QACvE,GAAG,CAAC,MAAM,CAAC,+BAA+B,EAAE,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;QAC1E,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAU,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IAC5E,CAAC;CACF;AAxCD,8CAwCC"}
@@ -0,0 +1,129 @@
1
+ import { z } from 'zod';
2
+ export declare const CalculateKinshipSchema: z.ZodObject<{
3
+ path: z.ZodString;
4
+ region: z.ZodDefault<z.ZodEnum<["standard", "northern", "southern", "cantonese", "minnan", "wu"]>>;
5
+ egoGender: z.ZodDefault<z.ZodEnum<["male", "female"]>>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ path: string;
8
+ region: "standard" | "northern" | "southern" | "cantonese" | "minnan" | "wu";
9
+ egoGender: "male" | "female";
10
+ }, {
11
+ path: string;
12
+ region?: "standard" | "northern" | "southern" | "cantonese" | "minnan" | "wu" | undefined;
13
+ egoGender?: "male" | "female" | undefined;
14
+ }>;
15
+ export type CalculateKinshipDto = z.infer<typeof CalculateKinshipSchema>;
16
+ export declare const PathFromChainSchema: z.ZodObject<{
17
+ chain: z.ZodArray<z.ZodString, "many">;
18
+ region: z.ZodDefault<z.ZodEnum<["standard", "northern", "southern", "cantonese", "minnan", "wu"]>>;
19
+ egoGender: z.ZodDefault<z.ZodEnum<["male", "female"]>>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ region: "standard" | "northern" | "southern" | "cantonese" | "minnan" | "wu";
22
+ egoGender: "male" | "female";
23
+ chain: string[];
24
+ }, {
25
+ chain: string[];
26
+ region?: "standard" | "northern" | "southern" | "cantonese" | "minnan" | "wu" | undefined;
27
+ egoGender?: "male" | "female" | undefined;
28
+ }>;
29
+ export type PathFromChainDto = z.infer<typeof PathFromChainSchema>;
30
+ export declare const CreateFamilyTreeSchema: z.ZodObject<{
31
+ name: z.ZodString;
32
+ description: z.ZodOptional<z.ZodString>;
33
+ }, "strip", z.ZodTypeAny, {
34
+ name: string;
35
+ description?: string | undefined;
36
+ }, {
37
+ name: string;
38
+ description?: string | undefined;
39
+ }>;
40
+ export type CreateFamilyTreeDto = z.infer<typeof CreateFamilyTreeSchema>;
41
+ export declare const CreatePersonSchema: z.ZodObject<{
42
+ treeId: z.ZodNumber;
43
+ name: z.ZodString;
44
+ gender: z.ZodEnum<["male", "female"]>;
45
+ birthYear: z.ZodOptional<z.ZodNumber>;
46
+ notes: z.ZodOptional<z.ZodString>;
47
+ isRoot: z.ZodDefault<z.ZodBoolean>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ name: string;
50
+ treeId: number;
51
+ gender: "male" | "female";
52
+ isRoot: boolean;
53
+ birthYear?: number | undefined;
54
+ notes?: string | undefined;
55
+ }, {
56
+ name: string;
57
+ treeId: number;
58
+ gender: "male" | "female";
59
+ birthYear?: number | undefined;
60
+ notes?: string | undefined;
61
+ isRoot?: boolean | undefined;
62
+ }>;
63
+ export type CreatePersonDto = z.infer<typeof CreatePersonSchema>;
64
+ export declare const CreateRelationSchema: z.ZodObject<{
65
+ treeId: z.ZodNumber;
66
+ fromPersonId: z.ZodNumber;
67
+ toPersonId: z.ZodNumber;
68
+ relationType: z.ZodEnum<["F", "M", "S", "D", "B+", "B-", "Z+", "Z-", "H", "W"]>;
69
+ }, "strip", z.ZodTypeAny, {
70
+ treeId: number;
71
+ fromPersonId: number;
72
+ toPersonId: number;
73
+ relationType: "F" | "M" | "S" | "D" | "H" | "W" | "B+" | "B-" | "Z+" | "Z-";
74
+ }, {
75
+ treeId: number;
76
+ fromPersonId: number;
77
+ toPersonId: number;
78
+ relationType: "F" | "M" | "S" | "D" | "H" | "W" | "B+" | "B-" | "Z+" | "Z-";
79
+ }>;
80
+ export type CreateRelationDto = z.infer<typeof CreateRelationSchema>;
81
+ export declare const UpdateFamilyTreeSchema: z.ZodObject<{
82
+ name: z.ZodOptional<z.ZodString>;
83
+ description: z.ZodOptional<z.ZodString>;
84
+ }, "strip", z.ZodTypeAny, {
85
+ name?: string | undefined;
86
+ description?: string | undefined;
87
+ }, {
88
+ name?: string | undefined;
89
+ description?: string | undefined;
90
+ }>;
91
+ export type UpdateFamilyTreeDto = z.infer<typeof UpdateFamilyTreeSchema>;
92
+ export declare const UpdatePersonSchema: z.ZodObject<{
93
+ name: z.ZodOptional<z.ZodString>;
94
+ gender: z.ZodOptional<z.ZodEnum<["male", "female"]>>;
95
+ birthYear: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
96
+ notes: z.ZodOptional<z.ZodNullable<z.ZodString>>;
97
+ isRoot: z.ZodOptional<z.ZodBoolean>;
98
+ }, "strip", z.ZodTypeAny, {
99
+ name?: string | undefined;
100
+ gender?: "male" | "female" | undefined;
101
+ birthYear?: number | null | undefined;
102
+ notes?: string | null | undefined;
103
+ isRoot?: boolean | undefined;
104
+ }, {
105
+ name?: string | undefined;
106
+ gender?: "male" | "female" | undefined;
107
+ birthYear?: number | null | undefined;
108
+ notes?: string | null | undefined;
109
+ isRoot?: boolean | undefined;
110
+ }>;
111
+ export type UpdatePersonDto = z.infer<typeof UpdatePersonSchema>;
112
+ export declare const ResolveTreePathSchema: z.ZodObject<{
113
+ treeId: z.ZodNumber;
114
+ fromPersonId: z.ZodNumber;
115
+ toPersonId: z.ZodNumber;
116
+ region: z.ZodDefault<z.ZodEnum<["standard", "northern", "southern", "cantonese", "minnan", "wu"]>>;
117
+ }, "strip", z.ZodTypeAny, {
118
+ treeId: number;
119
+ fromPersonId: number;
120
+ toPersonId: number;
121
+ region: "standard" | "northern" | "southern" | "cantonese" | "minnan" | "wu";
122
+ }, {
123
+ treeId: number;
124
+ fromPersonId: number;
125
+ toPersonId: number;
126
+ region?: "standard" | "northern" | "southern" | "cantonese" | "minnan" | "wu" | undefined;
127
+ }>;
128
+ export type ResolveTreePathDto = z.infer<typeof ResolveTreePathSchema>;
129
+ //# sourceMappingURL=kinship.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinship.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/kinship.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAExE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAI9B,CAAA;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAElE,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEhE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEpE,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAM7B,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEhE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAKhC,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResolveTreePathSchema = exports.UpdatePersonSchema = exports.UpdateFamilyTreeSchema = exports.CreateRelationSchema = exports.CreatePersonSchema = exports.CreateFamilyTreeSchema = exports.PathFromChainSchema = exports.CalculateKinshipSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.CalculateKinshipSchema = zod_1.z.object({
6
+ path: zod_1.z.string().min(1, '关系链不能为空').max(200, '关系链过长'),
7
+ region: zod_1.z.enum(['standard', 'northern', 'southern', 'cantonese', 'minnan', 'wu']).default('standard'),
8
+ egoGender: zod_1.z.enum(['male', 'female']).default('male'),
9
+ });
10
+ exports.PathFromChainSchema = zod_1.z.object({
11
+ chain: zod_1.z.array(zod_1.z.string().min(1)).min(1, '关系链不能为空').max(20, '关系链不能超过20步'),
12
+ region: zod_1.z.enum(['standard', 'northern', 'southern', 'cantonese', 'minnan', 'wu']).default('standard'),
13
+ egoGender: zod_1.z.enum(['male', 'female']).default('male'),
14
+ });
15
+ exports.CreateFamilyTreeSchema = zod_1.z.object({
16
+ name: zod_1.z.string().min(1, '家谱名称不能为空').max(100),
17
+ description: zod_1.z.string().max(500).optional(),
18
+ });
19
+ exports.CreatePersonSchema = zod_1.z.object({
20
+ treeId: zod_1.z.number().int().positive(),
21
+ name: zod_1.z.string().min(1).max(50),
22
+ gender: zod_1.z.enum(['male', 'female']),
23
+ birthYear: zod_1.z.number().int().min(1000).max(2100).optional(),
24
+ notes: zod_1.z.string().max(500).optional(),
25
+ isRoot: zod_1.z.boolean().default(false),
26
+ });
27
+ exports.CreateRelationSchema = zod_1.z.object({
28
+ treeId: zod_1.z.number().int().positive(),
29
+ fromPersonId: zod_1.z.number().int().positive(),
30
+ toPersonId: zod_1.z.number().int().positive(),
31
+ relationType: zod_1.z.enum(['F', 'M', 'S', 'D', 'B+', 'B-', 'Z+', 'Z-', 'H', 'W']),
32
+ });
33
+ exports.UpdateFamilyTreeSchema = zod_1.z.object({
34
+ name: zod_1.z.string().min(1, '家谱名称不能为空').max(100).optional(),
35
+ description: zod_1.z.string().max(500).optional(),
36
+ });
37
+ exports.UpdatePersonSchema = zod_1.z.object({
38
+ name: zod_1.z.string().min(1).max(50).optional(),
39
+ gender: zod_1.z.enum(['male', 'female']).optional(),
40
+ birthYear: zod_1.z.number().int().min(1000).max(2100).nullable().optional(),
41
+ notes: zod_1.z.string().max(500).nullable().optional(),
42
+ isRoot: zod_1.z.boolean().optional(),
43
+ });
44
+ exports.ResolveTreePathSchema = zod_1.z.object({
45
+ treeId: zod_1.z.number().int().positive(),
46
+ fromPersonId: zod_1.z.number().int().positive(),
47
+ toPersonId: zod_1.z.number().int().positive(),
48
+ region: zod_1.z.enum(['standard', 'northern', 'southern', 'cantonese', 'minnan', 'wu']).default('standard'),
49
+ });
50
+ //# sourceMappingURL=kinship.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinship.schema.js","sourceRoot":"","sources":["../../src/schemas/kinship.schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { FamilyTree } from '../entities/family-tree.entity.js';
2
+ import { FamilyTreePerson } from '../entities/family-tree-person.entity.js';
3
+ import { FamilyTreeRelation } from '../entities/family-tree-relation.entity.js';
4
+ import { calculateKinship } from '../engine/index.js';
5
+ import type { CreateFamilyTreeDto, UpdateFamilyTreeDto, CreatePersonDto, UpdatePersonDto, CreateRelationDto, ResolveTreePathDto } from '../schemas/kinship.schema.js';
6
+ export interface FamilyTreeGraph {
7
+ tree: FamilyTree;
8
+ persons: FamilyTreePerson[];
9
+ relations: FamilyTreeRelation[];
10
+ }
11
+ export declare class FamilyTreeService {
12
+ private readonly logger;
13
+ private treeRepo;
14
+ private personRepo;
15
+ private relationRepo;
16
+ initialize(): void;
17
+ listTrees(ownerId: number): Promise<FamilyTree[]>;
18
+ getTree(id: number, ownerId?: number): Promise<FamilyTreeGraph>;
19
+ createTree(dto: CreateFamilyTreeDto, ownerId: number): Promise<FamilyTree>;
20
+ updateTree(id: number, dto: UpdateFamilyTreeDto, ownerId: number): Promise<FamilyTree>;
21
+ deleteTree(id: number, ownerId: number): Promise<void>;
22
+ addPerson(dto: CreatePersonDto, ownerId: number): Promise<FamilyTreePerson>;
23
+ updatePerson(id: number, treeId: number, dto: UpdatePersonDto, ownerId: number): Promise<FamilyTreePerson>;
24
+ deletePerson(id: number, treeId: number, ownerId: number): Promise<void>;
25
+ addRelation(dto: CreateRelationDto, ownerId: number): Promise<FamilyTreeRelation>;
26
+ deleteRelation(id: number, treeId: number, ownerId: number): Promise<void>;
27
+ /**
28
+ * Resolve the kinship title between two persons in a tree by
29
+ * finding the shortest relation path using BFS.
30
+ */
31
+ resolveKinship(dto: ResolveTreePathDto, ownerId: number): Promise<{
32
+ path: string;
33
+ steps: string[];
34
+ result: ReturnType<typeof calculateKinship>;
35
+ }>;
36
+ private assertTreeOwner;
37
+ }
38
+ //# sourceMappingURL=family-tree.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-tree.service.d.ts","sourceRoot":"","sources":["../../src/services/family-tree.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,8BAA8B,CAAA;AAErC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,SAAS,EAAE,kBAAkB,EAAE,CAAA;CAChC;AAED,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,YAAY,CAAiC;IAErD,UAAU,IAAI,IAAI;IAQZ,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIjD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAa/D,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAK1E,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAStF,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD,SAAS,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAW3E,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAc1G,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxE,WAAW,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoBjF,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhF;;;OAGG;IACG,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACtE,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAA;KAC5C,CAAC;YAiBY,eAAe;CAK9B"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.FamilyTreeService = void 0;
10
+ const core_1 = require("@octo-cyber/core");
11
+ const family_tree_entity_js_1 = require("../entities/family-tree.entity.js");
12
+ const family_tree_person_entity_js_1 = require("../entities/family-tree-person.entity.js");
13
+ const family_tree_relation_entity_js_1 = require("../entities/family-tree-relation.entity.js");
14
+ const index_js_1 = require("../engine/index.js");
15
+ let FamilyTreeService = class FamilyTreeService {
16
+ logger = core_1.Container.get(core_1.LoggerService);
17
+ treeRepo;
18
+ personRepo;
19
+ relationRepo;
20
+ initialize() {
21
+ const db = core_1.Container.get(core_1.DatabaseService);
22
+ this.treeRepo = db.getRepository(family_tree_entity_js_1.FamilyTree);
23
+ this.personRepo = db.getRepository(family_tree_person_entity_js_1.FamilyTreePerson);
24
+ this.relationRepo = db.getRepository(family_tree_relation_entity_js_1.FamilyTreeRelation);
25
+ this.logger.info('FamilyTreeService initialized');
26
+ }
27
+ async listTrees(ownerId) {
28
+ return this.treeRepo.find({ where: { ownerId }, order: { createdAt: 'DESC' } });
29
+ }
30
+ async getTree(id, ownerId) {
31
+ const tree = await this.treeRepo.findOneBy({ id });
32
+ if (!tree)
33
+ throw new core_1.AppError('家谱不存在', 404);
34
+ if (ownerId !== undefined && tree.ownerId !== ownerId)
35
+ throw new core_1.AppError('无权访问', 403);
36
+ const [persons, relations] = await Promise.all([
37
+ this.personRepo.find({ where: { treeId: id }, order: { createdAt: 'ASC' } }),
38
+ this.relationRepo.find({ where: { treeId: id } }),
39
+ ]);
40
+ return { tree, persons, relations };
41
+ }
42
+ async createTree(dto, ownerId) {
43
+ const tree = this.treeRepo.create({ ...dto, ownerId });
44
+ return this.treeRepo.save(tree);
45
+ }
46
+ async updateTree(id, dto, ownerId) {
47
+ const tree = await this.treeRepo.findOneBy({ id });
48
+ if (!tree)
49
+ throw new core_1.AppError('家谱不存在', 404);
50
+ if (tree.ownerId !== ownerId)
51
+ throw new core_1.AppError('无权操作', 403);
52
+ Object.assign(tree, dto);
53
+ return this.treeRepo.save(tree);
54
+ }
55
+ async deleteTree(id, ownerId) {
56
+ const tree = await this.treeRepo.findOneBy({ id });
57
+ if (!tree)
58
+ throw new core_1.AppError('家谱不存在', 404);
59
+ if (tree.ownerId !== ownerId)
60
+ throw new core_1.AppError('无权操作', 403);
61
+ await this.relationRepo.delete({ treeId: id });
62
+ await this.personRepo.delete({ treeId: id });
63
+ await this.treeRepo.delete(id);
64
+ }
65
+ async addPerson(dto, ownerId) {
66
+ await this.assertTreeOwner(dto.treeId, ownerId);
67
+ if (dto.isRoot) {
68
+ await this.personRepo.update({ treeId: dto.treeId, isRoot: true }, { isRoot: false });
69
+ }
70
+ const person = this.personRepo.create(dto);
71
+ return this.personRepo.save(person);
72
+ }
73
+ async updatePerson(id, treeId, dto, ownerId) {
74
+ await this.assertTreeOwner(treeId, ownerId);
75
+ const person = await this.personRepo.findOneBy({ id, treeId });
76
+ if (!person)
77
+ throw new core_1.AppError('成员不存在', 404);
78
+ if (dto.isRoot) {
79
+ await this.personRepo.update({ treeId, isRoot: true }, { isRoot: false });
80
+ }
81
+ Object.assign(person, dto);
82
+ return this.personRepo.save(person);
83
+ }
84
+ async deletePerson(id, treeId, ownerId) {
85
+ await this.assertTreeOwner(treeId, ownerId);
86
+ const person = await this.personRepo.findOneBy({ id, treeId });
87
+ if (!person)
88
+ throw new core_1.AppError('成员不存在', 404);
89
+ await this.relationRepo.delete({ treeId, fromPersonId: id });
90
+ await this.relationRepo.delete({ treeId, toPersonId: id });
91
+ await this.personRepo.delete({ id, treeId });
92
+ }
93
+ async addRelation(dto, ownerId) {
94
+ await this.assertTreeOwner(dto.treeId, ownerId);
95
+ if (dto.fromPersonId === dto.toPersonId) {
96
+ throw new core_1.AppError('不能建立自身关系', 400);
97
+ }
98
+ // Prevent duplicate relations (same from, to, type)
99
+ const existing = await this.relationRepo.findOneBy({
100
+ treeId: dto.treeId,
101
+ fromPersonId: dto.fromPersonId,
102
+ toPersonId: dto.toPersonId,
103
+ relationType: dto.relationType,
104
+ });
105
+ if (existing)
106
+ throw new core_1.AppError('该关系已存在', 409);
107
+ const relation = this.relationRepo.create(dto);
108
+ return this.relationRepo.save(relation);
109
+ }
110
+ async deleteRelation(id, treeId, ownerId) {
111
+ await this.assertTreeOwner(treeId, ownerId);
112
+ const relation = await this.relationRepo.findOneBy({ id, treeId });
113
+ if (!relation)
114
+ throw new core_1.AppError('关系不存在', 404);
115
+ await this.relationRepo.delete(id);
116
+ }
117
+ /**
118
+ * Resolve the kinship title between two persons in a tree by
119
+ * finding the shortest relation path using BFS.
120
+ */
121
+ async resolveKinship(dto, ownerId) {
122
+ const { treeId, fromPersonId, toPersonId, region } = dto;
123
+ if (fromPersonId === toPersonId)
124
+ throw new core_1.AppError('不能查询自身关系', 400);
125
+ await this.assertTreeOwner(treeId, ownerId);
126
+ const relations = await this.relationRepo.find({ where: { treeId } });
127
+ const path = bfsRelationPath(relations, fromPersonId, toPersonId);
128
+ if (path === null) {
129
+ throw new core_1.AppError('两人之间没有已知关系链', 404);
130
+ }
131
+ const result = (0, index_js_1.calculateKinship)(path, { region: region });
132
+ return { path, steps: path.split('.'), result };
133
+ }
134
+ async assertTreeOwner(treeId, ownerId) {
135
+ const tree = await this.treeRepo.findOneBy({ id: treeId });
136
+ if (!tree)
137
+ throw new core_1.AppError('家谱不存在', 404);
138
+ if (tree.ownerId !== ownerId)
139
+ throw new core_1.AppError('无权操作', 403);
140
+ }
141
+ };
142
+ exports.FamilyTreeService = FamilyTreeService;
143
+ exports.FamilyTreeService = FamilyTreeService = __decorate([
144
+ (0, core_1.Service)()
145
+ ], FamilyTreeService);
146
+ /**
147
+ * BFS to find the shortest relation path between two persons.
148
+ * Returns a dot-separated atom path string, e.g. "F.B+"
149
+ */
150
+ function bfsRelationPath(relations, fromId, toId) {
151
+ if (fromId === toId)
152
+ return '';
153
+ // Build adjacency list: personId → [{toId, relationType}]
154
+ const adj = new Map();
155
+ for (const r of relations) {
156
+ if (!adj.has(r.fromPersonId))
157
+ adj.set(r.fromPersonId, []);
158
+ adj.get(r.fromPersonId).push({ to: r.toPersonId, atom: r.relationType });
159
+ }
160
+ const visited = new Set([fromId]);
161
+ const queue = [{ id: fromId, path: [] }];
162
+ while (queue.length > 0) {
163
+ const current = queue.shift();
164
+ if (current.path.length > 10)
165
+ continue; // max depth guard
166
+ const neighbors = adj.get(current.id) ?? [];
167
+ for (const neighbor of neighbors) {
168
+ if (visited.has(neighbor.to))
169
+ continue;
170
+ const newPath = [...current.path, neighbor.atom];
171
+ if (neighbor.to === toId)
172
+ return newPath.join('.');
173
+ visited.add(neighbor.to);
174
+ queue.push({ id: neighbor.to, path: newPath });
175
+ }
176
+ }
177
+ return null;
178
+ }
179
+ //# sourceMappingURL=family-tree.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-tree.service.js","sourceRoot":"","sources":["../../src/services/family-tree.service.ts"],"names":[],"mappings":"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"}