@stratum-hq/lib 0.1.0
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/dist/__tests__/crypto.test.d.ts +2 -0
- package/dist/__tests__/crypto.test.d.ts.map +1 -0
- package/dist/__tests__/crypto.test.js +41 -0
- package/dist/__tests__/crypto.test.js.map +1 -0
- package/dist/crypto.d.ts +7 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +74 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/pool-helpers.d.ts +4 -0
- package/dist/pool-helpers.d.ts.map +1 -0
- package/dist/pool-helpers.js +31 -0
- package/dist/pool-helpers.js.map +1 -0
- package/dist/services/__tests__/audit-service.test.d.ts +2 -0
- package/dist/services/__tests__/audit-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/audit-service.test.js +220 -0
- package/dist/services/__tests__/audit-service.test.js.map +1 -0
- package/dist/services/__tests__/config-service.test.d.ts +2 -0
- package/dist/services/__tests__/config-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/config-service.test.js +555 -0
- package/dist/services/__tests__/config-service.test.js.map +1 -0
- package/dist/services/__tests__/consent-service.test.d.ts +2 -0
- package/dist/services/__tests__/consent-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/consent-service.test.js +159 -0
- package/dist/services/__tests__/consent-service.test.js.map +1 -0
- package/dist/services/__tests__/event-service.test.d.ts +2 -0
- package/dist/services/__tests__/event-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/event-service.test.js +151 -0
- package/dist/services/__tests__/event-service.test.js.map +1 -0
- package/dist/services/__tests__/permission-service.test.d.ts +2 -0
- package/dist/services/__tests__/permission-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/permission-service.test.js +470 -0
- package/dist/services/__tests__/permission-service.test.js.map +1 -0
- package/dist/services/__tests__/retention-service.test.d.ts +2 -0
- package/dist/services/__tests__/retention-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/retention-service.test.js +126 -0
- package/dist/services/__tests__/retention-service.test.js.map +1 -0
- package/dist/services/__tests__/tenant-service.test.d.ts +2 -0
- package/dist/services/__tests__/tenant-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/tenant-service.test.js +451 -0
- package/dist/services/__tests__/tenant-service.test.js.map +1 -0
- package/dist/services/__tests__/test-helpers.d.ts +9 -0
- package/dist/services/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/services/__tests__/test-helpers.js +20 -0
- package/dist/services/__tests__/test-helpers.js.map +1 -0
- package/dist/services/__tests__/webhook-service.test.d.ts +2 -0
- package/dist/services/__tests__/webhook-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/webhook-service.test.js +174 -0
- package/dist/services/__tests__/webhook-service.test.js.map +1 -0
- package/dist/services/api-key-service.d.ts +61 -0
- package/dist/services/api-key-service.d.ts.map +1 -0
- package/dist/services/api-key-service.js +164 -0
- package/dist/services/api-key-service.js.map +1 -0
- package/dist/services/audit-service.d.ts +6 -0
- package/dist/services/audit-service.d.ts.map +1 -0
- package/dist/services/audit-service.js +85 -0
- package/dist/services/audit-service.js.map +1 -0
- package/dist/services/config-service.d.ts +33 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +271 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/consent-service.d.ts +7 -0
- package/dist/services/consent-service.d.ts.map +1 -0
- package/dist/services/consent-service.js +71 -0
- package/dist/services/consent-service.js.map +1 -0
- package/dist/services/event-service.d.ts +39 -0
- package/dist/services/event-service.d.ts.map +1 -0
- package/dist/services/event-service.js +331 -0
- package/dist/services/event-service.js.map +1 -0
- package/dist/services/key-rotation-service.d.ts +15 -0
- package/dist/services/key-rotation-service.d.ts.map +1 -0
- package/dist/services/key-rotation-service.js +41 -0
- package/dist/services/key-rotation-service.js.map +1 -0
- package/dist/services/permission-service.d.ts +21 -0
- package/dist/services/permission-service.d.ts.map +1 -0
- package/dist/services/permission-service.js +213 -0
- package/dist/services/permission-service.js.map +1 -0
- package/dist/services/region-service.d.ts +9 -0
- package/dist/services/region-service.d.ts.map +1 -0
- package/dist/services/region-service.js +105 -0
- package/dist/services/region-service.js.map +1 -0
- package/dist/services/retention-service.d.ts +19 -0
- package/dist/services/retention-service.d.ts.map +1 -0
- package/dist/services/retention-service.js +88 -0
- package/dist/services/retention-service.js.map +1 -0
- package/dist/services/role-service.d.ts +35 -0
- package/dist/services/role-service.d.ts.map +1 -0
- package/dist/services/role-service.js +101 -0
- package/dist/services/role-service.js.map +1 -0
- package/dist/services/tenant-service.d.ts +25 -0
- package/dist/services/tenant-service.d.ts.map +1 -0
- package/dist/services/tenant-service.js +335 -0
- package/dist/services/tenant-service.js.map +1 -0
- package/dist/services/webhook-service.d.ts +12 -0
- package/dist/services/webhook-service.d.ts.map +1 -0
- package/dist/services/webhook-service.js +129 -0
- package/dist/services/webhook-service.js.map +1 -0
- package/dist/stratum.d.ts +107 -0
- package/dist/stratum.d.ts.map +1 -0
- package/dist/stratum.js +531 -0
- package/dist/stratum.js.map +1 -0
- package/dist/telemetry.d.ts +27 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +94 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-service.js","sourceRoot":"","sources":["../../src/services/permission-service.ts"],"names":[],"mappings":";;;AACA,wDAAiE;AACjE,2CAY0B;AAE1B;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CACtC,IAAa,EACb,QAAgB;IAEhB,OAAO,IAAA,4BAAU,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACvC,kCAAkC;QAClC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAClC,iDAAiD,EACjD,CAAC,QAAQ,CAAC,CACX,CAAC;QACF,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,0BAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QACrD,MAAM,WAAW,GAAG,IAAA,wBAAiB,EAAC,YAAY,CAAC,CAAC;QACpD,eAAe;QACf,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE1C,sEAAsE;QACtE,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CACpC,6DAA6D,EAC7D,CAAC,MAAM,CAAC,CACT,CAAC;QAEF,kDAAkD;QAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;QACvD,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;QAEvD,KAAK,MAAM,eAAe,IAAI,MAAM,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAErD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAE1C,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;oBACrB,gEAAgE;oBAChE,SAAS;gBACX,CAAC;gBAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;oBACpB,KAAK,qBAAc,CAAC,MAAM;wBACxB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;4BACvB,SAAS,EAAE,MAAM,CAAC,EAAE;4BACpB,GAAG,EAAE,MAAM,CAAC,GAAG;4BACf,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,gBAAgB,EAAE,eAAe;4BACjC,MAAM,EAAE,IAAI;4BACZ,SAAS,EAAE,KAAK;yBACjB,CAAC,CAAC;wBACH,MAAM;oBAER,KAAK,qBAAc,CAAC,SAAS;wBAC3B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;4BACvB,SAAS,EAAE,MAAM,CAAC,EAAE;4BACpB,GAAG,EAAE,MAAM,CAAC,GAAG;4BACf,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,gBAAgB,EAAE,eAAe;4BACjC,MAAM,EAAE,KAAK;4BACb,SAAS,EAAE,IAAI;yBAChB,CAAC,CAAC;wBACH,MAAM;oBAER,KAAK,qBAAc,CAAC,SAAS,CAAC;oBAC9B;wBACE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;4BACvB,SAAS,EAAE,MAAM,CAAC,EAAE;4BACpB,GAAG,EAAE,MAAM,CAAC,GAAG;4BACf,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,gBAAgB,EAAE,eAAe;4BACjC,MAAM,EAAE,KAAK;4BACb,SAAS,EAAE,KAAK;yBACjB,CAAC,CAAC;wBACH,MAAM;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AA9FD,gDA8FC;AAED;;;GAGG;AACI,KAAK,UAAU,gBAAgB,CACpC,IAAa,EACb,QAAgB,EAChB,KAA4B;IAE5B,OAAO,IAAA,iCAAe,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5C,yDAAyD;QACzD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAClC,iDAAiD,EACjD,CAAC,QAAQ,CAAC,CACX,CAAC;QACF,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,0BAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,WAAW,GAAG,IAAA,wBAAiB,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACvE,qDAAqD;QACrD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAClC;;;yBAGiB,EACjB,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,qBAAc,CAAC,MAAM,CAAC,CAChD,CAAC;YACF,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,IAAI,4BAAqB,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B;;mBAEa,EACb;YACE,QAAQ;YACR,KAAK,CAAC,GAAG;YACT,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;YACnC,KAAK,CAAC,IAAI,IAAI,qBAAc,CAAC,SAAS;YACtC,KAAK,CAAC,eAAe,IAAI,qBAAc,CAAC,OAAO;SAChD,CACF,CAAC;QAEF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AA9CD,4CA8CC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,IAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,KAA4B;IAE5B,OAAO,IAAA,iCAAe,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC,oEAAoE,EACpE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACrB,CAAC;QACF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,8BAAuB,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEjC,2CAA2C;QAC3C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAClC,iDAAiD,EACjD,CAAC,QAAQ,CAAC,CACX,CAAC;QACF,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,0BAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,wBAAiB,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACvE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAClC;;;yBAGiB,EACjB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,qBAAc,CAAC,MAAM,CAAC,CAClD,CAAC;YACF,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,IAAI,4BAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,sBAAsB,GAAG,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B,kCAAkC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,cAAc,EAClF,MAAM,CACP,CAAC;QAEF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAtED,4CAsEC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,IAAa,EACb,QAAgB,EAChB,QAAgB;IAEhB,OAAO,IAAA,iCAAe,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC,oEAAoE,EACpE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACrB,CAAC;QACF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,8BAAuB,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,QAAQ,MAAM,CAAC,eAAe,EAAE,CAAC;YAC/B,KAAK,qBAAc,CAAC,SAAS;gBAC3B,MAAM,IAAI,sCAA+B,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAExD,KAAK,qBAAc,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5B,0CAA0C;gBAC1C,0CAA0C;gBAC1C,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,KAAK,CACvC;;0BAEgB,EAChB,CAAC,QAAQ,CAAC,CACX,CAAC;gBACF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAE3D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,MAAM,CAAC,KAAK,CAChB;oDACwC,EACxC,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,CAC5B,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,CAAC,KAAK,CAChB,+CAA+C,EAC/C,CAAC,QAAQ,CAAC,CACX,CAAC;gBACF,MAAM;YACR,CAAC;YAED,KAAK,qBAAc,CAAC,IAAI,CAAC;YACzB,OAAO,CAAC,CAAC,CAAC;gBACR,mEAAmE;gBACnE,qEAAqE;gBACrE,kEAAkE;gBAClE,4DAA4D;gBAC5D,MAAM,MAAM,CAAC,KAAK,CAChB,+CAA+C,EAC/C,CAAC,QAAQ,CAAC,CACX,CAAC;gBACF,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AA3DD,4CA2DC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
import type { Region, CreateRegionInput, UpdateRegionInput } from "@stratum-hq/core";
|
|
3
|
+
export declare function createRegion(pool: pg.Pool, input: CreateRegionInput): Promise<Region>;
|
|
4
|
+
export declare function getRegion(pool: pg.Pool, id: string): Promise<Region>;
|
|
5
|
+
export declare function listRegions(pool: pg.Pool): Promise<Region[]>;
|
|
6
|
+
export declare function updateRegion(pool: pg.Pool, id: string, input: UpdateRegionInput): Promise<Region>;
|
|
7
|
+
export declare function deleteRegion(pool: pg.Pool, id: string): Promise<void>;
|
|
8
|
+
export declare function migrateRegion(pool: pg.Pool, tenantId: string, newRegionId: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=region-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-service.d.ts","sourceRoot":"","sources":["../../src/services/region-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErF,wBAAsB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU3F;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY1E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQlE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDvG;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvG"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migrateRegion = exports.deleteRegion = exports.updateRegion = exports.listRegions = exports.getRegion = exports.createRegion = void 0;
|
|
4
|
+
const pool_helpers_js_1 = require("../pool-helpers.js");
|
|
5
|
+
async function createRegion(pool, input) {
|
|
6
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
7
|
+
const res = await client.query(`INSERT INTO regions (display_name, slug, control_plane_url, is_primary, status, metadata)
|
|
8
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
9
|
+
RETURNING id, display_name, slug, control_plane_url, NULL as database_url, is_primary, status, metadata, created_at::text, updated_at::text`, [input.display_name, input.slug, input.control_plane_url ?? null, input.is_primary ?? false, input.status ?? "active", JSON.stringify(input.metadata ?? {})]);
|
|
10
|
+
return res.rows[0];
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
exports.createRegion = createRegion;
|
|
14
|
+
async function getRegion(pool, id) {
|
|
15
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
16
|
+
const res = await client.query(`SELECT id, display_name, slug, control_plane_url, NULL as database_url, is_primary, status, metadata, created_at::text, updated_at::text
|
|
17
|
+
FROM regions WHERE id = $1`, [id]);
|
|
18
|
+
if (res.rows.length === 0) {
|
|
19
|
+
throw new Error(`Region not found: ${id}`);
|
|
20
|
+
}
|
|
21
|
+
return res.rows[0];
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
exports.getRegion = getRegion;
|
|
25
|
+
async function listRegions(pool) {
|
|
26
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
27
|
+
const res = await client.query(`SELECT id, display_name, slug, control_plane_url, NULL as database_url, is_primary, status, metadata, created_at::text, updated_at::text
|
|
28
|
+
FROM regions ORDER BY created_at ASC`);
|
|
29
|
+
return res.rows;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
exports.listRegions = listRegions;
|
|
33
|
+
async function updateRegion(pool, id, input) {
|
|
34
|
+
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
35
|
+
const existing = await client.query(`SELECT id FROM regions WHERE id = $1`, [id]);
|
|
36
|
+
if (existing.rows.length === 0) {
|
|
37
|
+
throw new Error(`Region not found: ${id}`);
|
|
38
|
+
}
|
|
39
|
+
const sets = [];
|
|
40
|
+
const values = [];
|
|
41
|
+
let idx = 1;
|
|
42
|
+
if (input.display_name !== undefined) {
|
|
43
|
+
sets.push(`display_name = $${idx++}`);
|
|
44
|
+
values.push(input.display_name);
|
|
45
|
+
}
|
|
46
|
+
if (input.control_plane_url !== undefined) {
|
|
47
|
+
sets.push(`control_plane_url = $${idx++}`);
|
|
48
|
+
values.push(input.control_plane_url);
|
|
49
|
+
}
|
|
50
|
+
if (input.status !== undefined) {
|
|
51
|
+
sets.push(`status = $${idx++}`);
|
|
52
|
+
values.push(input.status);
|
|
53
|
+
}
|
|
54
|
+
if (input.metadata !== undefined) {
|
|
55
|
+
sets.push(`metadata = $${idx++}`);
|
|
56
|
+
values.push(JSON.stringify(input.metadata));
|
|
57
|
+
}
|
|
58
|
+
if (sets.length === 0) {
|
|
59
|
+
// No changes — return existing
|
|
60
|
+
const current = await client.query(`SELECT id, display_name, slug, control_plane_url, NULL as database_url, is_primary, status, metadata, created_at::text, updated_at::text
|
|
61
|
+
FROM regions WHERE id = $1`, [id]);
|
|
62
|
+
return current.rows[0];
|
|
63
|
+
}
|
|
64
|
+
sets.push(`updated_at = now()`);
|
|
65
|
+
values.push(id);
|
|
66
|
+
const res = await client.query(`UPDATE regions SET ${sets.join(", ")} WHERE id = $${idx}
|
|
67
|
+
RETURNING id, display_name, slug, control_plane_url, NULL as database_url, is_primary, status, metadata, created_at::text, updated_at::text`, values);
|
|
68
|
+
return res.rows[0];
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
exports.updateRegion = updateRegion;
|
|
72
|
+
async function deleteRegion(pool, id) {
|
|
73
|
+
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
74
|
+
// Ensure no tenants are assigned to this region
|
|
75
|
+
const tenantCheck = await client.query(`SELECT COUNT(*) as count FROM tenants WHERE region_id = $1 AND status = 'active'`, [id]);
|
|
76
|
+
if (parseInt(tenantCheck.rows[0].count, 10) > 0) {
|
|
77
|
+
throw new Error(`Cannot delete region ${id}: active tenants are still assigned to it`);
|
|
78
|
+
}
|
|
79
|
+
const res = await client.query(`DELETE FROM regions WHERE id = $1`, [id]);
|
|
80
|
+
if (res.rowCount === 0) {
|
|
81
|
+
throw new Error(`Region not found: ${id}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
exports.deleteRegion = deleteRegion;
|
|
86
|
+
async function migrateRegion(pool, tenantId, newRegionId) {
|
|
87
|
+
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
88
|
+
// Verify tenant exists
|
|
89
|
+
const tenantRes = await client.query(`SELECT id FROM tenants WHERE id = $1 AND status != 'archived'`, [tenantId]);
|
|
90
|
+
if (tenantRes.rows.length === 0) {
|
|
91
|
+
throw new Error(`Tenant not found: ${tenantId}`);
|
|
92
|
+
}
|
|
93
|
+
// Verify target region exists and is active
|
|
94
|
+
const regionRes = await client.query(`SELECT id, status FROM regions WHERE id = $1`, [newRegionId]);
|
|
95
|
+
if (regionRes.rows.length === 0) {
|
|
96
|
+
throw new Error(`Region not found: ${newRegionId}`);
|
|
97
|
+
}
|
|
98
|
+
if (regionRes.rows[0].status !== "active") {
|
|
99
|
+
throw new Error(`Cannot migrate to region ${newRegionId}: region is not active`);
|
|
100
|
+
}
|
|
101
|
+
await client.query(`UPDATE tenants SET region_id = $2, updated_at = now() WHERE id = $1`, [tenantId, newRegionId]);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
exports.migrateRegion = migrateRegion;
|
|
105
|
+
//# sourceMappingURL=region-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-service.js","sourceRoot":"","sources":["../../src/services/region-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
/**
|
|
3
|
+
* Hard-delete audit_logs, webhook_events, and webhook_deliveries older than
|
|
4
|
+
* the specified retention period.
|
|
5
|
+
*/
|
|
6
|
+
export declare function purgeExpiredData(pool: pg.Pool, retentionDays?: number): Promise<{
|
|
7
|
+
deleted_count: number;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* GDPR Article 17 — Right to Erasure.
|
|
11
|
+
* Hard-delete ALL data belonging to a specific tenant, in correct FK order.
|
|
12
|
+
*/
|
|
13
|
+
export declare function purgeTenant(pool: pg.Pool, tenantId: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* GDPR Article 20 — Right to Data Portability.
|
|
16
|
+
* Export all tenant data as a structured JSON object.
|
|
17
|
+
*/
|
|
18
|
+
export declare function exportTenantData(pool: pg.Pool, tenantId: string): Promise<Record<string, unknown>>;
|
|
19
|
+
//# sourceMappingURL=retention-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention-service.d.ts","sourceRoot":"","sources":["../../src/services/retention-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAMpB;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,aAAa,GAAE,MAA+B,GAC7C,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BpC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA2BlC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.exportTenantData = exports.purgeTenant = exports.purgeExpiredData = void 0;
|
|
4
|
+
const core_1 = require("@stratum-hq/core");
|
|
5
|
+
const pool_helpers_js_1 = require("../pool-helpers.js");
|
|
6
|
+
const DEFAULT_RETENTION_DAYS = 90;
|
|
7
|
+
/**
|
|
8
|
+
* Hard-delete audit_logs, webhook_events, and webhook_deliveries older than
|
|
9
|
+
* the specified retention period.
|
|
10
|
+
*/
|
|
11
|
+
async function purgeExpiredData(pool, retentionDays = DEFAULT_RETENTION_DAYS) {
|
|
12
|
+
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
13
|
+
const cutoff = new Date();
|
|
14
|
+
cutoff.setDate(cutoff.getDate() - retentionDays);
|
|
15
|
+
const cutoffISO = cutoff.toISOString();
|
|
16
|
+
let totalDeleted = 0;
|
|
17
|
+
// Delete old webhook deliveries first (FK references webhook_events)
|
|
18
|
+
const deliveries = await client.query(`DELETE FROM webhook_deliveries WHERE created_at < $1`, [cutoffISO]);
|
|
19
|
+
totalDeleted += deliveries.rowCount ?? 0;
|
|
20
|
+
// Delete old webhook events
|
|
21
|
+
const events = await client.query(`DELETE FROM webhook_events WHERE created_at < $1`, [cutoffISO]);
|
|
22
|
+
totalDeleted += events.rowCount ?? 0;
|
|
23
|
+
// Delete old audit logs
|
|
24
|
+
const audits = await client.query(`DELETE FROM audit_logs WHERE created_at < $1`, [cutoffISO]);
|
|
25
|
+
totalDeleted += audits.rowCount ?? 0;
|
|
26
|
+
return { deleted_count: totalDeleted };
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
exports.purgeExpiredData = purgeExpiredData;
|
|
30
|
+
/**
|
|
31
|
+
* GDPR Article 17 — Right to Erasure.
|
|
32
|
+
* Hard-delete ALL data belonging to a specific tenant, in correct FK order.
|
|
33
|
+
*/
|
|
34
|
+
async function purgeTenant(pool, tenantId) {
|
|
35
|
+
await (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
36
|
+
// Guard: reject if tenant has children (FK RESTRICT would crash otherwise)
|
|
37
|
+
const childCheck = await client.query(`SELECT COUNT(*)::int AS count FROM tenants WHERE parent_id = $1`, [tenantId]);
|
|
38
|
+
const childCount = childCheck.rows[0].count;
|
|
39
|
+
if (childCount > 0) {
|
|
40
|
+
throw new core_1.StratumError(core_1.ErrorCode.TENANT_HAS_CHILDREN, `Cannot purge tenant ${tenantId}: has ${childCount} child tenant(s). Purge children first.`, 409, { tenant_id: tenantId, child_count: childCount });
|
|
41
|
+
}
|
|
42
|
+
// Delete in FK-safe order (children before parents)
|
|
43
|
+
await client.query(`DELETE FROM config_entries WHERE tenant_id = $1`, [tenantId]);
|
|
44
|
+
await client.query(`DELETE FROM permission_policies WHERE tenant_id = $1`, [tenantId]);
|
|
45
|
+
await client.query(`DELETE FROM api_keys WHERE tenant_id = $1`, [tenantId]);
|
|
46
|
+
// Webhook deliveries → webhook events → webhooks
|
|
47
|
+
await client.query(`DELETE FROM webhook_deliveries WHERE webhook_id IN (SELECT id FROM webhooks WHERE tenant_id = $1)`, [tenantId]);
|
|
48
|
+
await client.query(`DELETE FROM webhook_events WHERE tenant_id = $1`, [tenantId]);
|
|
49
|
+
await client.query(`DELETE FROM webhooks WHERE tenant_id = $1`, [tenantId]);
|
|
50
|
+
// Consent records
|
|
51
|
+
await client.query(`DELETE FROM consent_records WHERE tenant_id = $1`, [tenantId]);
|
|
52
|
+
// Audit logs
|
|
53
|
+
await client.query(`DELETE FROM audit_logs WHERE tenant_id = $1`, [tenantId]);
|
|
54
|
+
// Finally, the tenant itself
|
|
55
|
+
await client.query(`DELETE FROM tenants WHERE id = $1`, [tenantId]);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
exports.purgeTenant = purgeTenant;
|
|
59
|
+
/**
|
|
60
|
+
* GDPR Article 20 — Right to Data Portability.
|
|
61
|
+
* Export all tenant data as a structured JSON object.
|
|
62
|
+
*/
|
|
63
|
+
async function exportTenantData(pool, tenantId) {
|
|
64
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
65
|
+
const tenant = await client.query(`SELECT * FROM tenants WHERE id = $1`, [tenantId]);
|
|
66
|
+
const configEntries = await client.query(`SELECT * FROM config_entries WHERE tenant_id = $1`, [tenantId]);
|
|
67
|
+
const permissions = await client.query(`SELECT * FROM permission_policies WHERE tenant_id = $1`, [tenantId]);
|
|
68
|
+
const apiKeys = await client.query(`SELECT id, tenant_id, name, created_at, last_used_at, revoked_at, expires_at FROM api_keys WHERE tenant_id = $1`, [tenantId]);
|
|
69
|
+
const webhooks = await client.query(`SELECT id, tenant_id, url, events, active, description, created_at, updated_at FROM webhooks WHERE tenant_id = $1`, [tenantId]);
|
|
70
|
+
const webhookEvents = await client.query(`SELECT * FROM webhook_events WHERE tenant_id = $1`, [tenantId]);
|
|
71
|
+
const webhookDeliveries = await client.query(`SELECT wd.* FROM webhook_deliveries wd JOIN webhooks w ON wd.webhook_id = w.id WHERE w.tenant_id = $1`, [tenantId]);
|
|
72
|
+
const auditLogs = await client.query(`SELECT * FROM audit_logs WHERE tenant_id = $1`, [tenantId]);
|
|
73
|
+
const consentRecords = await client.query(`SELECT * FROM consent_records WHERE tenant_id = $1`, [tenantId]);
|
|
74
|
+
return {
|
|
75
|
+
tenant: tenant.rows[0] ?? null,
|
|
76
|
+
config_entries: configEntries.rows,
|
|
77
|
+
permission_policies: permissions.rows,
|
|
78
|
+
api_keys: apiKeys.rows,
|
|
79
|
+
webhooks: webhooks.rows,
|
|
80
|
+
webhook_events: webhookEvents.rows,
|
|
81
|
+
webhook_deliveries: webhookDeliveries.rows,
|
|
82
|
+
audit_logs: auditLogs.rows,
|
|
83
|
+
consent_records: consentRecords.rows,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
exports.exportTenantData = exportTenantData;
|
|
88
|
+
//# sourceMappingURL=retention-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention-service.js","sourceRoot":"","sources":["../../src/services/retention-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
export interface Role {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string | null;
|
|
6
|
+
scopes: string[];
|
|
7
|
+
tenant_id: string | null;
|
|
8
|
+
created_at: Date;
|
|
9
|
+
updated_at: Date;
|
|
10
|
+
}
|
|
11
|
+
export interface CreateRoleInput {
|
|
12
|
+
name: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
scopes: string[];
|
|
15
|
+
tenant_id?: string | null;
|
|
16
|
+
}
|
|
17
|
+
export interface UpdateRoleInput {
|
|
18
|
+
name?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
scopes?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function createRole(pool: pg.Pool, input: CreateRoleInput): Promise<Role>;
|
|
23
|
+
export declare function getRole(pool: pg.Pool, id: string): Promise<Role | null>;
|
|
24
|
+
export declare function listRoles(pool: pg.Pool, tenantId?: string): Promise<Role[]>;
|
|
25
|
+
export declare function updateRole(pool: pg.Pool, id: string, input: UpdateRoleInput): Promise<Role | null>;
|
|
26
|
+
export declare function deleteRole(pool: pg.Pool, id: string): Promise<boolean>;
|
|
27
|
+
export declare function assignRoleToKey(pool: pg.Pool, keyId: string, roleId: string): Promise<boolean>;
|
|
28
|
+
export declare function removeRoleFromKey(pool: pg.Pool, keyId: string): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve effective scopes for an API key.
|
|
31
|
+
* If the key has a role, the role's scopes take precedence.
|
|
32
|
+
* Otherwise, falls back to the key's own scopes.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveKeyScopes(pool: pg.Pool, keyId: string): Promise<string[]>;
|
|
35
|
+
//# sourceMappingURL=role-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-service.d.ts","sourceRoot":"","sources":["../../src/services/role-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrF;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAQ7E;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAcjF;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAoCxG;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQtF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CActF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveKeyScopes = exports.removeRoleFromKey = exports.assignRoleToKey = exports.deleteRole = exports.updateRole = exports.listRoles = exports.getRole = exports.createRole = void 0;
|
|
4
|
+
const pool_helpers_js_1 = require("../pool-helpers.js");
|
|
5
|
+
async function createRole(pool, input) {
|
|
6
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
7
|
+
const res = await client.query(`INSERT INTO roles (name, description, scopes, tenant_id)
|
|
8
|
+
VALUES ($1, $2, $3, $4)
|
|
9
|
+
RETURNING *`, [input.name, input.description ?? null, input.scopes, input.tenant_id ?? null]);
|
|
10
|
+
return res.rows[0];
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
exports.createRole = createRole;
|
|
14
|
+
async function getRole(pool, id) {
|
|
15
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
16
|
+
const res = await client.query(`SELECT * FROM roles WHERE id = $1`, [id]);
|
|
17
|
+
return res.rows[0] ?? null;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
exports.getRole = getRole;
|
|
21
|
+
async function listRoles(pool, tenantId) {
|
|
22
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
23
|
+
if (tenantId) {
|
|
24
|
+
const res = await client.query(`SELECT * FROM roles WHERE tenant_id = $1 OR tenant_id IS NULL ORDER BY name ASC`, [tenantId]);
|
|
25
|
+
return res.rows;
|
|
26
|
+
}
|
|
27
|
+
const res = await client.query(`SELECT * FROM roles ORDER BY name ASC`);
|
|
28
|
+
return res.rows;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
exports.listRoles = listRoles;
|
|
32
|
+
async function updateRole(pool, id, input) {
|
|
33
|
+
return (0, pool_helpers_js_1.withTransaction)(pool, async (client) => {
|
|
34
|
+
const existing = await client.query(`SELECT * FROM roles WHERE id = $1`, [id]);
|
|
35
|
+
if (existing.rows.length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
const sets = [];
|
|
38
|
+
const values = [];
|
|
39
|
+
let idx = 1;
|
|
40
|
+
if (input.name !== undefined) {
|
|
41
|
+
sets.push(`name = $${idx++}`);
|
|
42
|
+
values.push(input.name);
|
|
43
|
+
}
|
|
44
|
+
if (input.description !== undefined) {
|
|
45
|
+
sets.push(`description = $${idx++}`);
|
|
46
|
+
values.push(input.description);
|
|
47
|
+
}
|
|
48
|
+
if (input.scopes !== undefined) {
|
|
49
|
+
sets.push(`scopes = $${idx++}`);
|
|
50
|
+
values.push(input.scopes);
|
|
51
|
+
}
|
|
52
|
+
if (sets.length === 0)
|
|
53
|
+
return existing.rows[0];
|
|
54
|
+
sets.push(`updated_at = now()`);
|
|
55
|
+
values.push(id);
|
|
56
|
+
const res = await client.query(`UPDATE roles SET ${sets.join(", ")} WHERE id = $${idx} RETURNING *`, values);
|
|
57
|
+
return res.rows[0];
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
exports.updateRole = updateRole;
|
|
61
|
+
async function deleteRole(pool, id) {
|
|
62
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
63
|
+
const res = await client.query(`DELETE FROM roles WHERE id = $1 RETURNING id`, [id]);
|
|
64
|
+
return res.rows.length > 0;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
exports.deleteRole = deleteRole;
|
|
68
|
+
async function assignRoleToKey(pool, keyId, roleId) {
|
|
69
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
70
|
+
const res = await client.query(`UPDATE api_keys SET role_id = $1 WHERE id = $2 AND revoked_at IS NULL RETURNING id`, [roleId, keyId]);
|
|
71
|
+
return res.rows.length > 0;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
exports.assignRoleToKey = assignRoleToKey;
|
|
75
|
+
async function removeRoleFromKey(pool, keyId) {
|
|
76
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
77
|
+
const res = await client.query(`UPDATE api_keys SET role_id = NULL WHERE id = $1 AND revoked_at IS NULL RETURNING id`, [keyId]);
|
|
78
|
+
return res.rows.length > 0;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
exports.removeRoleFromKey = removeRoleFromKey;
|
|
82
|
+
/**
|
|
83
|
+
* Resolve effective scopes for an API key.
|
|
84
|
+
* If the key has a role, the role's scopes take precedence.
|
|
85
|
+
* Otherwise, falls back to the key's own scopes.
|
|
86
|
+
*/
|
|
87
|
+
async function resolveKeyScopes(pool, keyId) {
|
|
88
|
+
return (0, pool_helpers_js_1.withClient)(pool, async (client) => {
|
|
89
|
+
const res = await client.query(`SELECT ak.scopes, r.scopes as role_scopes
|
|
90
|
+
FROM api_keys ak
|
|
91
|
+
LEFT JOIN roles r ON r.id = ak.role_id
|
|
92
|
+
WHERE ak.id = $1 AND ak.revoked_at IS NULL`, [keyId]);
|
|
93
|
+
if (res.rows.length === 0)
|
|
94
|
+
return ["read"];
|
|
95
|
+
const row = res.rows[0];
|
|
96
|
+
// Role scopes override key scopes when a role is assigned
|
|
97
|
+
return row.role_scopes ?? row.scopes ?? ["read"];
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
exports.resolveKeyScopes = resolveKeyScopes;
|
|
101
|
+
//# sourceMappingURL=role-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-service.js","sourceRoot":"","sources":["../../src/services/role-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
import { type TenantNode, type CreateTenantInput, type UpdateTenantInput, type PaginationInput, type PaginatedResult } from "@stratum-hq/core";
|
|
3
|
+
export declare function createTenant(pool: pg.Pool, input: CreateTenantInput): Promise<TenantNode>;
|
|
4
|
+
export declare function getTenant(pool: pg.Pool, id: string, includeArchived?: boolean): Promise<TenantNode>;
|
|
5
|
+
export declare function listTenants(pool: pg.Pool, pagination: PaginationInput): Promise<PaginatedResult<TenantNode>>;
|
|
6
|
+
export declare function updateTenant(pool: pg.Pool, id: string, patch: UpdateTenantInput): Promise<TenantNode>;
|
|
7
|
+
export declare function deleteTenant(pool: pg.Pool, id: string): Promise<void>;
|
|
8
|
+
export declare function moveTenant(pool: pg.Pool, id: string, newParentId: string): Promise<TenantNode>;
|
|
9
|
+
export interface BatchCreateResult {
|
|
10
|
+
created: TenantNode[];
|
|
11
|
+
errors: Array<{
|
|
12
|
+
index: number;
|
|
13
|
+
slug: string;
|
|
14
|
+
error: string;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create multiple tenants in a single transaction.
|
|
19
|
+
* Stops on first error and rolls back all changes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function batchCreateTenants(pool: pg.Pool, inputs: CreateTenantInput[]): Promise<BatchCreateResult>;
|
|
22
|
+
export declare function getAncestors(pool: pg.Pool, id: string): Promise<TenantNode[]>;
|
|
23
|
+
export declare function getDescendants(pool: pg.Pool, id: string): Promise<TenantNode[]>;
|
|
24
|
+
export declare function getChildren(pool: pg.Pool, id: string): Promise<TenantNode[]>;
|
|
25
|
+
//# sourceMappingURL=tenant-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-service.d.ts","sourceRoot":"","sources":["../../src/services/tenant-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EAUrB,MAAM,kBAAkB,CAAC;AAE1B,wBAAsB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CA2E/F;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,EAAE,EAAE,MAAM,EACV,eAAe,UAAQ,GACtB,OAAO,CAAC,UAAU,CAAC,CAgBrB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CA8BtC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,UAAU,CAAC,CAsDrB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB3E;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CA2FrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,MAAM,EAAE,iBAAiB,EAAE,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAwF5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBnF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAoBrF;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQlF"}
|