@meyicloud/meyi-insight-server 1.0.7 → 1.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.
Files changed (89) hide show
  1. package/dist/constants/incidentCategories.d.ts +38 -9
  2. package/dist/constants/incidentCategories.d.ts.map +1 -1
  3. package/dist/constants/incidentCategories.js +70 -10
  4. package/dist/constants/incidentCategories.js.map +1 -1
  5. package/dist/controllers/incident.controller.d.ts.map +1 -1
  6. package/dist/controllers/incident.controller.js +23 -3
  7. package/dist/controllers/incident.controller.js.map +1 -1
  8. package/dist/database/schema.d.ts +257 -18
  9. package/dist/database/schema.d.ts.map +1 -1
  10. package/dist/database/schema.js +36 -3
  11. package/dist/database/schema.js.map +1 -1
  12. package/dist/features/incident-priority/index.d.ts +3 -0
  13. package/dist/features/incident-priority/index.d.ts.map +1 -0
  14. package/dist/features/incident-priority/index.js +3 -0
  15. package/dist/features/incident-priority/index.js.map +1 -0
  16. package/dist/features/incident-priority/priority.rules.d.ts +15 -0
  17. package/dist/features/incident-priority/priority.rules.d.ts.map +1 -0
  18. package/dist/features/incident-priority/priority.rules.js +38 -0
  19. package/dist/features/incident-priority/priority.rules.js.map +1 -0
  20. package/dist/features/incident-priority/priority.types.d.ts +13 -0
  21. package/dist/features/incident-priority/priority.types.d.ts.map +1 -0
  22. package/dist/features/incident-priority/priority.types.js +7 -0
  23. package/dist/features/incident-priority/priority.types.js.map +1 -0
  24. package/dist/features/sla/domain/sla.defaults.d.ts +12 -0
  25. package/dist/features/sla/domain/sla.defaults.d.ts.map +1 -0
  26. package/dist/features/sla/domain/sla.defaults.js +30 -0
  27. package/dist/features/sla/domain/sla.defaults.js.map +1 -0
  28. package/dist/features/sla/domain/sla.evaluator.d.ts +22 -2
  29. package/dist/features/sla/domain/sla.evaluator.d.ts.map +1 -1
  30. package/dist/features/sla/domain/sla.evaluator.js +26 -3
  31. package/dist/features/sla/domain/sla.evaluator.js.map +1 -1
  32. package/dist/features/sla/domain/sla.resolver.d.ts +42 -10
  33. package/dist/features/sla/domain/sla.resolver.d.ts.map +1 -1
  34. package/dist/features/sla/domain/sla.resolver.js +109 -15
  35. package/dist/features/sla/domain/sla.resolver.js.map +1 -1
  36. package/dist/features/sla/domain/sla.types.d.ts +54 -8
  37. package/dist/features/sla/domain/sla.types.d.ts.map +1 -1
  38. package/dist/features/sla/domain/sla.types.js +1 -0
  39. package/dist/features/sla/domain/sla.types.js.map +1 -1
  40. package/dist/features/sla/index.d.ts +2 -1
  41. package/dist/features/sla/index.d.ts.map +1 -1
  42. package/dist/features/sla/index.js +1 -0
  43. package/dist/features/sla/index.js.map +1 -1
  44. package/dist/features/sla/sla-policy.model.d.ts +30 -10
  45. package/dist/features/sla/sla-policy.model.d.ts.map +1 -1
  46. package/dist/features/sla/sla-policy.model.js +64 -28
  47. package/dist/features/sla/sla-policy.model.js.map +1 -1
  48. package/dist/features/sla/sla-policy.service.d.ts +16 -13
  49. package/dist/features/sla/sla-policy.service.d.ts.map +1 -1
  50. package/dist/features/sla/sla-policy.service.js +65 -23
  51. package/dist/features/sla/sla-policy.service.js.map +1 -1
  52. package/dist/features/sla/sla.schema.d.ts +84 -2
  53. package/dist/features/sla/sla.schema.d.ts.map +1 -1
  54. package/dist/features/sla/sla.schema.js +25 -7
  55. package/dist/features/sla/sla.schema.js.map +1 -1
  56. package/dist/index.d.ts +3 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +2 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/migrations/run.d.ts.map +1 -1
  61. package/dist/migrations/run.js +212 -5
  62. package/dist/migrations/run.js.map +1 -1
  63. package/dist/models/incident.model.d.ts +47 -2
  64. package/dist/models/incident.model.d.ts.map +1 -1
  65. package/dist/models/incident.model.js +127 -21
  66. package/dist/models/incident.model.js.map +1 -1
  67. package/dist/server.d.ts +2 -0
  68. package/dist/server.d.ts.map +1 -1
  69. package/dist/server.js +2 -1
  70. package/dist/server.js.map +1 -1
  71. package/dist/service.d.ts +28 -3
  72. package/dist/service.d.ts.map +1 -1
  73. package/dist/service.js +14 -2
  74. package/dist/service.js.map +1 -1
  75. package/dist/services/alert.service.d.ts.map +1 -1
  76. package/dist/services/alert.service.js +2 -0
  77. package/dist/services/alert.service.js.map +1 -1
  78. package/dist/services/incident.service.d.ts +50 -2
  79. package/dist/services/incident.service.d.ts.map +1 -1
  80. package/dist/services/incident.service.js +113 -17
  81. package/dist/services/incident.service.js.map +1 -1
  82. package/dist/services/retention.service.d.ts +63 -0
  83. package/dist/services/retention.service.d.ts.map +1 -0
  84. package/dist/services/retention.service.js +264 -0
  85. package/dist/services/retention.service.js.map +1 -0
  86. package/dist/services/workflow.service.d.ts.map +1 -1
  87. package/dist/services/workflow.service.js +2 -0
  88. package/dist/services/workflow.service.js.map +1 -1
  89. package/package.json +2 -1
