@meyicloud/meyi-insight-server 1.0.7 → 1.0.8

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 (72) hide show
  1. package/dist/controllers/incident.controller.d.ts.map +1 -1
  2. package/dist/controllers/incident.controller.js +13 -2
  3. package/dist/controllers/incident.controller.js.map +1 -1
  4. package/dist/database/schema.d.ts +146 -20
  5. package/dist/database/schema.d.ts.map +1 -1
  6. package/dist/database/schema.js +16 -2
  7. package/dist/database/schema.js.map +1 -1
  8. package/dist/features/incident-priority/index.d.ts +3 -0
  9. package/dist/features/incident-priority/index.d.ts.map +1 -0
  10. package/dist/features/incident-priority/index.js +3 -0
  11. package/dist/features/incident-priority/index.js.map +1 -0
  12. package/dist/features/incident-priority/priority.rules.d.ts +15 -0
  13. package/dist/features/incident-priority/priority.rules.d.ts.map +1 -0
  14. package/dist/features/incident-priority/priority.rules.js +38 -0
  15. package/dist/features/incident-priority/priority.rules.js.map +1 -0
  16. package/dist/features/incident-priority/priority.types.d.ts +13 -0
  17. package/dist/features/incident-priority/priority.types.d.ts.map +1 -0
  18. package/dist/features/incident-priority/priority.types.js +7 -0
  19. package/dist/features/incident-priority/priority.types.js.map +1 -0
  20. package/dist/features/sla/domain/sla.defaults.d.ts +8 -0
  21. package/dist/features/sla/domain/sla.defaults.d.ts.map +1 -0
  22. package/dist/features/sla/domain/sla.defaults.js +15 -0
  23. package/dist/features/sla/domain/sla.defaults.js.map +1 -0
  24. package/dist/features/sla/domain/sla.evaluator.d.ts +1 -1
  25. package/dist/features/sla/domain/sla.evaluator.d.ts.map +1 -1
  26. package/dist/features/sla/domain/sla.evaluator.js +4 -2
  27. package/dist/features/sla/domain/sla.evaluator.js.map +1 -1
  28. package/dist/features/sla/domain/sla.resolver.d.ts +11 -11
  29. package/dist/features/sla/domain/sla.resolver.d.ts.map +1 -1
  30. package/dist/features/sla/domain/sla.resolver.js +41 -15
  31. package/dist/features/sla/domain/sla.resolver.js.map +1 -1
  32. package/dist/features/sla/domain/sla.types.d.ts +28 -3
  33. package/dist/features/sla/domain/sla.types.d.ts.map +1 -1
  34. package/dist/features/sla/domain/sla.types.js.map +1 -1
  35. package/dist/features/sla/index.d.ts +2 -1
  36. package/dist/features/sla/index.d.ts.map +1 -1
  37. package/dist/features/sla/index.js +1 -0
  38. package/dist/features/sla/index.js.map +1 -1
  39. package/dist/features/sla/sla-policy.model.d.ts +23 -10
  40. package/dist/features/sla/sla-policy.model.d.ts.map +1 -1
  41. package/dist/features/sla/sla-policy.model.js +50 -28
  42. package/dist/features/sla/sla-policy.model.js.map +1 -1
  43. package/dist/features/sla/sla-policy.service.d.ts +7 -13
  44. package/dist/features/sla/sla-policy.service.d.ts.map +1 -1
  45. package/dist/features/sla/sla-policy.service.js +25 -20
  46. package/dist/features/sla/sla-policy.service.js.map +1 -1
  47. package/dist/features/sla/sla.schema.d.ts +19 -2
  48. package/dist/features/sla/sla.schema.d.ts.map +1 -1
  49. package/dist/features/sla/sla.schema.js +7 -6
  50. package/dist/features/sla/sla.schema.js.map +1 -1
  51. package/dist/migrations/run.d.ts.map +1 -1
  52. package/dist/migrations/run.js +82 -5
  53. package/dist/migrations/run.js.map +1 -1
  54. package/dist/models/incident.model.d.ts +3 -0
  55. package/dist/models/incident.model.d.ts.map +1 -1
  56. package/dist/models/incident.model.js +6 -0
  57. package/dist/models/incident.model.js.map +1 -1
  58. package/dist/service.d.ts +2 -1
  59. package/dist/service.d.ts.map +1 -1
  60. package/dist/service.js +1 -1
  61. package/dist/service.js.map +1 -1
  62. package/dist/services/alert.service.d.ts.map +1 -1
  63. package/dist/services/alert.service.js +2 -0
  64. package/dist/services/alert.service.js.map +1 -1
  65. package/dist/services/incident.service.d.ts +8 -0
  66. package/dist/services/incident.service.d.ts.map +1 -1
  67. package/dist/services/incident.service.js +19 -5
  68. package/dist/services/incident.service.js.map +1 -1
  69. package/dist/services/workflow.service.d.ts.map +1 -1
  70. package/dist/services/workflow.service.js +2 -0
  71. package/dist/services/workflow.service.js.map +1 -1
  72. package/package.json +1 -1
