@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.
- package/.turbo/turbo-build.log +22 -0
- package/dist/controllers/family-tree.controller.d.ts +27 -0
- package/dist/controllers/family-tree.controller.d.ts.map +1 -0
- package/dist/controllers/family-tree.controller.js +88 -0
- package/dist/controllers/family-tree.controller.js.map +1 -0
- package/dist/controllers/kinship-calc.controller.d.ts +15 -0
- package/dist/controllers/kinship-calc.controller.d.ts.map +1 -0
- package/dist/controllers/kinship-calc.controller.js +45 -0
- package/dist/controllers/kinship-calc.controller.js.map +1 -0
- package/dist/engine/index.d.ts +7 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +15 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/kinship-data.d.ts +31 -0
- package/dist/engine/kinship-data.d.ts.map +1 -0
- package/dist/engine/kinship-data.js +150 -0
- package/dist/engine/kinship-data.js.map +1 -0
- package/dist/engine/kinship-engine.d.ts +44 -0
- package/dist/engine/kinship-engine.d.ts.map +1 -0
- package/dist/engine/kinship-engine.js +184 -0
- package/dist/engine/kinship-engine.js.map +1 -0
- package/dist/engine/relation-path.d.ts +37 -0
- package/dist/engine/relation-path.d.ts.map +1 -0
- package/dist/engine/relation-path.js +60 -0
- package/dist/engine/relation-path.js.map +1 -0
- package/dist/entities/family-tree-person.entity.d.ts +12 -0
- package/dist/entities/family-tree-person.entity.d.ts.map +1 -0
- package/dist/entities/family-tree-person.entity.js +61 -0
- package/dist/entities/family-tree-person.entity.js.map +1 -0
- package/dist/entities/family-tree-relation.entity.d.ts +15 -0
- package/dist/entities/family-tree-relation.entity.d.ts.map +1 -0
- package/dist/entities/family-tree-relation.entity.js +58 -0
- package/dist/entities/family-tree-relation.entity.js.map +1 -0
- package/dist/entities/family-tree.entity.d.ts +9 -0
- package/dist/entities/family-tree.entity.d.ts.map +1 -0
- package/dist/entities/family-tree.entity.js +50 -0
- package/dist/entities/family-tree.entity.js.map +1 -0
- package/dist/entities/index.d.ts +12 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +22 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/kinship-title.entity.d.ts +18 -0
- package/dist/entities/kinship-title.entity.d.ts.map +1 -0
- package/dist/entities/kinship-title.entity.js +59 -0
- package/dist/entities/kinship-title.entity.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/kinship-calc.module.d.ts +9 -0
- package/dist/kinship-calc.module.d.ts.map +1 -0
- package/dist/kinship-calc.module.js +45 -0
- package/dist/kinship-calc.module.js.map +1 -0
- package/dist/schemas/kinship.schema.d.ts +129 -0
- package/dist/schemas/kinship.schema.d.ts.map +1 -0
- package/dist/schemas/kinship.schema.js +50 -0
- package/dist/schemas/kinship.schema.js.map +1 -0
- package/dist/services/family-tree.service.d.ts +38 -0
- package/dist/services/family-tree.service.d.ts.map +1 -0
- package/dist/services/family-tree.service.js +179 -0
- package/dist/services/family-tree.service.js.map +1 -0
- package/dist/services/kinship-calc.service.d.ts +26 -0
- package/dist/services/kinship-calc.service.d.ts.map +1 -0
- package/dist/services/kinship-calc.service.js +66 -0
- package/dist/services/kinship-calc.service.js.map +1 -0
- package/package.json +60 -0
- package/src/controllers/family-tree.controller.ts +102 -0
- package/src/controllers/kinship-calc.controller.ts +50 -0
- package/src/engine/index.ts +6 -0
- package/src/engine/kinship-data.ts +188 -0
- package/src/engine/kinship-engine.ts +230 -0
- package/src/engine/relation-path.ts +63 -0
- package/src/entities/family-tree-person.entity.ts +37 -0
- package/src/entities/family-tree-relation.entity.ts +36 -0
- package/src/entities/family-tree.entity.ts +28 -0
- package/src/entities/index.ts +18 -0
- package/src/entities/kinship-title.entity.ts +38 -0
- package/src/index.ts +33 -0
- package/src/kinship-calc.module.ts +51 -0
- package/src/schemas/kinship.schema.ts +70 -0
- package/src/services/family-tree.service.ts +211 -0
- package/src/services/kinship-calc.service.ts +68 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +10 -0
- package/web/components/FamilyTreeCanvas.tsx +177 -0
- package/web/components/FamilyTreeDialogs.tsx +275 -0
- package/web/components/KinshipResultCard.tsx +98 -0
- package/web/components/RegionSelector.tsx +32 -0
- package/web/components/RelationChainBuilder.tsx +104 -0
- package/web/index.ts +29 -0
- package/web/manifest.ts +24 -0
- package/web/messages/en-US.json +108 -0
- package/web/messages/zh-CN.json +108 -0
- package/web/pages/FamilyTreePage.tsx +240 -0
- package/web/pages/KinshipCalcPage.tsx +140 -0
- package/web/services/kinship-service.ts +140 -0
- package/web/stores/kinship-store.ts +80 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|