@@ -1,19 +1,39 @@
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 IncidentGroup } from "../../constants/incidentCategories.js";
2
+ import type { SlaOverrides, SlaPolicyRecord, SlaTargetRecord, SlaTargets } from "./domain/sla.types.js";
3
+ /**
4
+ * Persistence for an account's SLA policy: the account-level switch, the groups it applies to, and its
5
+ * per-priority limits (account default plus optional per-group overrides).
6
+ * Every query is scoped by tenant_id; there are no business rules here.
7
+ */
3
8
  export declare class SlaPolicyModel {
4
9
  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: {
10
+ private policies;
11
+ private targets;
12
+ constructor(db: any, policies: any, targets: any);
13
+ listByTenant(tenantId: string): Promise<{
14
+ policies: SlaPolicyRecord[];
15
+ targets: SlaTargetRecord[];
16
+ }>;
17
+ findByAccount(tenantId: string, accountId: string): Promise<{
18
+ policy: SlaPolicyRecord | null;
19
+ targets: SlaTargetRecord[];
20
+ }>;
21
+ /**
22
+ * Saves the switch and applies_to, and replaces every limit row (default + overrides) atomically,
23
+ * so an account is never half-saved.
24
+ */
25
+ save(input: {
10
26
  tenantId: string;
11
27
  accountId: string;
12
28
  enabled: boolean;
13
- ackMinutes: number;
14
- resolveMinutes: number;
29
+ appliesTo: IncidentGroup[];
30
+ targets: SlaTargets;
31
+ overrides: SlaOverrides;
15
32
  updatedBy: string | null;
16
- }): Promise<SlaPolicyRecord>;
33
+ }): Promise<{
34
+ policy: SlaPolicyRecord;
35
+ targets: SlaTargetRecord[];
36
+ }>;
17
37
  delete(tenantId: string, accountId: string): Promise<void>;
18
38
  }
19
39
  //# 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,EAAmB,KAAK,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExG;;;;GAIG;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;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,aAAa,EAAE,CAAC;QAC3B,OAAO,EAAE,UAAU,CAAC;QACpB,SAAS,EAAE,YAAY,CAAC;QACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAiC9D,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUjE"}
