@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.
- package/dist/constants/incidentCategories.d.ts +38 -9
- package/dist/constants/incidentCategories.d.ts.map +1 -1
- package/dist/constants/incidentCategories.js +70 -10
- package/dist/constants/incidentCategories.js.map +1 -1
- package/dist/controllers/incident.controller.d.ts.map +1 -1
- package/dist/controllers/incident.controller.js +23 -3
- package/dist/controllers/incident.controller.js.map +1 -1
- package/dist/database/schema.d.ts +257 -18
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +36 -3
- package/dist/database/schema.js.map +1 -1
- package/dist/features/incident-priority/index.d.ts +3 -0
- package/dist/features/incident-priority/index.d.ts.map +1 -0
- package/dist/features/incident-priority/index.js +3 -0
- package/dist/features/incident-priority/index.js.map +1 -0
- package/dist/features/incident-priority/priority.rules.d.ts +15 -0
- package/dist/features/incident-priority/priority.rules.d.ts.map +1 -0
- package/dist/features/incident-priority/priority.rules.js +38 -0
- package/dist/features/incident-priority/priority.rules.js.map +1 -0
- package/dist/features/incident-priority/priority.types.d.ts +13 -0
- package/dist/features/incident-priority/priority.types.d.ts.map +1 -0
- package/dist/features/incident-priority/priority.types.js +7 -0
- package/dist/features/incident-priority/priority.types.js.map +1 -0
- package/dist/features/sla/domain/sla.defaults.d.ts +12 -0
- package/dist/features/sla/domain/sla.defaults.d.ts.map +1 -0
- package/dist/features/sla/domain/sla.defaults.js +30 -0
- package/dist/features/sla/domain/sla.defaults.js.map +1 -0
- package/dist/features/sla/domain/sla.evaluator.d.ts +22 -2
- package/dist/features/sla/domain/sla.evaluator.d.ts.map +1 -1
- package/dist/features/sla/domain/sla.evaluator.js +26 -3
- package/dist/features/sla/domain/sla.evaluator.js.map +1 -1
- package/dist/features/sla/domain/sla.resolver.d.ts +42 -10
- package/dist/features/sla/domain/sla.resolver.d.ts.map +1 -1
- package/dist/features/sla/domain/sla.resolver.js +109 -15
- package/dist/features/sla/domain/sla.resolver.js.map +1 -1
- package/dist/features/sla/domain/sla.types.d.ts +54 -8
- package/dist/features/sla/domain/sla.types.d.ts.map +1 -1
- package/dist/features/sla/domain/sla.types.js +1 -0
- package/dist/features/sla/domain/sla.types.js.map +1 -1
- package/dist/features/sla/index.d.ts +2 -1
- package/dist/features/sla/index.d.ts.map +1 -1
- package/dist/features/sla/index.js +1 -0
- package/dist/features/sla/index.js.map +1 -1
- package/dist/features/sla/sla-policy.model.d.ts +30 -10
- package/dist/features/sla/sla-policy.model.d.ts.map +1 -1
- package/dist/features/sla/sla-policy.model.js +64 -28
- package/dist/features/sla/sla-policy.model.js.map +1 -1
- package/dist/features/sla/sla-policy.service.d.ts +16 -13
- package/dist/features/sla/sla-policy.service.d.ts.map +1 -1
- package/dist/features/sla/sla-policy.service.js +65 -23
- package/dist/features/sla/sla-policy.service.js.map +1 -1
- package/dist/features/sla/sla.schema.d.ts +84 -2
- package/dist/features/sla/sla.schema.d.ts.map +1 -1
- package/dist/features/sla/sla.schema.js +25 -7
- package/dist/features/sla/sla.schema.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations/run.d.ts.map +1 -1
- package/dist/migrations/run.js +212 -5
- package/dist/migrations/run.js.map +1 -1
- package/dist/models/incident.model.d.ts +47 -2
- package/dist/models/incident.model.d.ts.map +1 -1
- package/dist/models/incident.model.js +127 -21
- package/dist/models/incident.model.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/service.d.ts +28 -3
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +14 -2
- package/dist/service.js.map +1 -1
- package/dist/services/alert.service.d.ts.map +1 -1
- package/dist/services/alert.service.js +2 -0
- package/dist/services/alert.service.js.map +1 -1
- package/dist/services/incident.service.d.ts +50 -2
- package/dist/services/incident.service.d.ts.map +1 -1
- package/dist/services/incident.service.js +113 -17
- package/dist/services/incident.service.js.map +1 -1
- package/dist/services/retention.service.d.ts +63 -0
- package/dist/services/retention.service.d.ts.map +1 -0
- package/dist/services/retention.service.js +264 -0
- package/dist/services/retention.service.js.map +1 -0
- package/dist/services/workflow.service.d.ts.map +1 -1
- package/dist/services/workflow.service.js +2 -0
- package/dist/services/workflow.service.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,19 +1,39 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
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
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
14
|
-
|
|
29
|
+
appliesTo: IncidentGroup[];
|
|
30
|
+
targets: SlaTargets;
|
|
31
|
+
overrides: SlaOverrides;
|
|
15
32
|
updatedBy: string | null;
|
|
16
|
-
}): Promise<
|
|
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":"
|
|
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
|
-
|
|
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
|
-
|
|
6
|
-
|
|
11
|
+
policies;
|
|
12
|
+
targets;
|
|
13
|
+
constructor(db, policies, targets) {
|
|
7
14
|
this.db = db;
|
|
8
|
-
this.
|
|
15
|
+
this.policies = policies;
|
|
16
|
+
this.targets = targets;
|
|
9
17
|
}
|
|
10
18
|
async listByTenant(tenantId) {
|
|
11
|
-
|
|
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 [
|
|
24
|
+
const [policy] = await this.db
|
|
15
25
|
.select()
|
|
16
|
-
.from(this.
|
|
17
|
-
.where(and(eq(this.
|
|
26
|
+
.from(this.policies)
|
|
27
|
+
.where(and(eq(this.policies.tenantId, tenantId), eq(this.policies.accountId, accountId)))
|
|
18
28
|
.limit(1);
|
|
19
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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;
|
|
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 {
|
|
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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
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
|
|
85
|
+
return accountConfigFromRecords(accountId, null, [], {
|
|
86
|
+
implicitlyEnabled: isImplicitlyEnabled(connector?.createdAt, this.defaultOnAfter()),
|
|
87
|
+
});
|
|
53
88
|
}
|
|
54
|
-
/** One query per request
|
|
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
|
-
|
|
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
|
|
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,
|
|
1
|
+
{"version":3,"file":"sla-policy.service.js","sourceRoot":"","sources":["../../../src/features/sla/sla-policy.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAUxE,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;AAED,mGAAmG;AACnG,SAAS,aAAa,CAAC,KAA+C;IACpE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IACpH,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW;QAAE,OAAO,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC;IACxE,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAUD,MAAM,OAAO,gBAAgB;IAEjB;IACA;IACA;IAHV,YACU,KAAqB,EACrB,UAA4B,EAC5B,UAAmC,EAAE;QAFrC,UAAK,GAAL,KAAK,CAAgB;QACrB,eAAU,GAAV,UAAU,CAAkB;QAC5B,YAAO,GAAP,OAAO,CAA8B;IAC5C,CAAC;IAEI,cAAc;QACpB,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAClF,OAAO,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC/D,CAAC;IAED,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;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChG,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,SAAiB;QAC3C,MAAM,SAAS,GAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChF,OAAO,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;YAC1D,iBAAiB,EAAE,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;SACpF,CAAC,CAAC;IACL,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,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpG,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/D,kGAAkG;QAClG,6BAA6B;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,QAAQ;YACR,SAAS;YACT,OAAO;YACP,OAAO,EAAE,OAAqB;YAC9B,SAAS,EAAE,SAAS,IAAI,CAAC,GAAG,eAAe,CAAC;YAC5C,SAAS,EAAE,CAAC,SAAS,IAAI,EAAE,CAAiB;YAC5C,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,OAAO,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,8GAA8G;IAC9G,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,SAAiB;QAC7C,MAAM,SAAS,GAAQ,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvE,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC7C,OAAO,wBAAwB,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;YACnD,iBAAiB,EAAE,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;SACpF,CAAC,CAAC;IACL,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,YAAY,CAAC,QAAiB;QAClC,IAAI,CAAC,QAAQ;YAAE,OAAO,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7C,IAAI,kBAAiE,CAAC;YACtE,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAU,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzD,kBAAkB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,+FAA+F;YAC/F,OAAO,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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
|
-
|
|
5
|
-
|
|
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;
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
ackMinutes
|
|
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;
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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"}
|