@@ -0,0 +1,38 @@
1
+ import { DEFAULT_INCIDENT_PRIORITY, INCIDENT_PRIORITIES } from "./priority.types.js";
2
+ /** Accepts "P1".."P4" in any case, with surrounding spaces. Anything else is null. */
3
+ export function normalizePriority(raw) {
4
+ if (typeof raw !== "string")
5
+ return null;
6
+ const value = raw.trim().toUpperCase();
7
+ return INCIDENT_PRIORITIES.includes(value) ? value : null;
8
+ }
9
+ /** Alert severity to incident priority: critical P1, high P2, medium P3, low or info P4. */
10
+ export function priorityFromSeverity(raw) {
11
+ if (typeof raw !== "string")
12
+ return null;
13
+ switch (raw.trim().toLowerCase()) {
14
+ case "critical":
15
+ return "P1";
16
+ case "high":
17
+ return "P2";
18
+ case "medium":
19
+ return "P3";
20
+ case "low":
21
+ case "info":
22
+ return "P4";
23
+ default:
24
+ return null;
25
+ }
26
+ }
27
+ /**
28
+ * The priority an incident gets when it is created: an explicit value wins, then a priority tag,
29
+ * then the alert severity (or a severity tag), then the default.
30
+ */
31
+ export function derivePriority(input) {
32
+ return (normalizePriority(input.explicit) ??
33
+ normalizePriority(input.tags?.priority) ??
34
+ priorityFromSeverity(input.severity) ??
35
+ priorityFromSeverity(input.tags?.severity) ??
36
+ DEFAULT_INCIDENT_PRIORITY);
37
+ }
38
+ //# sourceMappingURL=priority.rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority.rules.js","sourceRoot":"","sources":["../../../src/features/incident-priority/priority.rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAyB,MAAM,qBAAqB,CAAC;AAE5G,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,OAAQ,mBAAyC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAA0B,CAAC,CAAC,CAAC,IAAI,CAAC;AACzG,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACjC,KAAK,UAAU;YACb,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;QACd,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAI9B;IACC,OAAO,CACL,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QACvC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC;QACpC,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC1C,yBAAyB,CAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ /** Incident priority, highest first. Stored on insight_incidents.priority. */
3
+ export declare const INCIDENT_PRIORITIES: readonly ["P1", "P2", "P3", "P4"];
4
+ export type IncidentPriority = (typeof INCIDENT_PRIORITIES)[number];
5
+ /** Used when nothing in the incident says otherwise. */
6
+ export declare const DEFAULT_INCIDENT_PRIORITY: IncidentPriority;
7
+ export declare const IncidentPrioritySchema: z.ZodEnum<{
8
+ P2: "P2";
9
+ P1: "P1";
10
+ P3: "P3";
11
+ P4: "P4";
12
+ }>;
13
+ //# sourceMappingURL=priority.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority.types.d.ts","sourceRoot":"","sources":["../../../src/features/incident-priority/priority.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,mCAAoC,CAAC;AAErE,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,wDAAwD;AACxD,eAAO,MAAM,yBAAyB,EAAE,gBAAuB,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;EAA8B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+ /** Incident priority, highest first. Stored on insight_incidents.priority. */
3
+ export const INCIDENT_PRIORITIES = ["P1", "P2", "P3", "P4"];
4
+ /** Used when nothing in the incident says otherwise. */
5
+ export const DEFAULT_INCIDENT_PRIORITY = "P2";
6
+ export const IncidentPrioritySchema = z.enum(INCIDENT_PRIORITIES);
7
+ //# sourceMappingURL=priority.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priority.types.js","sourceRoot":"","sources":["../../../src/features/incident-priority/priority.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAIrE,wDAAwD;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAqB,IAAI,CAAC;AAEhE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SlaTargets } from "./sla.types.js";
2
+ /**
3
+ * Values the settings form pre-fills when SLA is turned on. They are suggestions only: SLA stays
4
+ * disabled for an account until someone saves a policy.
5
+ */
6
+ export declare const SUGGESTED_SLA_TARGETS: Readonly<SlaTargets>;
7
+ export declare function suggestedTargets(): SlaTargets;
8
+ //# sourceMappingURL=sla.defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sla.defaults.d.ts","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,UAAU,CAKrD,CAAC;AAEH,wBAAgB,gBAAgB,IAAI,UAAU,CAG7C"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Values the settings form pre-fills when SLA is turned on. They are suggestions only: SLA stays
3
+ * disabled for an account until someone saves a policy.
4
+ */
5
+ export const SUGGESTED_SLA_TARGETS = Object.freeze({
6
+ P1: { ackMinutes: 10, resolveMinutes: 60 },
7
+ P2: { ackMinutes: 30, resolveMinutes: 120 },
8
+ P3: { ackMinutes: 120, resolveMinutes: 480 },
9
+ P4: { ackMinutes: 240, resolveMinutes: 1440 },
10
+ });
11
+ export function suggestedTargets() {
12
+ const t = SUGGESTED_SLA_TARGETS;
13
+ return { P1: { ...t.P1 }, P2: { ...t.P2 }, P3: { ...t.P3 }, P4: { ...t.P4 } };
14
+ }
15
+ //# sourceMappingURL=sla.defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sla.defaults.js","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.defaults.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAyB,MAAM,CAAC,MAAM,CAAC;IACvE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;IAC1C,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE;IAC3C,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE;IAC5C,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,GAAG,qBAAqB,CAAC;IAChC,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;AAChF,CAAC"}
@@ -3,6 +3,6 @@ import type { SlaEvaluation, SlaIncidentInput, SlaPolicy, SlaPolicyResolver } fr
3
3
  export declare function evaluateIncidentSla(incident: SlaIncidentInput, policy: SlaPolicy, now?: Date): SlaEvaluation;