@@ -1,44 +1,80 @@
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
+ import { INCIDENT_GROUPS } from "../../constants/incidentCategories.js";
4
+ /**
5
+ * Persistence for an account's SLA policy: the account-level switch, the groups it applies to, and its
6
+ * per-priority limits (account default plus optional per-group overrides).
7
+ * Every query is scoped by tenant_id; there are no business rules here.
8
+ */
3
9
  export class SlaPolicyModel {
4
10
  db;
5
- tbl;
6
- constructor(db, tbl) {
11
+ policies;
12
+ targets;
13
+ constructor(db, policies, targets) {
7
14
  this.db = db;
8
- this.tbl = tbl;
15
+ this.policies = policies;
16
+ this.targets = targets;
9
17
  }
10
18
  async listByTenant(tenantId) {
11
- return this.db.select().from(this.tbl).where(eq(this.tbl.tenantId, tenantId));
19
+ const policies = await this.db.select().from(this.policies).where(eq(this.policies.tenantId, tenantId));
20
+ const targets = await this.db.select().from(this.targets).where(eq(this.targets.tenantId, tenantId));
21
+ return { policies, targets };
12
22
  }
13
23
  async findByAccount(tenantId, accountId) {
14
- const [row] = await this.db
24
+ const [policy] = await this.db
15
25
  .select()
16
- .from(this.tbl)
17
- .where(and(eq(this.tbl.tenantId, tenantId), eq(this.tbl.accountId, accountId)))
26
+ .from(this.policies)
27
+ .where(and(eq(this.policies.tenantId, tenantId), eq(this.policies.accountId, accountId)))
18
28
  .limit(1);
19
- return row ?? null;
29
+ const targets = await this.db
30
+ .select()
31
+ .from(this.targets)
32
+ .where(and(eq(this.targets.tenantId, tenantId), eq(this.targets.accountId, accountId)));
33
+ return { policy: policy ?? null, targets };
20
34
  }
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;
35
+ /**
36
+ * Saves the switch and applies_to, and replaces every limit row (default + overrides) atomically,
37
+ * so an account is never half-saved.
38
+ */
39
+ async save(input) {
40
+ const { tenantId, accountId, enabled, appliesTo, targets, overrides, updatedBy } = input;
41
+ const rowsFor = (incidentGroup, t) => INCIDENT_PRIORITIES.map((priority) => ({
42
+ tenantId,
43
+ accountId,
44
+ incidentGroup,
45
+ priority,
46
+ ackMinutes: t[priority].ackMinutes,
47
+ resolveMinutes: t[priority].resolveMinutes ?? null,
48
+ }));
49
+ const values = [
50
+ ...rowsFor("default", targets),
51
+ ...INCIDENT_GROUPS.flatMap((g) => (overrides[g] ? rowsFor(g, overrides[g]) : [])),
52
+ ];
53
+ return this.db.transaction(async (tx) => {
54
+ const [policy] = await tx
55
+ .insert(this.policies)
56
+ .values({ tenantId, accountId, enabled, appliesTo, updatedBy })
57
+ .onConflictDoUpdate({
58
+ target: [this.policies.tenantId, this.policies.accountId],
59
+ set: { enabled, appliesTo, updatedBy, updatedAt: new Date() },
60
+ })
61
+ .returning();
62
+ await tx
63
+ .delete(this.targets)
64
+ .where(and(eq(this.targets.tenantId, tenantId), eq(this.targets.accountId, accountId)));
65
+ const rows = await tx.insert(this.targets).values(values).returning();
66
+ return { policy, targets: rows };
67
+ });
37
68
  }
38
69
  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)));
70
+ await this.db.transaction(async (tx) => {
71
+ await tx
72
+ .delete(this.targets)
73
+ .where(and(eq(this.targets.tenantId, tenantId), eq(this.targets.accountId, accountId)));
74
+ await tx
75
+ .delete(this.policies)
76
+ .where(and(eq(this.policies.tenantId, tenantId), eq(this.policies.accountId, accountId)));
77
+ });
42
78
  }
43
79
  }
44
80
  //# 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,32 @@
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;
9
+ export interface SlaPolicyServiceOptions {
10
+ /**
11
+ * Connectors created at or after this instant are implicitly SLA-enabled (standard preset) when they
12
+ * have no saved policy. Undefined = read SLA_DEFAULT_ON_AFTER on each call; null = never.
13
+ */
14
+ defaultOnAfter?: Date | null;
13
15
  }
