@degenerate/endpoints 0.2.0 → 0.6.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.
Files changed (49) hide show
  1. package/README.md +18 -0
  2. package/dist/examples/express-server/app.d.ts.map +1 -1
  3. package/dist/examples/express-server/app.js +8 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -0
  7. package/dist/openapi/build-openapi-document.d.ts +27 -0
  8. package/dist/openapi/build-openapi-document.d.ts.map +1 -0
  9. package/dist/openapi/build-openapi-document.js +223 -0
  10. package/dist/openapi/domain-schemas.d.ts +16 -0
  11. package/dist/openapi/domain-schemas.d.ts.map +1 -0
  12. package/dist/openapi/domain-schemas.js +39 -0
  13. package/dist/openapi/index.d.ts +6 -0
  14. package/dist/openapi/index.d.ts.map +1 -0
  15. package/dist/openapi/index.js +21 -0
  16. package/dist/openapi/operations.d.ts +8 -0
  17. package/dist/openapi/operations.d.ts.map +1 -0
  18. package/dist/openapi/operations.js +22 -0
  19. package/dist/openapi/response-schemas.d.ts +32 -0
  20. package/dist/openapi/response-schemas.d.ts.map +1 -0
  21. package/dist/openapi/response-schemas.js +30 -0
  22. package/dist/openapi/types.d.ts +29 -0
  23. package/dist/openapi/types.d.ts.map +1 -0
  24. package/dist/openapi/types.js +2 -0
  25. package/dist/routes/authorities/v1.openapi.d.ts +4 -0
  26. package/dist/routes/authorities/v1.openapi.d.ts.map +1 -0
  27. package/dist/routes/authorities/v1.openapi.js +68 -0
  28. package/dist/routes/events/v1.openapi.d.ts +4 -0
  29. package/dist/routes/events/v1.openapi.d.ts.map +1 -0
  30. package/dist/routes/events/v1.openapi.js +54 -0
  31. package/dist/routes/events.routes.d.ts.map +1 -1
  32. package/dist/routes/events.routes.js +10 -60
  33. package/dist/routes/functions/v1.openapi.d.ts +4 -0
  34. package/dist/routes/functions/v1.openapi.d.ts.map +1 -0
  35. package/dist/routes/functions/v1.openapi.js +68 -0
  36. package/dist/routes/functions.routes.d.ts.map +1 -1
  37. package/dist/routes/functions.routes.js +10 -60
  38. package/dist/routes/rules/v1/rule-set.openapi.d.ts +4 -0
  39. package/dist/routes/rules/v1/rule-set.openapi.d.ts.map +1 -0
  40. package/dist/routes/rules/v1/rule-set.openapi.js +72 -0
  41. package/dist/routes/sharedata/v1.openapi.d.ts +8 -0
  42. package/dist/routes/sharedata/v1.openapi.d.ts.map +1 -0
  43. package/dist/routes/sharedata/v1.openapi.js +60 -0
  44. package/dist/routes/sharedata/v1.routes.d.ts.map +1 -1
  45. package/dist/routes/sharedata/v1.routes.js +27 -1
  46. package/dist/routes/validation/rules/validate-rules.openapi.d.ts +8 -0
  47. package/dist/routes/validation/rules/validate-rules.openapi.d.ts.map +1 -0
  48. package/dist/routes/validation/rules/validate-rules.openapi.js +76 -0
  49. package/package.json +6 -6
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventOperations = void 0;
4
+ const generic_1 = require("@degenerate/generic");
5
+ const response_schemas_1 = require("../../openapi/response-schemas");
6
+ /** Operations under `/events` — all gated by the EVENTS JWT audience. */
7
+ exports.eventOperations = [
8
+ {
9
+ method: 'post',
10
+ path: '/events/v1',
11
+ security: generic_1.AuthorizationAudience.EVENTS,
12
+ summary: 'Create an event.',
13
+ request: generic_1.ISAFETransactionEventAddSchema,
14
+ response: {
15
+ 200: response_schemas_1.SuccessResponseSchema,
16
+ 400: response_schemas_1.ErrorResponseSchema,
17
+ 403: response_schemas_1.ErrorResponseSchema,
18
+ },
19
+ },
20
+ {
21
+ method: 'get',
22
+ path: '/events/v1',
23
+ security: generic_1.AuthorizationAudience.EVENTS,
24
+ summary: 'Get events.',
25
+ response: {
26
+ 200: response_schemas_1.SuccessResponseSchema,
27
+ 403: response_schemas_1.ErrorResponseSchema,
28
+ },
29
+ },
30
+ {
31
+ method: 'patch',
32
+ path: '/events/v1',
33
+ security: generic_1.AuthorizationAudience.EVENTS,
34
+ summary: 'Update an event.',
35
+ request: generic_1.ISAFETransactionEventUpdateSchema,
36
+ response: {
37
+ 200: response_schemas_1.SuccessResponseSchema,
38
+ 400: response_schemas_1.ErrorResponseSchema,
39
+ 403: response_schemas_1.ErrorResponseSchema,
40
+ },
41
+ },
42
+ {
43
+ method: 'delete',
44
+ path: '/events/v1',
45
+ security: generic_1.AuthorizationAudience.EVENTS,
46
+ summary: 'Delete an event.',
47
+ request: generic_1.ISAFETransactionEventDeleteSchema,
48
+ response: {
49
+ 200: response_schemas_1.SuccessResponseSchema,
50
+ 400: response_schemas_1.ErrorResponseSchema,
51
+ 403: response_schemas_1.ErrorResponseSchema,
52
+ },
53
+ },
54
+ ];
@@ -1 +1 @@
1
- {"version":3,"file":"events.routes.d.ts","sourceRoot":"","sources":["../../src/routes/events.routes.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,MAAM,4CAAS,CAAC"}
1
+ {"version":3,"file":"events.routes.d.ts","sourceRoot":"","sources":["../../src/routes/events.routes.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,MAAM,4CAAS,CAAC"}
@@ -1,66 +1,16 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
35
5
  Object.defineProperty(exports, "__esModule", { value: true });
36
6
  exports.events = void 0;
37
- const express = __importStar(require("express"));
7
+ const express_1 = __importDefault(require("express"));
38
8
  const get_set_audiences_1 = require("../cors/authority/audience/get-set-audiences");
9
+ const request_logging_1 = require("../cors/logging/request-logging");
10
+ const v1_routes_1 = require("./events/v1.routes");
39
11
  // eslint-disable-next-line new-cap
40
- const router = express.Router({ mergeParams: true });
41
- router.use(get_set_audiences_1.setAudienceEvents); // set the audience to events (this will throw an error if the audience is not set)
42
- /**
43
- * This creates a new event object.
44
- */
45
- router.post('/', async (req, res) => {
46
- return res.status(200).send({ successful: true });
47
- });
48
- /**
49
- * This gets the event object.
50
- */
51
- router.get('/', async (req, res) => {
52
- return res.status(200).send({ successful: true });
53
- });
54
- /**
55
- * This updates the event object.
56
- */
57
- router.patch('/', async (req, res) => {
58
- return res.status(200).send({ successful: true });
59
- });
60
- /**
61
- * This deletes the event object.
62
- */
63
- router.delete('/', async (req, res) => {
64
- return res.status(200).send({ successful: true });
65
- });
12
+ const router = express_1.default.Router({ mergeParams: true });
13
+ router.use(request_logging_1.requestLogging); // log the request
14
+ router.use(get_set_audiences_1.setAudienceEvents); // set the audience to events
15
+ router.use('/v1', v1_routes_1.v1); // JWT validation + handlers + error handlers live in v1
66
16
  exports.events = router;
@@ -0,0 +1,4 @@
1
+ import type { OperationDescriptor } from '../../openapi/types';
2
+ /** Operations under `/functions` — all gated by the FUNCTIONS JWT audience. */
3
+ export declare const functionOperations: OperationDescriptor[];
4
+ //# sourceMappingURL=v1.openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1.openapi.d.ts","sourceRoot":"","sources":["../../../src/routes/functions/v1.openapi.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAW/D,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAyDnD,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.functionOperations = void 0;
4
+ const zod_1 = require("zod");
5
+ const generic_1 = require("@degenerate/generic");
6
+ const response_schemas_1 = require("../../openapi/response-schemas");
7
+ const FunctionIdResponseSchema = (0, response_schemas_1.successEnvelope)({ functionId: zod_1.z.string() }).meta({
8
+ id: 'FunctionIdResponse',
9
+ });
10
+ /** Operations under `/functions` — all gated by the FUNCTIONS JWT audience. */
11
+ exports.functionOperations = [
12
+ {
13
+ method: 'post',
14
+ path: '/functions/v1',
15
+ security: generic_1.AuthorizationAudience.FUNCTIONS,
16
+ summary: 'Create a function.',
17
+ request: generic_1.ISAFETransactionFunctionAddSchema,
18
+ response: {
19
+ 200: response_schemas_1.SuccessResponseSchema,
20
+ 400: response_schemas_1.ErrorResponseSchema,
21
+ 403: response_schemas_1.ErrorResponseSchema,
22
+ },
23
+ },
24
+ {
25
+ method: 'get',
26
+ path: '/functions/v1',
27
+ security: generic_1.AuthorizationAudience.FUNCTIONS,
28
+ summary: 'List functions.',
29
+ response: {
30
+ 200: response_schemas_1.SuccessResponseSchema,
31
+ 403: response_schemas_1.ErrorResponseSchema,
32
+ },
33
+ },
34
+ {
35
+ method: 'get',
36
+ path: '/functions/v1/{functionid}',
37
+ security: generic_1.AuthorizationAudience.FUNCTIONS,
38
+ summary: 'Get a function by id.',
39
+ response: {
40
+ 200: FunctionIdResponseSchema,
41
+ 403: response_schemas_1.ErrorResponseSchema,
42
+ },
43
+ },
44
+ {
45
+ method: 'patch',
46
+ path: '/functions/v1/{functionid}',
47
+ security: generic_1.AuthorizationAudience.FUNCTIONS,
48
+ summary: 'Update a function by id.',
49
+ request: generic_1.ISAFETransactionFunctionUpdateSchema,
50
+ response: {
51
+ 200: FunctionIdResponseSchema,
52
+ 400: response_schemas_1.ErrorResponseSchema,
53
+ 403: response_schemas_1.ErrorResponseSchema,
54
+ },
55
+ },
56
+ {
57
+ method: 'delete',
58
+ path: '/functions/v1/{functionid}',
59
+ security: generic_1.AuthorizationAudience.FUNCTIONS,
60
+ summary: 'Delete a function by id.',
61
+ request: generic_1.ISAFETransactionFunctionDeleteSchema,
62
+ response: {
63
+ 200: FunctionIdResponseSchema,
64
+ 400: response_schemas_1.ErrorResponseSchema,
65
+ 403: response_schemas_1.ErrorResponseSchema,
66
+ },
67
+ },
68
+ ];
@@ -1 +1 @@
1
- {"version":3,"file":"functions.routes.d.ts","sourceRoot":"","sources":["../../src/routes/functions.routes.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,SAAS,4CAAS,CAAC"}
1
+ {"version":3,"file":"functions.routes.d.ts","sourceRoot":"","sources":["../../src/routes/functions.routes.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,SAAS,4CAAS,CAAC"}
@@ -1,66 +1,16 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
35
5
  Object.defineProperty(exports, "__esModule", { value: true });
36
6
  exports.functions = void 0;
37
- const express = __importStar(require("express"));
7
+ const express_1 = __importDefault(require("express"));
38
8
  const get_set_audiences_1 = require("../cors/authority/audience/get-set-audiences");
9
+ const request_logging_1 = require("../cors/logging/request-logging");
10
+ const v1_routes_1 = require("./functions/v1.routes");
39
11
  // eslint-disable-next-line new-cap
40
- const router = express.Router({ mergeParams: true });
41
- router.use(get_set_audiences_1.setAudienceFunctions); // set the audience to share data (this will throw an error if the audience is not set)
42
- /**
43
- * This creates a new sharedata object.
44
- */
45
- router.post('/', async (req, res) => {
46
- return res.status(200).send({ successful: true });
47
- });
48
- /**
49
- * This gets the sharedata object.
50
- */
51
- router.get('/', async (req, res) => {
52
- return res.status(200).send({ successful: true });
53
- });
54
- /**
55
- * This updates the sharedata object.
56
- */
57
- router.patch('/', async (req, res) => {
58
- return res.status(200).send({ successful: true });
59
- });
60
- /**
61
- * This deletes the sharedata object.
62
- */
63
- router.delete('/', async (req, res) => {
64
- return res.status(200).send({ successful: true });
65
- });
12
+ const router = express_1.default.Router({ mergeParams: true });
13
+ router.use(request_logging_1.requestLogging); // log the request
14
+ router.use(get_set_audiences_1.setAudienceFunctions); // set the audience to functions
15
+ router.use('/v1', v1_routes_1.v1); // JWT validation + handlers + error handlers live in v1
66
16
  exports.functions = router;
@@ -0,0 +1,4 @@
1
+ import type { OperationDescriptor } from '../../../openapi/types';
2
+ /** Operations under `/rules/v1/rule-sets` — all gated by the RULES JWT audience. */
3
+ export declare const ruleSetOperations: OperationDescriptor[];
4
+ //# sourceMappingURL=rule-set.openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-set.openapi.d.ts","sourceRoot":"","sources":["../../../../src/routes/rules/v1/rule-set.openapi.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAelE,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,EAyDlD,CAAC"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ruleSetOperations = void 0;
4
+ const zod_1 = require("zod");
5
+ const generic_1 = require("@degenerate/generic");
6
+ const response_schemas_1 = require("../../../openapi/response-schemas");
7
+ const RuleSetListResponseSchema = (0, response_schemas_1.successEnvelope)({ ruleSets: zod_1.z.array(generic_1.IShareRuleSetSchema) }).meta({
8
+ id: 'RuleSetListResponse',
9
+ });
10
+ const RuleSetItemResponseSchema = (0, response_schemas_1.successEnvelope)({ ruleSet: generic_1.IShareRuleSetSchema.optional() }).meta({
11
+ id: 'RuleSetItemResponse',
12
+ });
13
+ const RulesIdResponseSchema = (0, response_schemas_1.successEnvelope)({ rulesId: zod_1.z.string() }).meta({ id: 'RulesIdResponse' });
14
+ /** Operations under `/rules/v1/rule-sets` — all gated by the RULES JWT audience. */
15
+ exports.ruleSetOperations = [
16
+ {
17
+ method: 'post',
18
+ path: '/rules/v1/rule-sets',
19
+ security: generic_1.AuthorizationAudience.RULES,
20
+ summary: 'Create a rule set.',
21
+ request: generic_1.ISAFETransactionRuleSetAddSchema,
22
+ response: {
23
+ 200: response_schemas_1.SuccessResponseSchema,
24
+ 400: response_schemas_1.ErrorResponseSchema,
25
+ 403: response_schemas_1.ErrorResponseSchema,
26
+ },
27
+ },
28
+ {
29
+ method: 'get',
30
+ path: '/rules/v1/rule-sets',
31
+ security: generic_1.AuthorizationAudience.RULES,
32
+ summary: 'List rule sets.',
33
+ response: {
34
+ 200: RuleSetListResponseSchema,
35
+ 403: response_schemas_1.ErrorResponseSchema,
36
+ },
37
+ },
38
+ {
39
+ method: 'get',
40
+ path: '/rules/v1/rule-sets/{rulesetsid}',
41
+ security: generic_1.AuthorizationAudience.RULES,
42
+ summary: 'Get a rule set by id.',
43
+ response: {
44
+ 200: RuleSetItemResponseSchema,
45
+ 403: response_schemas_1.ErrorResponseSchema,
46
+ },
47
+ },
48
+ {
49
+ method: 'patch',
50
+ path: '/rules/v1/rule-sets/{rulesetsid}',
51
+ security: generic_1.AuthorizationAudience.RULES,
52
+ summary: 'Update a rule set by id.',
53
+ request: generic_1.ISAFETransactionRuleSetUpdateSchema,
54
+ response: {
55
+ 200: RulesIdResponseSchema,
56
+ 400: response_schemas_1.ErrorResponseSchema,
57
+ 403: response_schemas_1.ErrorResponseSchema,
58
+ },
59
+ },
60
+ {
61
+ method: 'delete',
62
+ path: '/rules/v1/rule-sets/{rulesetsid}',
63
+ security: generic_1.AuthorizationAudience.RULES,
64
+ summary: 'Delete a rule set by id.',
65
+ request: generic_1.ISAFETransactionRuleSetDeleteSchema,
66
+ response: {
67
+ 200: RulesIdResponseSchema,
68
+ 400: response_schemas_1.ErrorResponseSchema,
69
+ 403: response_schemas_1.ErrorResponseSchema,
70
+ },
71
+ },
72
+ ];
@@ -0,0 +1,8 @@
1
+ import type { OperationDescriptor } from '../../openapi/types';
2
+ /**
3
+ * Operations under `/share-data` — gated by the SHAREDATA JWT audience, plus a
4
+ * per-resource (BOLA) check on create/delete: the verified token's
5
+ * `allowedSigningKeys` claim must vouch for the block's `creationPublicKey`.
6
+ */
7
+ export declare const shareDataOperations: OperationDescriptor[];
8
+ //# sourceMappingURL=v1.openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1.openapi.d.ts","sourceRoot":"","sources":["../../../src/routes/sharedata/v1.openapi.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,EAiDpD,CAAC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shareDataOperations = void 0;
4
+ const generic_1 = require("@degenerate/generic");
5
+ const response_schemas_1 = require("../../openapi/response-schemas");
6
+ /**
7
+ * Operations under `/share-data` — gated by the SHAREDATA JWT audience, plus a
8
+ * per-resource (BOLA) check on create/delete: the verified token's
9
+ * `allowedSigningKeys` claim must vouch for the block's `creationPublicKey`.
10
+ */
11
+ exports.shareDataOperations = [
12
+ {
13
+ method: 'post',
14
+ path: '/share-data/v1',
15
+ security: generic_1.AuthorizationAudience.SHAREDATA,
16
+ summary: 'Create a ShareData block. The JWT allowedSigningKeys claim must authorize the block creationPublicKey.',
17
+ request: generic_1.ISAFETransactionShareDataAddSchema,
18
+ response: {
19
+ 200: response_schemas_1.SuccessResponseSchema,
20
+ 400: response_schemas_1.ErrorResponseSchema,
21
+ 403: response_schemas_1.ErrorResponseSchema,
22
+ },
23
+ },
24
+ {
25
+ method: 'get',
26
+ path: '/share-data/v1',
27
+ security: generic_1.AuthorizationAudience.SHAREDATA,
28
+ summary: 'List ShareData blocks.',
29
+ response: {
30
+ 200: response_schemas_1.SuccessResponseSchema,
31
+ 403: response_schemas_1.ErrorResponseSchema,
32
+ },
33
+ },
34
+ {
35
+ method: 'patch',
36
+ path: '/share-data/v1/{sharedataid}',
37
+ security: generic_1.AuthorizationAudience.SHAREDATA,
38
+ summary: 'Unsupported. ShareData mutations must go through the rule-engine-verified proposal path, never a wholesale state replacement. Always returns 501.',
39
+ request: generic_1.ISAFETransactionShareDataUpdateSchema,
40
+ deprecated: true,
41
+ response: {
42
+ 400: response_schemas_1.ErrorResponseSchema,
43
+ 403: response_schemas_1.ErrorResponseSchema,
44
+ 501: response_schemas_1.ErrorResponseSchema,
45
+ },
46
+ },
47
+ {
48
+ method: 'delete',
49
+ path: '/share-data/v1/{sharedataid}',
50
+ security: generic_1.AuthorizationAudience.SHAREDATA,
51
+ summary: 'Delete a ShareData block by id. The JWT must vouch for the stored block creationPublicKey (BOLA gate).',
52
+ request: generic_1.ISAFETransactionShareDataDeleteSchema,
53
+ response: {
54
+ 200: response_schemas_1.SuccessResponseSchema,
55
+ 400: response_schemas_1.ErrorResponseSchema,
56
+ 403: response_schemas_1.ErrorResponseSchema,
57
+ 404: response_schemas_1.ErrorResponseSchema,
58
+ },
59
+ },
60
+ ];
@@ -1 +1 @@
1
- {"version":3,"file":"v1.routes.d.ts","sourceRoot":"","sources":["../../../src/routes/sharedata/v1.routes.ts"],"names":[],"mappings":"AA0QA,eAAO,MAAM,EAAE,4CAAS,CAAC"}
1
+ {"version":3,"file":"v1.routes.d.ts","sourceRoot":"","sources":["../../../src/routes/sharedata/v1.routes.ts"],"names":[],"mappings":"AAqSA,eAAO,MAAM,EAAE,4CAAS,CAAC"}
@@ -67,7 +67,7 @@ const getManager = (req) => {
67
67
  const getAllowedSigningKeys = (req) => {
68
68
  const raw = req.auth?.customClaims?.allowedSigningKeys;
69
69
  return Array.isArray(raw) && raw.every((k) => typeof k === 'string')
70
- ? raw
70
+ ? (raw)
71
71
  : undefined;
72
72
  };
73
73
  router.use(add_unique_tracking_1.addUniqueTracking); // add the unique tracking id to the request
@@ -143,6 +143,25 @@ router.post(// https://{hostname}/sharedata/v1
143
143
  case generic_1.ShareBlockType.Distribution:
144
144
  shareData = (0, shareblock_1.createDistributionShareBlock)(factoryArgs);
145
145
  break;
146
+ case generic_1.ShareBlockType.GraceRepayment:
147
+ // Not creatable through this generic route: a GraceRepayment
148
+ // block's initialState needs grace-specific fields
149
+ // (outstandingPrincipalCents, per-lender graceDecision) that the
150
+ // shared create payload doesn't carry. Reject explicitly rather
151
+ // than mis-constructing one from a partial payload.
152
+ return res.status(400).send({
153
+ successful: false,
154
+ error: 'unsupported-block-type: GraceRepayment blocks are not created via this route',
155
+ });
156
+ case generic_1.ShareBlockType.Settlement:
157
+ // Not creatable through this generic route: a Settlement block
158
+ // is a cross-block coordinator built by the orchestrator from a
159
+ // signed settlement plan, not from a wire create payload. It is
160
+ // a library primitive with no HTTP creation surface in v1.
161
+ return res.status(400).send({
162
+ successful: false,
163
+ error: 'unsupported-block-type: Settlement coordinators are not created via this route',
164
+ });
146
165
  default: {
147
166
  // Exhaustiveness check — schema validation should prevent
148
167
  // reaching this, but TS doesn't know that. A runtime fallback
@@ -176,6 +195,13 @@ const REQUIRED_PURPOSES_BY_BLOCK_TYPE = {
176
195
  [generic_1.ShareBlockType.Clearing]: shareblock_1.CLEARING_REQUIRED_PROOF_PURPOSES,
177
196
  [generic_1.ShareBlockType.Funding]: shareblock_1.FUNDING_REQUIRED_PROOF_PURPOSES,
178
197
  [generic_1.ShareBlockType.Distribution]: shareblock_1.DISTRIBUTION_REQUIRED_PROOF_PURPOSES,
198
+ // Listed for type-completeness and to document the real proof set, even
199
+ // though the route currently rejects GraceRepayment creation above.
200
+ [generic_1.ShareBlockType.GraceRepayment]: shareblock_1.GRACE_REPAYMENT_REQUIRED_PROOF_PURPOSES,
201
+ // Settlement coordinators have no generic-route creation path (rejected
202
+ // above), so there is no wire proof bundle to cover — empty for
203
+ // type-completeness only.
204
+ [generic_1.ShareBlockType.Settlement]: [],
179
205
  };
180
206
  /**
181
207
  * This gets the sharedata objects and their data.
@@ -0,0 +1,8 @@
1
+ import type { OperationDescriptor } from '../../../openapi/types';
2
+ /**
3
+ * Operations under `/validation/v1/validate-rules` — public (no JWT). Each
4
+ * echoes `{ successful: true }` when the posted body parses against its domain
5
+ * schema, otherwise the shared 400 error envelope.
6
+ */
7
+ export declare const validateRulesOperations: OperationDescriptor[];
8
+ //# sourceMappingURL=validate-rules.openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-rules.openapi.d.ts","sourceRoot":"","sources":["../../../../src/routes/validation/rules/validate-rules.openapi.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,EAiExD,CAAC"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateRulesOperations = void 0;
4
+ const generic_1 = require("@degenerate/generic");
5
+ const response_schemas_1 = require("../../../openapi/response-schemas");
6
+ /**
7
+ * Operations under `/validation/v1/validate-rules` — public (no JWT). Each
8
+ * echoes `{ successful: true }` when the posted body parses against its domain
9
+ * schema, otherwise the shared 400 error envelope.
10
+ */
11
+ exports.validateRulesOperations = [
12
+ {
13
+ method: 'get',
14
+ path: '/validation',
15
+ security: 'public',
16
+ summary: 'Liveness probe for the validation service.',
17
+ response: {
18
+ 200: response_schemas_1.SuccessResponseSchema,
19
+ },
20
+ },
21
+ {
22
+ method: 'post',
23
+ path: '/validation/v1/validate-rules/rule-set',
24
+ security: 'public',
25
+ summary: 'Validate a rule set against its schema.',
26
+ request: generic_1.IShareRuleSetSchema,
27
+ response: {
28
+ 200: response_schemas_1.SuccessResponseSchema,
29
+ 400: response_schemas_1.ErrorResponseSchema,
30
+ },
31
+ },
32
+ {
33
+ method: 'post',
34
+ path: '/validation/v1/validate-rules/rule-group',
35
+ security: 'public',
36
+ summary: 'Validate a rule group against its schema.',
37
+ request: generic_1.IShareRuleGroupSchema,
38
+ response: {
39
+ 200: response_schemas_1.SuccessResponseSchema,
40
+ 400: response_schemas_1.ErrorResponseSchema,
41
+ },
42
+ },
43
+ {
44
+ method: 'post',
45
+ path: '/validation/v1/validate-rules/rule-applied',
46
+ security: 'public',
47
+ summary: 'Validate an applied rule against its schema.',
48
+ request: generic_1.IShareRuleAppliedSchema,
49
+ response: {
50
+ 200: response_schemas_1.SuccessResponseSchema,
51
+ 400: response_schemas_1.ErrorResponseSchema,
52
+ },
53
+ },
54
+ {
55
+ method: 'post',
56
+ path: '/validation/v1/validate-rules/rule',
57
+ security: 'public',
58
+ summary: 'Validate a rule against its schema.',
59
+ request: generic_1.IShareRuleSchema,
60
+ response: {
61
+ 200: response_schemas_1.SuccessResponseSchema,
62
+ 400: response_schemas_1.ErrorResponseSchema,
63
+ },
64
+ },
65
+ {
66
+ method: 'post',
67
+ path: '/validation/v1/validate-rules/condition',
68
+ security: 'public',
69
+ summary: 'Validate a condition against its schema.',
70
+ request: generic_1.IConditionSchema,
71
+ response: {
72
+ 200: response_schemas_1.SuccessResponseSchema,
73
+ 400: response_schemas_1.ErrorResponseSchema,
74
+ },
75
+ },
76
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@degenerate/endpoints",
3
- "version": "0.2.0",
3
+ "version": "0.6.0",
4
4
  "description": "This contains the ShareData Adaptive Framework Ecosystem (SAFE) network endpoint code",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -50,16 +50,16 @@
50
50
  "author": "Degenerate Inc.",
51
51
  "license": "ISC",
52
52
  "dependencies": {
53
- "@degenerate/generic": "^0.3.0",
54
- "@degenerate/realtime": "^0.1.0",
55
- "@degenerate/shareblock": "^0.3.0",
56
- "@degenerate/sharedata": "^0.3.0",
53
+ "@degenerate/generic": "^0.6.0",
54
+ "@degenerate/realtime": "^0.6.0",
55
+ "@degenerate/shareblock": "^0.6.0",
56
+ "@degenerate/sharedata": "^0.6.0",
57
57
  "@types/supertest": "^6.0.3",
58
58
  "express": "^5.2.1",
59
59
  "supertest": "^7.2.2",
60
60
  "zod": "^4.4.3"
61
61
  },
62
- "gitHead": "c33ed2f06679f5bd76c2eccf7054212c1820a014",
62
+ "gitHead": "c8c1a2f456cdb01a74f85779275b246361e33b81",
63
63
  "engines": {
64
64
  "node": ">=22"
65
65
  }