4
4
  /** True while an unresolved incident is currently past an SLA limit. */
5
5
  export declare function isBreachingNow(evaluation: SlaEvaluation, status: string): boolean;
6
- /** Evaluates a raw incident row, resolving its account policy first. Ack time keeps the historic definition. */
6
+ /** Evaluates a raw incident row, resolving the policy for its account and priority. Ack time keeps the historic definition. */
7
7
  export declare function evaluateIncidentRow(row: any, resolve: SlaPolicyResolver, now?: Date): SlaEvaluation;
8
8
  //# sourceMappingURL=sla.evaluator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla.evaluator.d.ts","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAY,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA2C9G,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,aAAa,CAyBxH;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGjF;AAED,gHAAgH;AAChH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,GAAE,IAAiB,GAAG,aAAa,CAW/G"}
1
+ {"version":3,"file":"sla.evaluator.d.ts","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.evaluator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAY,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA2C9G,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,aAAa,CAyBxH;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGjF;AAED,+HAA+H;AAC/H,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,GAAE,IAAiB,GAAG,aAAa,CAW/G"}
@@ -1,3 +1,5 @@
1
+ import { DEFAULT_INCIDENT_PRIORITY } from "../../incident-priority/priority.types.js";
2
+ import { normalizePriority } from "../../incident-priority/priority.rules.js";
1
3
  const toMs = (v) => {
2
4
  if (!v)
3
5
  return null;
@@ -60,13 +62,13 @@ export function isBreachingNow(evaluation, status) {
60
62
  return false;
61
63
  return evaluation.ack.state === "overdue" || evaluation.resolve.state === "overdue";
62
64
  }
63
- /** Evaluates a raw incident row, resolving its account policy first. Ack time keeps the historic definition. */
65
+ /** Evaluates a raw incident row, resolving the policy for its account and priority. Ack time keeps the historic definition. */
64
66
  export function evaluateIncidentRow(row, resolve, now = new Date()) {
65
67
  return evaluateIncidentSla({
66
68
  status: row.status,
67
69
  createdAt: row.createdAt,
68
70
  ackedAt: row.analysisTriggeredAt ?? row.updatedAt,
69
71
  resolvedAt: row.resolvedAt,
70
- }, resolve(row.accountId), now);
72
+ }, resolve(row.accountId, normalizePriority(row.priority) ?? DEFAULT_INCIDENT_PRIORITY), now);
71
73
  }
72
74
  //# sourceMappingURL=sla.evaluator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla.evaluator.js","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sla.evaluator.js","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.evaluator.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import type { SlaPolicy, SlaPolicyRecord, SlaPolicyResolver } from "./sla.types.js";
1
+ import { type IncidentPriority } from "../../incident-priority/priority.types.js";
2
+ import type { AccountSlaConfig, SlaPolicy, SlaPolicyRecord, SlaPolicyResolver, SlaTargetRecord, SlaTargets } from "./sla.types.js";
2
3
  /**
3
- * SLA is opt-in per account: with no saved policy it is disabled. The limits below are only
4
- * the values the settings form suggests when someone turns SLA on.
4
+ * SLA is opt-in per account: with no saved policy it is disabled. The limits are only the suggested
5
+ * values for that priority.
5
6
  */