14
16
  export declare class SlaPolicyService implements SlaPolicyProvider {
15
17
  private model;
16
18
  private connectors;
17
- constructor(model: SlaPolicyModel, connectors: ConnectorService);
19
+ private options;
20
+ constructor(model: SlaPolicyModel, connectors: ConnectorService, options?: SlaPolicyServiceOptions);
21
+ private defaultOnAfter;
18
22
  /** The account must be one of this tenant's connectors; prevents writing policies for foreign accounts. */
19
23
  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. */
24
+ list(tenantId: string): Promise<AccountSlaConfig[]>;
25
+ get(tenantId: string, accountId: string): Promise<AccountSlaConfig>;
26
+ upsert(tenantId: string, accountId: string, input: unknown, actor: string | null): Promise<AccountSlaConfig>;
27
+ /** Removes the policy and its limits so the account falls back to its default (off, or implicit standard). */
28
+ reset(tenantId: string, accountId: string): Promise<AccountSlaConfig>;
29
+ /** One query pair per request (plus connectors when SLA_DEFAULT_ON_AFTER is set). */
27
30
  loadResolver(tenantId?: string): Promise<SlaPolicyResolver>;
28
31
  }
29
32
  //# 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;AAS5D,OAAO,KAAK,EACV,gBAAgB,EAEhB,iBAAiB,EACjB,iBAAiB,EAGlB,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;AAaD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,cAAc,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC9B;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IAEtD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;gBAFP,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,gBAAgB,EAC5B,OAAO,GAAE,uBAA4B;IAG/C,OAAO,CAAC,cAAc;IAKtB,2GAA2G;YAC7F,eAAe;IAMvB,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;IAQnE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBlH,8GAA8G;IACxG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQ3E,qFAAqF;IAC/E,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAgBlE"}
@@ -1,5 +1,6 @@
1
1
  import { SlaPolicyInputSchema } from "./sla.schema.js";
2
- import { createSlaResolver, defaultSlaPolicy, policyFromRecord } from "./domain/sla.resolver.js";
2
+ import { accountConfigFromRecords, createSlaResolver, isImplicitlyEnabled, parseDefaultOnAfter, } from "./domain/sla.resolver.js";
3
+ import { INCIDENT_GROUPS } from "../../constants/incidentCategories.js";
3
4
  export class SlaError extends Error {
4
5
  status;
5
6
  details;
@@ -9,58 +10,99 @@ export class SlaError extends Error {
9
10
  this.details = details;
10
11
  }
11
12
  }