6
- export declare const SUGGESTED_SLA_LIMITS: {
7
- readonly ackMinutes: 30;
8
- readonly resolveMinutes: 120;
9
- };
10
- export declare function defaultSlaPolicy(): SlaPolicy;
11
- export declare function policyFromRecord(record: Pick<SlaPolicyRecord, "enabled" | "ackMinutes" | "resolveMinutes">): SlaPolicy;
12
- /** Builds a resolver over a set of account policies. A policy applies to every severity. */
13
- export declare function createSlaResolver(records: SlaPolicyRecord[]): SlaPolicyResolver;
7
+ export declare function defaultSlaPolicy(priority: IncidentPriority): SlaPolicy;
8
+ /** Fills any priority missing from storage with its suggested limits, so callers always get all four. */
9
+ export declare function targetsFromRecords(records: SlaTargetRecord[]): SlaTargets;
10
+ /** Builds the API view of one account; with no policy row it is the disabled default. */
11
+ export declare function accountConfigFromRecords(accountId: string, policy: SlaPolicyRecord | null, targetRecords: SlaTargetRecord[]): AccountSlaConfig;
12
+ /** Builds a resolver over the tenant's account policies and their per-priority limits. */
13
+ export declare function createSlaResolver(policies: SlaPolicyRecord[], targets: SlaTargetRecord[]): SlaPolicyResolver;
14
14
  //# sourceMappingURL=sla.resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla.resolver.d.ts","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;CAAmD,CAAC;AAErF,wBAAgB,gBAAgB,IAAI,SAAS,CAE5C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,YAAY,GAAG,gBAAgB,CAAC,GAAG,SAAS,CAOtH;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,iBAAiB,CAM/E"}
1
+ {"version":3,"file":"sla.resolver.d.ts","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAEvG,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAEtE;AAED,yGAAyG;AACzG,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,UAAU,CAQzE;AAED,yFAAyF;AACzF,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,aAAa,EAAE,eAAe,EAAE,GAC/B,gBAAgB,CAYlB;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,iBAAiB,CAe5G"}
@@ -1,25 +1,51 @@
1
+ import { INCIDENT_PRIORITIES } from "../../incident-priority/priority.types.js";
2
+ import { SUGGESTED_SLA_TARGETS, suggestedTargets } from "./sla.defaults.js";
1
3
  /**
2
- * SLA is opt-in per account: with no saved policy it is disabled. The limits below are only
3
- * the values the settings form suggests when someone turns SLA on.
4
+ * SLA is opt-in per account: with no saved policy it is disabled. The limits are only the suggested
5
+ * values for that priority.
4
6
  */