13
+ /** "P2: Resolve limit must be..." / "security P2: ..." so the user can tell which row is wrong. */
14
+ function describeIssue(issue) {
15
+ if (issue.path[0] === "targets" && issue.path[1] !== undefined)
16
+ return `${String(issue.path[1])}: ${issue.message}`;
17
+ if (issue.path[0] === "overrides" && issue.path[1] !== undefined) {
18
+ const priority = issue.path[2] !== undefined ? ` ${String(issue.path[2])}` : "";
19
+ return `${String(issue.path[1])}${priority}: ${issue.message}`;
20
+ }
21
+ if (issue.path[0] === "appliesTo")
22
+ return `appliesTo: ${issue.message}`;
23
+ return issue.message;
24
+ }
12
25
  export class SlaPolicyService {
13
26
  model;
14
27
  connectors;
15
- constructor(model, connectors) {
28
+ options;
29
+ constructor(model, connectors, options = {}) {
16
30
  this.model = model;
17
31
  this.connectors = connectors;
32
+ this.options = options;
33
+ }
34
+ defaultOnAfter() {
35
+ if (this.options.defaultOnAfter !== undefined)
36
+ return this.options.defaultOnAfter;
37
+ return parseDefaultOnAfter(process.env.SLA_DEFAULT_ON_AFTER);
18
38
  }
19
39
  /** The account must be one of this tenant's connectors; prevents writing policies for foreign accounts. */
20
40
  async assertConnector(tenantId, accountId) {
21
41
  const connector = await this.connectors.findByAccountId(tenantId, accountId);
22
42
  if (!connector)
23
43
  throw new SlaError(404, "Connector not found");
24
- }
25
- toAccountPolicy(accountId, record) {
26
- if (!record)
27
- return { ...defaultSlaPolicy(), accountId, updatedBy: null, updatedAt: null };
28
- return { ...policyFromRecord(record), accountId, updatedBy: record.updatedBy, updatedAt: record.updatedAt };
44
+ return connector;
29
45
  }
30
46
  async list(tenantId) {
31
- const records = await this.model.listByTenant(tenantId);
32
- return records.map((r) => this.toAccountPolicy(r.accountId, r));
47
+ const { policies, targets } = await this.model.listByTenant(tenantId);
48
+ const byAccount = new Map();
49
+ for (const t of targets)
50
+ byAccount.set(t.accountId, [...(byAccount.get(t.accountId) ?? []), t]);
51
+ return policies.map((p) => accountConfigFromRecords(p.accountId, p, byAccount.get(p.accountId) ?? []));
33
52
  }
34
53
  async get(tenantId, accountId) {
35
- await this.assertConnector(tenantId, accountId);
36
- return this.toAccountPolicy(accountId, await this.model.findByAccount(tenantId, accountId));
54
+ const connector = await this.assertConnector(tenantId, accountId);
55
+ const { policy, targets } = await this.model.findByAccount(tenantId, accountId);
56
+ return accountConfigFromRecords(accountId, policy, targets, {
57
+ implicitlyEnabled: isImplicitlyEnabled(connector?.createdAt, this.defaultOnAfter()),
58
+ });
37
59
  }
38
60
  async upsert(tenantId, accountId, input, actor) {
39
61
  const parsed = SlaPolicyInputSchema.safeParse(input);
40
62
  if (!parsed.success) {
41
- throw new SlaError(400, parsed.error.issues[0]?.message ?? "Invalid SLA policy", parsed.error.issues);
63
+ const first = parsed.error.issues[0];
64
+ throw new SlaError(400, first ? describeIssue(first) : "Invalid SLA policy", parsed.error.issues);
42
65
  }
43
66
  await this.assertConnector(tenantId, accountId);
44
- const data = parsed.data;
45
- const record = await this.model.upsert({ tenantId, accountId, ...data, updatedBy: actor });
46
- return this.toAccountPolicy(accountId, record);
67
+ const { enabled, targets, appliesTo, overrides } = parsed.data;
68
+ // The schema guarantees resolveMinutes is a number or null (the casts only bridge zod's inference
69
+ // without strictNullChecks).
70
+ const saved = await this.model.save({
71
+ tenantId,
72
+ accountId,
73
+ enabled,
74
+ targets: targets,
75
+ appliesTo: appliesTo ?? [...INCIDENT_GROUPS],
76
+ overrides: (overrides ?? {}),
77
+ updatedBy: actor,
78
+ });
79
+ return accountConfigFromRecords(accountId, saved.policy, saved.targets);
47
80
  }
48
- /** Removes the override so the account falls back to defaults. */
81
+ /** Removes the policy and its limits so the account falls back to its default (off, or implicit standard). */
49
82
  async reset(tenantId, accountId) {
50
- await this.assertConnector(tenantId, accountId);
83
+ const connector = await this.assertConnector(tenantId, accountId);
51
84
  await this.model.delete(tenantId, accountId);
52
- return this.toAccountPolicy(accountId, null);
85
+ return accountConfigFromRecords(accountId, null, [], {
86
+ implicitlyEnabled: isImplicitlyEnabled(connector?.createdAt, this.defaultOnAfter()),
87
+ });
53
88
  }
54
- /** One query per request; used by incident dashboards, analytics and detail. */
89
+ /** One query pair per request (plus connectors when SLA_DEFAULT_ON_AFTER is set). */
55
90
  async loadResolver(tenantId) {
56
91
  if (!tenantId)
57
- return createSlaResolver([]);
92
+ return createSlaResolver([], []);
58
93
  try {
59
- return createSlaResolver(await this.model.listByTenant(tenantId));
94
+ const { policies, targets } = await this.model.listByTenant(tenantId);
95
+ const defaultOnAfter = this.defaultOnAfter();
96
+ let connectorCreatedAt;
97
+ if (defaultOnAfter) {
98
+ const rows = await this.connectors.list(tenantId);
99
+ connectorCreatedAt = new Map(rows.map((c) => [c.accountId, c.createdAt ?? null]));
100
+ }
101
+ return createSlaResolver(policies, targets, { defaultOnAfter, connectorCreatedAt });
60
102
  }
61
103
  catch {
62
- // Never break incident views because the policy table is unavailable; fall back to defaults.
63
- return createSlaResolver([]);
104
+ // Never break incident views because the policy tables are unavailable; fall back to defaults.
105
+ return createSlaResolver([], []);
64
106
  }
65
107
  }
66
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sla-policy.service.js","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAuB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjG,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IAEA;IAHX,YACW,MAAiB,EAC1B,OAAe,EACN,OAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,WAAM,GAAN,MAAM,CAAW;QAEjB,YAAO,GAAP,OAAO,CAAU;IAG5B,CAAC;CACF;AAQD,MAAM,OAAO,gBAAgB;IAEjB;IACA;IAFV,YACU,KAAqB,EACrB,UAA4B;QAD5B,UAAK,GAAL,KAAK,CAAgB;QACrB,eAAU,GAAV,UAAU,CAAkB;IACnC,CAAC;IAEJ,2GAA2G;IACnG,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,SAAiB;QAC/D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IACjE,CAAC;IAEO,eAAe,CAAC,SAAiB,EAAE,MAA8B;QACvE,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3F,OAAO,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,SAAiB;QAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,SAAiB,EAAE,KAAc,EAAE,KAAoB;QACpF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxG,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,IAAI,GAAmB,MAAM,CAAC,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,SAAiB;QAC7C,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,YAAY,CAAC,QAAiB;QAClC,IAAI,CAAC,QAAQ;YAAE,OAAO,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,6FAA6F;YAC7F,OAAO,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"sla-policy.service.js","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.service.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,90 @@
1
1
  import { z } from "zod";
2
+ import { type IncidentGroup } from "../../constants/incidentCategories.js";
3
+ /**
4
+ * PUT /sla/policies/:accountId. `appliesTo` and `overrides` are optional so older clients keep working:
5
+ * omitted appliesTo = every group, omitted overrides = none.
6
+ */
2
7
  export declare const SlaPolicyInputSchema: z.ZodObject<{
3
8
  enabled: z.ZodBoolean;
4
- ackMinutes: z.ZodNumber;
5
- resolveMinutes: z.ZodNumber;
9
+ targets: z.ZodObject<{
10
+ P1: z.ZodObject<{
11
+ ackMinutes: z.ZodNumber;
12
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
13
+ }, z.core.$strip>;
14
+ P2: z.ZodObject<{
15
+ ackMinutes: z.ZodNumber;
16
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
17
+ }, z.core.$strip>;
18
+ P3: z.ZodObject<{
19
+ ackMinutes: z.ZodNumber;
20
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
21
+ }, z.core.$strip>;
22
+ P4: z.ZodObject<{
23
+ ackMinutes: z.ZodNumber;
24
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
25
+ }, z.core.$strip>;
26
+ }, z.core.$strip>;
27
+ appliesTo: z.ZodOptional<z.ZodPipe<z.ZodArray<z.ZodEnum<{
28
+ operations: "operations";
29
+ security: "security";
30
+ cost: "cost";
31
+ }>>, z.ZodTransform<IncidentGroup[], ("operations" | "security" | "cost")[]>>>;
32
+ overrides: z.ZodOptional<z.ZodNullable<z.ZodObject<{
33
+ operations: z.ZodOptional<z.ZodObject<{
34
+ P1: z.ZodObject<{
35
+ ackMinutes: z.ZodNumber;
36
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
37
+ }, z.core.$strip>;
38
+ P2: z.ZodObject<{
39
+ ackMinutes: z.ZodNumber;
40
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
41
+ }, z.core.$strip>;
42
+ P3: z.ZodObject<{
43
+ ackMinutes: z.ZodNumber;
44
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
45
+ }, z.core.$strip>;
46
+ P4: z.ZodObject<{
47
+ ackMinutes: z.ZodNumber;
48
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
49
+ }, z.core.$strip>;
50
+ }, z.core.$strip>>;
51
+ security: z.ZodOptional<z.ZodObject<{
52
+ P1: z.ZodObject<{
53
+ ackMinutes: z.ZodNumber;
54
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
55
+ }, z.core.$strip>;
56
+ P2: z.ZodObject<{
57
+ ackMinutes: z.ZodNumber;
58
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
59
+ }, z.core.$strip>;
60
+ P3: z.ZodObject<{
61
+ ackMinutes: z.ZodNumber;
62
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
63
+ }, z.core.$strip>;
64
+ P4: z.ZodObject<{
65
+ ackMinutes: z.ZodNumber;
66
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
67
+ }, z.core.$strip>;
68
+ }, z.core.$strip>>;
69
+ cost: z.ZodOptional<z.ZodObject<{
70
+ P1: z.ZodObject<{
71
+ ackMinutes: z.ZodNumber;
72
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
73
+ }, z.core.$strip>;
74
+ P2: z.ZodObject<{
75
+ ackMinutes: z.ZodNumber;
76
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
77
+ }, z.core.$strip>;
78
+ P3: z.ZodObject<{
79
+ ackMinutes: z.ZodNumber;
80
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
81
+ }, z.core.$strip>;
82
+ P4: z.ZodObject<{
83
+ ackMinutes: z.ZodNumber;
84
+ resolveMinutes: z.ZodNullable<z.ZodNumber>;
85
+ }, z.core.$strip>;
86
+ }, z.core.$strip>>;
87
+ }, z.core.$strict>>>;
6
88
  }, z.core.$strip>;
7
89
  export type SlaPolicyInput = z.infer<typeof SlaPolicyInputSchema>;
8
90
  //# sourceMappingURL=sla.schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla.schema.d.ts","sourceRoot":"","sources":["../../../src/features/sla/sla.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,oBAAoB;;;;iBAS7B,CAAC;AAEL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"sla.schema.d.ts","sourceRoot":"","sources":["../../../src/features/sla/sla.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAqB5F;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAY/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -1,18 +1,36 @@
1
1
  import { z } from "zod";
2
2
  import { SLA_LIMITS } from "./domain/sla.types.js";
3
+ import { INCIDENT_GROUPS } from "../../constants/incidentCategories.js";
3
4
  const minutes = z
4
5
  .number()
5
6
  .int("Must be a whole number of minutes")
6
7
  .min(SLA_LIMITS.minMinutes, `Must be at least ${SLA_LIMITS.minMinutes} minute`)
7
8
  .max(SLA_LIMITS.maxMinutes, `Must be at most ${SLA_LIMITS.maxMinutes} minutes (30 days)`);
8
- export const SlaPolicyInputSchema = z
9
- .object({
10
- enabled: z.boolean(),
11
- ackMinutes: minutes,
12
- resolveMinutes: minutes,
13
- })
14
- .refine((v) => v.resolveMinutes >= v.ackMinutes, {
9
+ /** resolveMinutes: minutes, or null for "best effort". ackMinutes is always required. */
10
+ const target = z
11
+ .object({ ackMinutes: minutes, resolveMinutes: minutes.nullable() })
12
+ .refine((v) => v.resolveMinutes === null || v.resolveMinutes >= v.ackMinutes, {
15
13
  message: "Resolve limit must be greater than or equal to the acknowledge limit",
16
14
  path: ["resolveMinutes"],
17
15
  });
16
+ /** Every priority is required, so an enabled account always has complete limits. */
17
+ const targets = z.object({ P1: target, P2: target, P3: target, P4: target });
18
+ const groupEnum = z.enum(INCIDENT_GROUPS);
19
+ /**
20
+ * PUT /sla/policies/:accountId. `appliesTo` and `overrides` are optional so older clients keep working:
21
+ * omitted appliesTo = every group, omitted overrides = none.
22
+ */
23
+ export const SlaPolicyInputSchema = z.object({
24
+ enabled: z.boolean(),
25
+ targets,
26
+ appliesTo: z
27
+ .array(groupEnum)
28
+ .transform((groups) => INCIDENT_GROUPS.filter((g) => groups.includes(g)))
29
+ .optional(),
30
+ overrides: z
31
+ .object({ operations: targets.optional(), security: targets.optional(), cost: targets.optional() })
32
+ .strict()
33
+ .nullable()
34
+ .optional(),
35
+ });
18
36
  //# sourceMappingURL=sla.schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sla.schema.js","sourceRoot":"","sources":["../../../src/features/sla/sla.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,OAAO,GAAG,CAAC;KACd,MAAM,EAAE;KACR,GAAG,CAAC,mCAAmC,CAAC;KACxC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,oBAAoB,UAAU,CAAC,UAAU,SAAS,CAAC;KAC9E,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,mBAAmB,UAAU,CAAC,UAAU,oBAAoB,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,UAAU,EAAE,OAAO;IACnB,cAAc,EAAE,OAAO;CACxB,CAAC;KACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,UAAU,EAAE;IAC/C,OAAO,EAAE,sEAAsE;IAC/E,IAAI,EAAE,CAAC,gBAAgB,CAAC;CACzB,CAAC,CAAC"}
1
+ {"version":3,"file":"sla.schema.js","sourceRoot":"","sources":["../../../src/features/sla/sla.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAsB,MAAM,uCAAuC,CAAC;AAE5F,MAAM,OAAO,GAAG,CAAC;KACd,MAAM,EAAE;KACR,GAAG,CAAC,mCAAmC,CAAC;KACxC,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,oBAAoB,UAAU,CAAC,UAAU,SAAS,CAAC;KAC9E,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,mBAAmB,UAAU,CAAC,UAAU,oBAAoB,CAAC,CAAC;AAE5F,yFAAyF;AACzF,MAAM,MAAM,GAAG,CAAC;KACb,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;KACnE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,UAAU,EAAE;IAC5E,OAAO,EAAE,sEAAsE;IAC/E,IAAI,EAAE,CAAC,gBAAgB,CAAC;CACzB,CAAC,CAAC;AAEL,oFAAoF;AACpF,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAE7E,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,eAAiE,CAAC,CAAC;AAE5F;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,OAAO;IACP,SAAS,EAAE,CAAC;SACT,KAAK,CAAC,SAAS,CAAC;SAChB,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;SACxE,QAAQ,EAAE;IACb,SAAS,EAAE,CAAC;SACT,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SAClG,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,EAAE;CACd,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export { createInsight, type InsightConfig, type InsightServer } from "./server.js";
2
- export { InsightService, type InsightServiceConfig, type CreateIncidentInput } from "./service.js";
2
+ export { InsightService, type InsightServiceConfig, type CreateIncidentInput, type UpsertIncidentByExternalRefInput, type PurgeBeforeOptions, type PurgeBeforeResult, type PurgeSystemBeforeOptions, type PurgeSystemBeforeResult, } from "./service.js";
3
+ export { toIncidentDto, type IncidentDtoFields } from "./services/incident.service.js";
4
+ export type { IncidentSavingsDetail } from "./models/incident.model.js";
3
5
  export { createInsightRouter, type InsightRouterConfig } from "./routes/index.js";
4
6
  export { createDatabase } from "./database/index.js";
5
7
  export * from "./database/schema.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gCAAgC,EACrC,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACvF,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { createInsight } from "./server.js";
2
- export { InsightService } from "./service.js";
2
+ export { InsightService, } from "./service.js";
3
+ export { toIncidentDto } from "./services/incident.service.js";
3
4
  export { createInsightRouter } from "./routes/index.js";
4
5
  export { createDatabase } from "./database/index.js";
5
6
  export * from "./database/schema.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0C,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,cAAc,EAAuD,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAA4B,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0C,MAAM,aAAa,CAAC;AACpF,OAAO,EACL,cAAc,GAQf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAA0B,MAAM,gCAAgC,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAA4B,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/migrations/run.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA0zC1D"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/migrations/run.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA2+C1D"}