5
- export const SUGGESTED_SLA_LIMITS = { ackMinutes: 30, resolveMinutes: 120 };
6
- export function defaultSlaPolicy() {
7
- return { enabled: false, ...SUGGESTED_SLA_LIMITS, source: "default" };
7
+ export function defaultSlaPolicy(priority) {
8
+ return { enabled: false, priority, ...SUGGESTED_SLA_TARGETS[priority], source: "default" };
8
9
  }
9
- export function policyFromRecord(record) {
10
+ /** Fills any priority missing from storage with its suggested limits, so callers always get all four. */
11
+ export function targetsFromRecords(records) {
12
+ const targets = suggestedTargets();
13
+ for (const r of records) {
14
+ if (INCIDENT_PRIORITIES.includes(r.priority)) {
15
+ targets[r.priority] = { ackMinutes: r.ackMinutes, resolveMinutes: r.resolveMinutes };
16
+ }
17
+ }
18
+ return targets;
19
+ }
20
+ /** Builds the API view of one account; with no policy row it is the disabled default. */
21
+ export function accountConfigFromRecords(accountId, policy, targetRecords) {
22
+ if (!policy) {
23
+ return { accountId, enabled: false, source: "default", targets: suggestedTargets(), updatedBy: null, updatedAt: null };
24
+ }
10
25
  return {
11
- enabled: record.enabled,
12
- ackMinutes: record.ackMinutes,
13
- resolveMinutes: record.resolveMinutes,
26
+ accountId,
27
+ enabled: policy.enabled,
14
28
  source: "account",
29
+ targets: targetsFromRecords(targetRecords),
30
+ updatedBy: policy.updatedBy,
31
+ updatedAt: policy.updatedAt,
15
32
  };
16
33
  }
17
- /** Builds a resolver over a set of account policies. A policy applies to every severity. */
18
- export function createSlaResolver(records) {
19
- const byAccount = new Map(records.map((r) => [r.accountId, r]));
20
- return (accountId) => {
21
- const record = accountId ? byAccount.get(accountId) : undefined;
22
- return record ? policyFromRecord(record) : defaultSlaPolicy();
34
+ /** Builds a resolver over the tenant's account policies and their per-priority limits. */
35
+ export function createSlaResolver(policies, targets) {
36
+ const policyByAccount = new Map(policies.map((p) => [p.accountId, p]));
37
+ const targetsByAccount = new Map();
38
+ for (const t of targets) {
39
+ const list = targetsByAccount.get(t.accountId) ?? [];
40
+ list.push(t);
41
+ targetsByAccount.set(t.accountId, list);
42
+ }
43
+ return (accountId, priority) => {
44
+ const policy = accountId ? policyByAccount.get(accountId) : undefined;
45
+ if (!accountId || !policy)
46
+ return defaultSlaPolicy(priority);
47
+ const target = targetsFromRecords(targetsByAccount.get(accountId) ?? [])[priority];
48
+ return { enabled: policy.enabled, priority, ...target, source: "account" };
23
49
  };
24
50
  }
25
51
  //# sourceMappingURL=sla.resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla.resolver.js","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.resolver.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAW,CAAC;AAErF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA0E;IACzG,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,iBAAiB,CAAC,OAA0B;IAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,SAAS,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,OAAO,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAChE,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"sla.resolver.js","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAyB,MAAM,2CAA2C,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAU5E;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA0B;IACzD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC7F,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IAC3D,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAK,mBAAyC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC;QACvF,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,wBAAwB,CACtC,SAAiB,EACjB,MAA8B,EAC9B,aAAgC;IAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzH,CAAC;IACD,OAAO;QACL,SAAS;QACT,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,kBAAkB,CAAC,aAAa,CAAC;QAC1C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,QAA2B,EAAE,OAA0B;IACvF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;YAAE,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC"}
@@ -1,18 +1,43 @@
1
+ import type { IncidentPriority } from "../../incident-priority/priority.types.js";
1
2
  /** Where an effective SLA policy came from. */
2
3
  export type SlaPolicySource = "account" | "default";
4
+ /** Acknowledge and resolve limits for one priority. */
5
+ export interface SlaTarget {
6
+ ackMinutes: number;
7
+ resolveMinutes: number;
8
+ }
9
+ /** Limits for every priority; an enabled account always has all four. */
10
+ export type SlaTargets = Record<IncidentPriority, SlaTarget>;
11
+ /** The policy that applies to one incident: its account's settings resolved for the incident's priority. */
3
12
  export interface SlaPolicy {
4
13
  enabled: boolean;
14
+ priority: IncidentPriority;
5
15
  ackMinutes: number;
6
16
  resolveMinutes: number;
7
17
  source: SlaPolicySource;
8
18
  }
9
- /** Persisted per-account override (one row per tenant + AWS account). */
19
+ /** Persisted account-level switch (one row per tenant + AWS account). */
10
20
  export interface SlaPolicyRecord {
11
21
  tenantId: string;
12
22
  accountId: string;
13
23
  enabled: boolean;
24
+ updatedBy: string | null;
25
+ updatedAt: Date | string | null;
26
+ }
27
+ /** Persisted limits for one priority of one account. */
28
+ export interface SlaTargetRecord {
29
+ tenantId: string;
30
+ accountId: string;
31
+ priority: IncidentPriority;
14
32
  ackMinutes: number;
15
33
  resolveMinutes: number;
34
+ }
35
+ /** An account's whole SLA configuration, as the API presents it. */
36
+ export interface AccountSlaConfig {
37
+ accountId: string;
38
+ enabled: boolean;
39
+ source: SlaPolicySource;
40
+ targets: SlaTargets;
16
41
  updatedBy: string | null;
17
42
  updatedAt: Date | string | null;
18
43
  }
@@ -40,8 +65,8 @@ export interface SlaIncidentInput {
40
65
  ackedAt?: Date | string | null;
41
66
  resolvedAt?: Date | string | null;
42
67
  }
43
- /** Resolves the effective policy for an incident's account. Built once per request. */
44
- export type SlaPolicyResolver = (accountId: string | null | undefined) => SlaPolicy;
68
+ /** Resolves the effective policy for an incident's account and priority. Built once per request. */
69
+ export type SlaPolicyResolver = (accountId: string | null | undefined, priority: IncidentPriority) => SlaPolicy;
45
70
  /**
46
71
  * Port used by incident code so it doesn't depend on persistence details.
47
72
  * `tenantId` undefined yields a resolver that only returns defaults.
@@ -1 +1 @@
1
- {"version":3,"file":"sla.types.d.ts","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.types.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,oDAAoD;IACpD,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,uFAAuF;AACvF,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,SAAS,CAAC;AAEpF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,UAAU;;IAErB,eAAe;;CAEP,CAAC"}
1
+ {"version":3,"file":"sla.types.d.ts","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAElF,+CAA+C;AAC/C,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpD,uDAAuD;AACvD,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yEAAyE;AACzE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;AAE7D,4GAA4G;AAC5G,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wDAAwD;AACxD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,oDAAoD;IACpD,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,oGAAoG;AACpG,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,gBAAgB,KAAK,SAAS,CAAC;AAEhH;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,UAAU;;IAErB,eAAe;;CAEP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sla.types.js","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.types.ts"],"names":[],"mappings":"AA4DA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,UAAU,EAAE,CAAC;IACb,eAAe;IACf,UAAU,EAAE,MAAM;CACV,CAAC"}
1
+ {"version":3,"file":"sla.types.js","sourceRoot":"","sources":["../../../../src/features/sla/domain/sla.types.ts"],"names":[],"mappings":"AA0FA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,UAAU,EAAE,CAAC;IACb,eAAe;IACf,UAAU,EAAE,MAAM;CACV,CAAC"}
@@ -1,7 +1,8 @@
1
1
  export * from "./domain/sla.types.js";
2
+ export * from "./domain/sla.defaults.js";
2
3
  export * from "./domain/sla.resolver.js";
3
4
  export * from "./domain/sla.evaluator.js";
4
5
  export { SlaPolicyModel } from "./sla-policy.model.js";
5
- export { SlaPolicyService, SlaError, type AccountSlaPolicy } from "./sla-policy.service.js";
6
+ export { SlaPolicyService, SlaError } from "./sla-policy.service.js";
6
7
  export { createSlaRouter } from "./sla.routes.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/sla/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/sla/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "./domain/sla.types.js";
2
+ export * from "./domain/sla.defaults.js";
2
3
  export * from "./domain/sla.resolver.js";
3
4
  export * from "./domain/sla.evaluator.js";
4
5
  export { SlaPolicyModel } from "./sla-policy.model.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/sla/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAyB,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/sla/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,19 +1,32 @@
1
- import type { SlaPolicyRecord } from "./domain/sla.types.js";
2
- /** Persistence only: every query is scoped by tenant_id. No business rules here. */
1
+ import type { SlaPolicyRecord, SlaTargetRecord, SlaTargets } from "./domain/sla.types.js";
2
+ /**
3
+ * Persistence for an account's SLA policy: the account-level switch plus its per-priority limits.
4
+ * Every query is scoped by tenant_id; there are no business rules here.
5
+ */
3
6
  export declare class SlaPolicyModel {
4
7
  private db;
5
- private tbl;
6
- constructor(db: any, tbl: any);
7
- listByTenant(tenantId: string): Promise<SlaPolicyRecord[]>;
8
- findByAccount(tenantId: string, accountId: string): Promise<SlaPolicyRecord | null>;
9
- upsert(input: {
8
+ private policies;
9
+ private targets;
10
+ constructor(db: any, policies: any, targets: any);
11
+ listByTenant(tenantId: string): Promise<{
12
+ policies: SlaPolicyRecord[];
13
+ targets: SlaTargetRecord[];
14
+ }>;
15
+ findByAccount(tenantId: string, accountId: string): Promise<{
16
+ policy: SlaPolicyRecord | null;
17
+ targets: SlaTargetRecord[];
18
+ }>;
19
+ /** Saves the switch and replaces all four priority limits atomically, so an account is never half-saved. */
20
+ save(input: {
10
21
  tenantId: string;
11
22
  accountId: string;
12
23
  enabled: boolean;
13
- ackMinutes: number;
14
- resolveMinutes: number;
24
+ targets: SlaTargets;
15
25
  updatedBy: string | null;
16
- }): Promise<SlaPolicyRecord>;
26
+ }): Promise<{
27
+ policy: SlaPolicyRecord;
28
+ targets: SlaTargetRecord[];
29
+ }>;
17
30
  delete(tenantId: string, accountId: string): Promise<void>;
18
31
  }
19
32
  //# sourceMappingURL=sla-policy.model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla-policy.model.d.ts","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,oFAAoF;AACpF,qBAAa,cAAc;IAEvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,GAAG;gBADH,EAAE,EAAE,GAAG,EACP,GAAG,EAAE,GAAG;IAGZ,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAI1D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IASnF,MAAM,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GAAG,OAAO,CAAC,eAAe,CAAC;IAkBtB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjE"}
1
+ {"version":3,"file":"sla-policy.model.d.ts","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE1F;;;GAGG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;gBAFP,EAAE,EAAE,GAAG,EACP,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,GAAG;IAGhB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;QAAC,OAAO,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAMpG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAa1E,4GAA4G;IACtG,IAAI,CAAC,KAAK,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,UAAU,CAAC;QACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAsB9D,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUjE"}
@@ -1,44 +1,66 @@
1
1
  import { and, eq } from "drizzle-orm";
2
- /** Persistence only: every query is scoped by tenant_id. No business rules here. */
2
+ import { INCIDENT_PRIORITIES } from "../incident-priority/priority.types.js";
3
+ /**
4
+ * Persistence for an account's SLA policy: the account-level switch plus its per-priority limits.
5
+ * Every query is scoped by tenant_id; there are no business rules here.
6
+ */
3
7
  export class SlaPolicyModel {
4
8
  db;
5
- tbl;
6
- constructor(db, tbl) {
9
+ policies;
10
+ targets;
11
+ constructor(db, policies, targets) {
7
12
  this.db = db;
8
- this.tbl = tbl;
13
+ this.policies = policies;
14
+ this.targets = targets;
9
15
  }
10
16
  async listByTenant(tenantId) {
11
- return this.db.select().from(this.tbl).where(eq(this.tbl.tenantId, tenantId));
17
+ const policies = await this.db.select().from(this.policies).where(eq(this.policies.tenantId, tenantId));
18
+ const targets = await this.db.select().from(this.targets).where(eq(this.targets.tenantId, tenantId));
19
+ return { policies, targets };
12
20
  }
13
21
  async findByAccount(tenantId, accountId) {
14
- const [row] = await this.db
22
+ const [policy] = await this.db
15
23
  .select()
16
- .from(this.tbl)
17
- .where(and(eq(this.tbl.tenantId, tenantId), eq(this.tbl.accountId, accountId)))
24
+ .from(this.policies)
25
+ .where(and(eq(this.policies.tenantId, tenantId), eq(this.policies.accountId, accountId)))
18
26
  .limit(1);
19
- return row ?? null;
27
+ const targets = await this.db
28
+ .select()
29
+ .from(this.targets)
30
+ .where(and(eq(this.targets.tenantId, tenantId), eq(this.targets.accountId, accountId)));
31
+ return { policy: policy ?? null, targets };
20
32
  }
21
- async upsert(input) {
22
- const [row] = await this.db
23
- .insert(this.tbl)
24
- .values(input)
25
- .onConflictDoUpdate({
26
- target: [this.tbl.tenantId, this.tbl.accountId],
27
- set: {
28
- enabled: input.enabled,
29
- ackMinutes: input.ackMinutes,
30
- resolveMinutes: input.resolveMinutes,
31
- updatedBy: input.updatedBy,
32
- updatedAt: new Date(),
33
- },
34
- })
35
- .returning();
36
- return row;
33
+ /** Saves the switch and replaces all four priority limits atomically, so an account is never half-saved. */
34
+ async save(input) {
35
+ const { tenantId, accountId, enabled, targets, updatedBy } = input;
36
+ return this.db.transaction(async (tx) => {
37
+ const [policy] = await tx
38
+ .insert(this.policies)
39
+ .values({ tenantId, accountId, enabled, updatedBy })
40
+ .onConflictDoUpdate({
41
+ target: [this.policies.tenantId, this.policies.accountId],
42
+ set: { enabled, updatedBy, updatedAt: new Date() },
43
+ })
44
+ .returning();
45
+ await tx
46
+ .delete(this.targets)
47
+ .where(and(eq(this.targets.tenantId, tenantId), eq(this.targets.accountId, accountId)));
48
+ const rows = await tx
49
+ .insert(this.targets)
50
+ .values(INCIDENT_PRIORITIES.map((priority) => ({ tenantId, accountId, priority, ...targets[priority] })))
51
+ .returning();
52
+ return { policy, targets: rows };
53
+ });
37
54
  }
38
55
  async delete(tenantId, accountId) {
39
- await this.db
40
- .delete(this.tbl)
41
- .where(and(eq(this.tbl.tenantId, tenantId), eq(this.tbl.accountId, accountId)));
56
+ await this.db.transaction(async (tx) => {
57
+ await tx
58
+ .delete(this.targets)
59
+ .where(and(eq(this.targets.tenantId, tenantId), eq(this.targets.accountId, accountId)));
60
+ await tx
61
+ .delete(this.policies)
62
+ .where(and(eq(this.policies.tenantId, tenantId), eq(this.policies.accountId, accountId)));
63
+ });
42
64
  }
43
65
  }
44
66
  //# sourceMappingURL=sla-policy.model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla-policy.model.js","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGtC,oFAAoF;AACpF,MAAM,OAAO,cAAc;IAEf;IACA;IAFV,YACU,EAAO,EACP,GAAQ;QADR,OAAE,GAAF,EAAE,CAAK;QACP,QAAG,GAAH,GAAG,CAAK;IACf,CAAC;IAEJ,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,SAAiB;QACrD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;aACxB,MAAM,EAAE;aACR,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;aACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;aAC9E,KAAK,CAAC,CAAC,CAAC,CAAC;QACZ,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAOZ;QACC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE;aACxB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;aAChB,MAAM,CAAC,KAAK,CAAC;aACb,kBAAkB,CAAC;YAClB,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAC/C,GAAG,EAAE;gBACH,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB;SACF,CAAC;aACD,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,SAAiB;QAC9C,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;aAChB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;CACF"}
1
+ {"version":3,"file":"sla-policy.model.js","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.model.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,23 @@
1
1
  import type { ConnectorService } from "../../services/connector.service.js";
2
2
  import type { SlaPolicyModel } from "./sla-policy.model.js";
3
- import type { SlaPolicy, SlaPolicyProvider, SlaPolicyResolver } from "./domain/sla.types.js";
3
+ import type { AccountSlaConfig, SlaPolicyProvider, SlaPolicyResolver } from "./domain/sla.types.js";
4
4
  export declare class SlaError extends Error {
5
5
  readonly status: 400 | 404;
6
6
  readonly details?: unknown;
7
7
  constructor(status: 400 | 404, message: string, details?: unknown);
8
8
  }
9
- export interface AccountSlaPolicy extends SlaPolicy {
10
- accountId: string;
11
- updatedBy: string | null;
12
- updatedAt: Date | string | null;
13
- }
14
9
  export declare class SlaPolicyService implements SlaPolicyProvider {
15
10
  private model;
16
11
  private connectors;
17
12
  constructor(model: SlaPolicyModel, connectors: ConnectorService);
18
13
  /** The account must be one of this tenant's connectors; prevents writing policies for foreign accounts. */
19
14
  private assertConnector;
20
- private toAccountPolicy;
21
- list(tenantId: string): Promise<AccountSlaPolicy[]>;
22
- get(tenantId: string, accountId: string): Promise<AccountSlaPolicy>;
23
- upsert(tenantId: string, accountId: string, input: unknown, actor: string | null): Promise<AccountSlaPolicy>;
24
- /** Removes the override so the account falls back to defaults. */
25
- reset(tenantId: string, accountId: string): Promise<AccountSlaPolicy>;
26
- /** One query per request; used by incident dashboards, analytics and detail. */
15
+ list(tenantId: string): Promise<AccountSlaConfig[]>;
16
+ get(tenantId: string, accountId: string): Promise<AccountSlaConfig>;
17
+ upsert(tenantId: string, accountId: string, input: unknown, actor: string | null): Promise<AccountSlaConfig>;
18
+ /** Removes the policy and its limits so the account falls back to SLA off. */
19
+ reset(tenantId: string, accountId: string): Promise<AccountSlaConfig>;
20
+ /** One query pair per request; used by incident dashboards, analytics, list and detail. */
27
21
  loadResolver(tenantId?: string): Promise<SlaPolicyResolver>;
28
22
  }
29
23
  //# sourceMappingURL=sla-policy.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla-policy.service.d.ts","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAmB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE9G,qBAAa,QAAS,SAAQ,KAAK;IAE/B,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;IAE1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO;gBAFjB,MAAM,EAAE,GAAG,GAAG,GAAG,EAC1B,OAAO,EAAE,MAAM,EACN,OAAO,CAAC,EAAE,OAAO;CAI7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IAEtD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;gBADV,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,gBAAgB;IAGtC,2GAA2G;YAC7F,eAAe;IAK7B,OAAO,CAAC,eAAe;IAKjB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKnD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKnE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAWlH,kEAAkE;IAC5D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAM3E,gFAAgF;IAC1E,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CASlE"}
1
+ {"version":3,"file":"sla-policy.service.d.ts","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,QAAS,SAAQ,KAAK;IAE/B,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;IAE1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO;gBAFjB,MAAM,EAAE,GAAG,GAAG,GAAG,EAC1B,OAAO,EAAE,MAAM,EACN,OAAO,CAAC,EAAE,OAAO;CAI7B;AAQD,qBAAa,gBAAiB,YAAW,iBAAiB;IAEtD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;gBADV,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,gBAAgB;IAGtC,2GAA2G;YAC7F,eAAe;IAKvB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAOnD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAMnE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAWlH,8EAA8E;IACxE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAM3E,2FAA2F;IACrF,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAUlE"}