@antelopejs/dms-saas 0.3.1 → 0.3.3
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/README.md +0 -86
- package/dist/config/runtime.d.ts +0 -1
- package/dist/config/runtime.js +0 -7
- package/dist/config/runtime.js.map +1 -1
- package/dist/data-api/platformOwner/index.d.ts +0 -1
- package/dist/data-api/platformOwner/index.js +0 -1
- package/dist/data-api/platformOwner/index.js.map +1 -1
- package/dist/data-api/tenant/index.d.ts +0 -1
- package/dist/data-api/tenant/index.js +0 -1
- package/dist/data-api/tenant/index.js.map +1 -1
- package/dist/notifications/subjects.d.ts +0 -2
- package/dist/notifications/subjects.js +1 -13
- package/dist/notifications/subjects.js.map +1 -1
- package/dist/pages/platform/categories.d.ts +0 -1
- package/dist/pages/platform/categories.js +1 -8
- package/dist/pages/platform/categories.js.map +1 -1
- package/dist/pages/platform/index.d.ts +0 -1
- package/dist/pages/platform/index.js +0 -1
- package/dist/pages/platform/index.js.map +1 -1
- package/dist/pages/tenant/index.d.ts +0 -1
- package/dist/pages/tenant/index.js +0 -1
- package/dist/pages/tenant/index.js.map +1 -1
- package/dist/routes/platformOwner/index.d.ts +0 -1
- package/dist/routes/platformOwner/index.js +0 -1
- package/dist/routes/platformOwner/index.js.map +1 -1
- package/dist/routes/public/register.js +1 -3
- package/dist/routes/public/register.js.map +1 -1
- package/dist/routes/tenant/index.d.ts +0 -1
- package/dist/routes/tenant/index.js +0 -1
- package/dist/routes/tenant/index.js.map +1 -1
- package/dist/routes/tenant/tenant-billing.d.ts +2 -1
- package/dist/routes/tenant/tenant-billing.js +14 -11
- package/dist/routes/tenant/tenant-billing.js.map +1 -1
- package/dist/stripe/webhook-handlers.js +19 -20
- package/dist/stripe/webhook-handlers.js.map +1 -1
- package/dist/stripe/webhook-shared.js +9 -11
- package/dist/stripe/webhook-shared.js.map +1 -1
- package/dist/types/config.d.ts +0 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/keyed-insert.d.ts +7 -0
- package/dist/utils/keyed-insert.js +14 -0
- package/dist/utils/keyed-insert.js.map +1 -0
- package/dist/workspaces/provisioning.js +22 -27
- package/dist/workspaces/provisioning.js.map +1 -1
- package/frontend-vue/i18n/locales/saas-en-GB.json +1 -142
- package/frontend-vue/i18n/locales/saas-fr-FR.json +1 -142
- package/package.json +7 -9
- package/dist/data-api/platformOwner/support.d.ts +0 -58
- package/dist/data-api/platformOwner/support.js +0 -111
- package/dist/data-api/platformOwner/support.js.map +0 -1
- package/dist/data-api/support-fields.d.ts +0 -49
- package/dist/data-api/support-fields.js +0 -166
- package/dist/data-api/support-fields.js.map +0 -1
- package/dist/data-api/support-routes.d.ts +0 -10
- package/dist/data-api/support-routes.js +0 -71
- package/dist/data-api/support-routes.js.map +0 -1
- package/dist/data-api/tenant/support.d.ts +0 -39
- package/dist/data-api/tenant/support.js +0 -53
- package/dist/data-api/tenant/support.js.map +0 -1
- package/dist/pages/platform/support.d.ts +0 -9
- package/dist/pages/platform/support.js +0 -29
- package/dist/pages/platform/support.js.map +0 -1
- package/dist/pages/tenant/support.d.ts +0 -9
- package/dist/pages/tenant/support.js +0 -27
- package/dist/pages/tenant/support.js.map +0 -1
- package/dist/routes/platformOwner/support.d.ts +0 -21
- package/dist/routes/platformOwner/support.js +0 -180
- package/dist/routes/platformOwner/support.js.map +0 -1
- package/dist/routes/tenant/support.d.ts +0 -27
- package/dist/routes/tenant/support.js +0 -185
- package/dist/routes/tenant/support.js.map +0 -1
- package/dist/support/admissions.d.ts +0 -36
- package/dist/support/admissions.js +0 -136
- package/dist/support/admissions.js.map +0 -1
- package/dist/support/attachments.d.ts +0 -12
- package/dist/support/attachments.js +0 -56
- package/dist/support/attachments.js.map +0 -1
- package/dist/support/config.d.ts +0 -19
- package/dist/support/config.js +0 -75
- package/dist/support/config.js.map +0 -1
- package/dist/support/index.d.ts +0 -6
- package/dist/support/index.js +0 -23
- package/dist/support/index.js.map +0 -1
- package/dist/support/operations.d.ts +0 -51
- package/dist/support/operations.js +0 -109
- package/dist/support/operations.js.map +0 -1
- package/dist/support/plans.d.ts +0 -6
- package/dist/support/plans.js +0 -130
- package/dist/support/plans.js.map +0 -1
- package/dist/support/publications.d.ts +0 -8
- package/dist/support/publications.js +0 -106
- package/dist/support/publications.js.map +0 -1
- package/dist/support/recovery.d.ts +0 -7
- package/dist/support/recovery.js +0 -43
- package/dist/support/recovery.js.map +0 -1
- package/dist/support/service.d.ts +0 -51
- package/dist/support/service.js +0 -143
- package/dist/support/service.js.map +0 -1
- package/dist/support/transitions.d.ts +0 -4
- package/dist/support/transitions.js +0 -29
- package/dist/support/transitions.js.map +0 -1
- package/dist/support/uploads.d.ts +0 -39
- package/dist/support/uploads.js +0 -115
- package/dist/support/uploads.js.map +0 -1
- package/dist/support/validation.d.ts +0 -15
- package/dist/support/validation.js +0 -54
- package/dist/support/validation.js.map +0 -1
- package/frontend-vue/app/components/PlatformSupport.vue +0 -461
- package/frontend-vue/app/components/SupportAttachmentUpload.vue +0 -140
- package/frontend-vue/app/components/SupportThreadHistory.vue +0 -139
- package/frontend-vue/app/components/TenantSupport.vue +0 -415
- package/frontend-vue/app/composables/useSupportRequest.ts +0 -74
- package/frontend-vue/app/types/support.ts +0 -123
package/dist/support/plans.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createSupportPlan = createSupportPlan;
|
|
4
|
-
exports.replySupportPlan = replySupportPlan;
|
|
5
|
-
exports.updateSupportPlan = updateSupportPlan;
|
|
6
|
-
const transitions_1 = require("./transitions");
|
|
7
|
-
function ticketEvents(ticket, next, actorId, actorName) {
|
|
8
|
-
return [
|
|
9
|
-
{
|
|
10
|
-
type: "status_changed",
|
|
11
|
-
previousValue: ticket.status,
|
|
12
|
-
newValue: next.status,
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
type: "assignment_changed",
|
|
16
|
-
previousValue: ticket.assignedTo,
|
|
17
|
-
newValue: next.assignedTo,
|
|
18
|
-
},
|
|
19
|
-
]
|
|
20
|
-
.filter((change) => change.previousValue !== change.newValue)
|
|
21
|
-
.map((change) => ({
|
|
22
|
-
...change,
|
|
23
|
-
_id: `${next.mutationId}:${change.type}`,
|
|
24
|
-
ticketId: ticket._id,
|
|
25
|
-
actorId,
|
|
26
|
-
actorName,
|
|
27
|
-
createdAt: next.updatedAt,
|
|
28
|
-
}));
|
|
29
|
-
}
|
|
30
|
-
function nextTicket(ticket, operationId, update) {
|
|
31
|
-
return {
|
|
32
|
-
_id: ticket._id,
|
|
33
|
-
subject: ticket.subject,
|
|
34
|
-
category: ticket.category,
|
|
35
|
-
priority: ticket.priority,
|
|
36
|
-
createdBy: ticket.createdBy,
|
|
37
|
-
createdAt: ticket.createdAt,
|
|
38
|
-
status: update.status,
|
|
39
|
-
assignedTo: update.assignedTo,
|
|
40
|
-
lastMessageAt: update.lastMessageAt ?? ticket.lastMessageAt,
|
|
41
|
-
updatedAt: update.updatedAt,
|
|
42
|
-
revision: ticket.revision + 1,
|
|
43
|
-
mutationId: operationId,
|
|
44
|
-
publicationId: operationId,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
function createSupportPlan(options, id) {
|
|
48
|
-
const now = new Date();
|
|
49
|
-
const ticket = {
|
|
50
|
-
_id: id,
|
|
51
|
-
subject: options.input.subject,
|
|
52
|
-
category: options.input.category,
|
|
53
|
-
priority: options.input.priority,
|
|
54
|
-
status: "open",
|
|
55
|
-
assignedTo: null,
|
|
56
|
-
createdBy: options.authorId,
|
|
57
|
-
createdAt: now,
|
|
58
|
-
updatedAt: now,
|
|
59
|
-
lastMessageAt: now,
|
|
60
|
-
revision: 0,
|
|
61
|
-
mutationId: id,
|
|
62
|
-
publicationId: id,
|
|
63
|
-
};
|
|
64
|
-
const message = {
|
|
65
|
-
_id: `${id}:message`,
|
|
66
|
-
ticketId: id,
|
|
67
|
-
authorId: options.authorId,
|
|
68
|
-
authorType: "tenant",
|
|
69
|
-
body: options.input.body,
|
|
70
|
-
attachments: [],
|
|
71
|
-
createdAt: now,
|
|
72
|
-
};
|
|
73
|
-
return {
|
|
74
|
-
expectedMutationId: null,
|
|
75
|
-
ticket,
|
|
76
|
-
message,
|
|
77
|
-
events: [],
|
|
78
|
-
stagedKeys: options.input.attachments,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
function replySupportPlan(options, ticket, id) {
|
|
82
|
-
const now = new Date();
|
|
83
|
-
const status = options.authorType === "tenant"
|
|
84
|
-
? (0, transitions_1.statusAfterTenantMessage)(ticket.status)
|
|
85
|
-
: (0, transitions_1.statusAfterPlatformReply)(ticket.status);
|
|
86
|
-
const next = nextTicket(ticket, id, {
|
|
87
|
-
status,
|
|
88
|
-
assignedTo: ticket.assignedTo,
|
|
89
|
-
updatedAt: now,
|
|
90
|
-
lastMessageAt: now,
|
|
91
|
-
});
|
|
92
|
-
const message = {
|
|
93
|
-
_id: `${id}:message`,
|
|
94
|
-
ticketId: ticket._id,
|
|
95
|
-
authorId: options.authorId,
|
|
96
|
-
authorType: options.authorType,
|
|
97
|
-
body: options.input.body,
|
|
98
|
-
attachments: [],
|
|
99
|
-
createdAt: now,
|
|
100
|
-
};
|
|
101
|
-
return {
|
|
102
|
-
expectedMutationId: ticket.mutationId,
|
|
103
|
-
ticket: next,
|
|
104
|
-
message,
|
|
105
|
-
events: ticketEvents(ticket, next, options.authorId, options.authorName || options.authorId),
|
|
106
|
-
stagedKeys: options.input.attachments,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
function updateSupportPlan(options, ticket, id) {
|
|
110
|
-
const status = options.input.status ?? ticket.status;
|
|
111
|
-
(0, transitions_1.assertSupportStatusTransition)(ticket.status, status);
|
|
112
|
-
const assignedTo = options.input.assignedTo === undefined
|
|
113
|
-
? ticket.assignedTo
|
|
114
|
-
: options.input.assignedTo;
|
|
115
|
-
const next = nextTicket(ticket, id, {
|
|
116
|
-
status,
|
|
117
|
-
assignedTo,
|
|
118
|
-
updatedAt: new Date(),
|
|
119
|
-
});
|
|
120
|
-
const events = ticketEvents(ticket, next, options.actorId, options.actorName);
|
|
121
|
-
return {
|
|
122
|
-
expectedMutationId: ticket.mutationId,
|
|
123
|
-
unchanged: events.length === 0,
|
|
124
|
-
ticket: events.length ? next : ticket,
|
|
125
|
-
message: null,
|
|
126
|
-
events,
|
|
127
|
-
stagedKeys: [],
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=plans.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/support/plans.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type SupportTicket, type SupportTicketModel } from "../db";
|
|
2
|
-
import { type SupportOperation } from "./operations";
|
|
3
|
-
import type { SupportModels } from "./service";
|
|
4
|
-
export declare function reconcileSupportTicket(tickets: SupportTicketModel, ticketId: string): Promise<SupportTicket>;
|
|
5
|
-
export declare function reconcileSupportPublication(models: SupportModels, ticket: SupportTicket): Promise<void>;
|
|
6
|
-
export declare function readSupportTicket(models: SupportModels, ticketId: string): Promise<SupportTicket>;
|
|
7
|
-
export declare function publishSupportOperation(models: SupportModels, operation: SupportOperation): Promise<SupportOperation>;
|
|
8
|
-
export declare function committedSupportPublication(operation: SupportOperation): import("./operations").SupportPublication;
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.reconcileSupportTicket = reconcileSupportTicket;
|
|
4
|
-
exports.reconcileSupportPublication = reconcileSupportPublication;
|
|
5
|
-
exports.readSupportTicket = readSupportTicket;
|
|
6
|
-
exports.publishSupportOperation = publishSupportOperation;
|
|
7
|
-
exports.committedSupportPublication = committedSupportPublication;
|
|
8
|
-
const node_util_1 = require("node:util");
|
|
9
|
-
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
10
|
-
const db_1 = require("../db");
|
|
11
|
-
const operations_1 = require("./operations");
|
|
12
|
-
const HTTP_NOT_FOUND = 404;
|
|
13
|
-
const HTTP_CONFLICT = 409;
|
|
14
|
-
const HTTP_UNAVAILABLE = 503;
|
|
15
|
-
const MAX_PUBLICATIONS_PER_READ = 8;
|
|
16
|
-
async function reconcileSupportTicket(tickets, ticketId) {
|
|
17
|
-
const ticket = await tickets.get(ticketId);
|
|
18
|
-
(0, interface_api_util_1.assert)(ticket, HTTP_NOT_FOUND, "saas.errors.support.ticket_not_found");
|
|
19
|
-
if (!ticket.publicationId)
|
|
20
|
-
return ticket;
|
|
21
|
-
return readSupportTicket({
|
|
22
|
-
tickets,
|
|
23
|
-
messages: new db_1.SupportMessageModel(tickets.database),
|
|
24
|
-
events: new db_1.SupportTicketEventModel(tickets.database),
|
|
25
|
-
}, ticketId);
|
|
26
|
-
}
|
|
27
|
-
async function insertProjection(model, row) {
|
|
28
|
-
try {
|
|
29
|
-
await model.insert([row]);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
}
|
|
33
|
-
const stored = await model.get(row._id);
|
|
34
|
-
(0, interface_api_util_1.assert)(stored &&
|
|
35
|
-
Object.entries(row).every(([key, value]) => (0, node_util_1.isDeepStrictEqual)(stored[key], value)), HTTP_UNAVAILABLE, "saas.errors.support.projection_pending");
|
|
36
|
-
}
|
|
37
|
-
async function reconcileSupportPublication(models, ticket) {
|
|
38
|
-
if (!ticket.publicationId)
|
|
39
|
-
return;
|
|
40
|
-
const operations = new operations_1.SupportOperationModel(models.tickets.database);
|
|
41
|
-
const operation = await operations.get(ticket.publicationId);
|
|
42
|
-
(0, interface_api_util_1.assert)(operation && operation.status !== "rejected", HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
43
|
-
const publication = (0, operations_1.supportPublication)(operation);
|
|
44
|
-
(0, interface_api_util_1.assert)(publication.ticket._id === ticket._id, HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
45
|
-
if (publication.message)
|
|
46
|
-
await insertProjection(models.messages, publication.message);
|
|
47
|
-
for (const event of publication.events)
|
|
48
|
-
await insertProjection(models.events, event);
|
|
49
|
-
await operations.finish(operation, "committed");
|
|
50
|
-
await models.tickets.settlePublication(ticket._id, operation._id);
|
|
51
|
-
}
|
|
52
|
-
async function readSupportTicket(models, ticketId) {
|
|
53
|
-
for (let attempt = 0; attempt < MAX_PUBLICATIONS_PER_READ; attempt += 1) {
|
|
54
|
-
const ticket = await models.tickets.get(ticketId);
|
|
55
|
-
(0, interface_api_util_1.assert)(ticket, HTTP_NOT_FOUND, "saas.errors.support.ticket_not_found");
|
|
56
|
-
if (!ticket.publicationId)
|
|
57
|
-
return ticket;
|
|
58
|
-
await reconcileSupportPublication(models, ticket);
|
|
59
|
-
}
|
|
60
|
-
throw new Error("Support publication did not settle within the read budget");
|
|
61
|
-
}
|
|
62
|
-
async function publishTicket(models, operation) {
|
|
63
|
-
const publication = (0, operations_1.supportPublication)(operation);
|
|
64
|
-
if (publication.expectedMutationId !== null) {
|
|
65
|
-
await models.tickets.publish(publication.ticket, publication.expectedMutationId);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
try {
|
|
69
|
-
await models.tickets.insert([publication.ticket]);
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
async function publishSupportOperation(models, operation) {
|
|
75
|
-
const operations = new operations_1.SupportOperationModel(models.tickets.database);
|
|
76
|
-
const current = await operations.get(operation._id);
|
|
77
|
-
(0, interface_api_util_1.assert)(current, HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
78
|
-
if (current.status !== "ready")
|
|
79
|
-
return current;
|
|
80
|
-
operation = current;
|
|
81
|
-
if ((0, operations_1.supportPublication)(operation).unchanged) {
|
|
82
|
-
return operations.finish(operation, "committed");
|
|
83
|
-
}
|
|
84
|
-
await publishTicket(models, operation);
|
|
85
|
-
const publication = (0, operations_1.supportPublication)(operation);
|
|
86
|
-
const ticket = await models.tickets.get(publication.ticket._id);
|
|
87
|
-
if (ticket?.publicationId === operation._id) {
|
|
88
|
-
await reconcileSupportPublication(models, ticket);
|
|
89
|
-
}
|
|
90
|
-
const stored = await operations.get(operation._id);
|
|
91
|
-
(0, interface_api_util_1.assert)(stored, HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
92
|
-
if (stored.status !== "ready")
|
|
93
|
-
return stored;
|
|
94
|
-
if (ticket &&
|
|
95
|
-
ticket.mutationId !== publication.expectedMutationId &&
|
|
96
|
-
ticket.mutationId !== operation._id) {
|
|
97
|
-
return operations.finish(stored, "rejected");
|
|
98
|
-
}
|
|
99
|
-
(0, interface_api_util_1.assert)(false, HTTP_UNAVAILABLE, "saas.errors.support.operation_unknown");
|
|
100
|
-
}
|
|
101
|
-
function committedSupportPublication(operation) {
|
|
102
|
-
(0, interface_api_util_1.assert)(operation.status !== "rejected", operation.failure?.status ?? HTTP_CONFLICT, operation.failure?.code ?? "saas.errors.support.tenant_busy");
|
|
103
|
-
(0, interface_api_util_1.assert)(operation.status === "committed", HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
104
|
-
return (0, operations_1.supportPublication)(operation);
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=publications.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"publications.js","sourceRoot":"","sources":["../../src/support/publications.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type SupportModels } from "./service";
|
|
2
|
-
export interface SupportRecoveryPage {
|
|
3
|
-
nextCursor: string | null;
|
|
4
|
-
processed: string[];
|
|
5
|
-
pending: string[];
|
|
6
|
-
}
|
|
7
|
-
export declare function recoverSupportOperations(tenantId: string, models: SupportModels, after?: string): Promise<SupportRecoveryPage>;
|
package/dist/support/recovery.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.recoverSupportOperations = recoverSupportOperations;
|
|
4
|
-
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
5
|
-
const operations_1 = require("./operations");
|
|
6
|
-
const publications_1 = require("./publications");
|
|
7
|
-
const service_1 = require("./service");
|
|
8
|
-
const RECOVERY_PAGE_SIZE = 20;
|
|
9
|
-
const HTTP_BAD_REQUEST = 400;
|
|
10
|
-
const HTTP_UNAVAILABLE = 503;
|
|
11
|
-
const RECEIPT_ID = /^[a-f0-9]{64}$/;
|
|
12
|
-
async function recoverOperation(tenantId, models, operation) {
|
|
13
|
-
const result = await (0, service_1.resumeSupportOperation)(tenantId, models, operation);
|
|
14
|
-
(0, interface_api_util_1.assert)(result.status === "committed" || result.status === "rejected", HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
15
|
-
const ticket = await models.tickets.get((0, operations_1.supportPublication)(operation).ticket._id);
|
|
16
|
-
if (ticket?.publicationId === operation._id)
|
|
17
|
-
await (0, publications_1.reconcileSupportPublication)(models, ticket);
|
|
18
|
-
}
|
|
19
|
-
async function recoverSupportOperations(tenantId, models, after = "") {
|
|
20
|
-
(0, interface_api_util_1.assert)(after === "" || RECEIPT_ID.test(after), HTTP_BAD_REQUEST, "saas.errors.support.invalid_cursor");
|
|
21
|
-
const operations = new operations_1.SupportOperationModel(models.tickets.database);
|
|
22
|
-
const rows = await operations.table
|
|
23
|
-
.filter((row) => row.key("_id").gt(after))
|
|
24
|
-
.orderBy("_id", "asc")
|
|
25
|
-
.slice(0, RECOVERY_PAGE_SIZE)
|
|
26
|
-
.run();
|
|
27
|
-
const page = {
|
|
28
|
-
nextCursor: rows.length === RECOVERY_PAGE_SIZE ? rows.at(-1)._id : null,
|
|
29
|
-
processed: [],
|
|
30
|
-
pending: [],
|
|
31
|
-
};
|
|
32
|
-
for (const row of rows) {
|
|
33
|
-
try {
|
|
34
|
-
await recoverOperation(tenantId, models, row);
|
|
35
|
-
page.processed.push(row._id);
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
page.pending.push(row._id);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return page;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=recovery.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/support/recovery.ts"],"names":[],"mappings":";;AAuCA,4DA8BC;AArED,uEAAwD;AACxD,6CAIsB;AACtB,iDAA6D;AAC7D,uCAAuE;AAEvE,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAQpC,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,MAAqB,EACrB,SAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAsB,EAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACzE,IAAA,2BAAM,EACJ,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAC7D,gBAAgB,EAChB,uCAAuC,CACxC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CACrC,IAAA,+BAAkB,EAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,CACzC,CAAC;IACF,IAAI,MAAM,EAAE,aAAa,KAAK,SAAS,CAAC,GAAG;QACzC,MAAM,IAAA,0CAA2B,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAGM,KAAK,UAAU,wBAAwB,CAC5C,QAAgB,EAChB,MAAqB,EACrB,KAAK,GAAG,EAAE;IAEV,IAAA,2BAAM,EACJ,KAAK,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EACtC,gBAAgB,EAChB,oCAAoC,CACrC,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,kCAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK;SAChC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;SACzC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC5B,GAAG,EAAE,CAAC;IACT,MAAM,IAAI,GAAwB;QAChC,UAAU,EAAE,IAAI,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;QACxE,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { Tenant } from "@antelopejs/interface-dms/db";
|
|
2
|
-
import type { SupportMessage, SupportMessageAuthorType, SupportMessageModel, SupportTicket, SupportTicketEventModel, SupportTicketModel, SupportTicketStatus } from "../db";
|
|
3
|
-
import { type SupportOperation } from "./operations";
|
|
4
|
-
import { type SupportMessageInput, type SupportTicketInput } from "./validation";
|
|
5
|
-
export interface SupportModels {
|
|
6
|
-
tickets: SupportTicketModel;
|
|
7
|
-
messages: SupportMessageModel;
|
|
8
|
-
events: SupportTicketEventModel;
|
|
9
|
-
}
|
|
10
|
-
export interface CreateSupportTicketOptions {
|
|
11
|
-
tenant: Tenant;
|
|
12
|
-
authorId: string;
|
|
13
|
-
requestId: string;
|
|
14
|
-
input: SupportTicketInput;
|
|
15
|
-
models: SupportModels;
|
|
16
|
-
validateNewRequest?: () => Promise<void>;
|
|
17
|
-
}
|
|
18
|
-
export interface AddSupportMessageOptions {
|
|
19
|
-
tenantId: string;
|
|
20
|
-
ticketId: string;
|
|
21
|
-
authorId: string;
|
|
22
|
-
authorName?: string;
|
|
23
|
-
authorType: SupportMessageAuthorType;
|
|
24
|
-
requestId: string;
|
|
25
|
-
input: SupportMessageInput;
|
|
26
|
-
models: SupportModels;
|
|
27
|
-
}
|
|
28
|
-
export interface SupportTicketUpdate {
|
|
29
|
-
status: SupportTicketStatus;
|
|
30
|
-
assignedTo: string | null;
|
|
31
|
-
updatedAt: Date;
|
|
32
|
-
lastMessageAt?: Date;
|
|
33
|
-
}
|
|
34
|
-
export interface SupportTicketPatch {
|
|
35
|
-
status?: SupportTicketStatus;
|
|
36
|
-
assignedTo?: string | null;
|
|
37
|
-
}
|
|
38
|
-
export interface UpdateSupportTicketOptions {
|
|
39
|
-
tenantId: string;
|
|
40
|
-
ticketId: string;
|
|
41
|
-
requestId: string;
|
|
42
|
-
input: SupportTicketPatch;
|
|
43
|
-
actorId: string;
|
|
44
|
-
actorName: string;
|
|
45
|
-
models: SupportModels;
|
|
46
|
-
validateNewRequest?: () => Promise<void>;
|
|
47
|
-
}
|
|
48
|
-
export declare function resumeSupportOperation(tenantId: string, models: SupportModels, operation: SupportOperation): Promise<SupportOperation>;
|
|
49
|
-
export declare function createSupportTicket(options: CreateSupportTicketOptions): Promise<SupportTicket>;
|
|
50
|
-
export declare function addSupportMessage(options: AddSupportMessageOptions): Promise<SupportMessage>;
|
|
51
|
-
export declare function updateSupportTicket(options: UpdateSupportTicketOptions): Promise<SupportTicket>;
|
package/dist/support/service.js
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resumeSupportOperation = resumeSupportOperation;
|
|
4
|
-
exports.createSupportTicket = createSupportTicket;
|
|
5
|
-
exports.addSupportMessage = addSupportMessage;
|
|
6
|
-
exports.updateSupportTicket = updateSupportTicket;
|
|
7
|
-
const interface_api_1 = require("@antelopejs/interface-api");
|
|
8
|
-
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
9
|
-
const interface_file_storage_1 = require("@antelopejs/interface-file-storage");
|
|
10
|
-
const admissions_1 = require("./admissions");
|
|
11
|
-
const operations_1 = require("./operations");
|
|
12
|
-
const plans_1 = require("./plans");
|
|
13
|
-
const publications_1 = require("./publications");
|
|
14
|
-
const validation_1 = require("./validation");
|
|
15
|
-
const HTTP_CONFLICT = 409;
|
|
16
|
-
const HTTP_BAD_REQUEST = 400;
|
|
17
|
-
const HTTP_UNAVAILABLE = 503;
|
|
18
|
-
async function prepareOperation(request) {
|
|
19
|
-
(0, validation_1.assertSupportRequestId)(request.requestId);
|
|
20
|
-
const id = (0, operations_1.supportOperationId)(request.tenantId, request.actorId, request.requestId);
|
|
21
|
-
const fingerprint = (0, operations_1.supportRequestFingerprint)([request.kind, request.intent]);
|
|
22
|
-
const operations = new operations_1.SupportOperationModel(request.models.tickets.database);
|
|
23
|
-
const existing = await operations.get(id);
|
|
24
|
-
if (existing) {
|
|
25
|
-
(0, interface_api_util_1.assert)(existing.fingerprint === fingerprint, HTTP_CONFLICT, "saas.errors.support.request_reused");
|
|
26
|
-
return existing;
|
|
27
|
-
}
|
|
28
|
-
const publication = await request.plan(id);
|
|
29
|
-
if (publication.message)
|
|
30
|
-
publication.message.attachments =
|
|
31
|
-
publication.stagedKeys.map(interface_file_storage_1.stripStagingPrefix);
|
|
32
|
-
return operations.prepare({
|
|
33
|
-
_id: id,
|
|
34
|
-
revision: `${id}:prepared`,
|
|
35
|
-
status: "prepared",
|
|
36
|
-
kind: request.kind,
|
|
37
|
-
fingerprint,
|
|
38
|
-
payload: JSON.stringify(publication),
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
function isTerminalPreparationError(error) {
|
|
42
|
-
if (error instanceof interface_api_1.HTTPResult)
|
|
43
|
-
return (error.getStatus() === HTTP_BAD_REQUEST ||
|
|
44
|
-
error.getStatus() === HTTP_CONFLICT);
|
|
45
|
-
return (error instanceof interface_file_storage_1.FileNotFoundError || error instanceof interface_file_storage_1.FileConflictError);
|
|
46
|
-
}
|
|
47
|
-
async function recoverPreparationFailure(operations, operation, error) {
|
|
48
|
-
if (isTerminalPreparationError(error)) {
|
|
49
|
-
const failure = error instanceof interface_api_1.HTTPResult && typeof error.getBody() === "string"
|
|
50
|
-
? { status: error.getStatus(), code: String(error.getBody()) }
|
|
51
|
-
: {
|
|
52
|
-
status: HTTP_CONFLICT,
|
|
53
|
-
code: "saas.errors.support.invalid_attachments",
|
|
54
|
-
};
|
|
55
|
-
await operations
|
|
56
|
-
.finish(operation, "rejected", failure)
|
|
57
|
-
.catch(() => undefined);
|
|
58
|
-
}
|
|
59
|
-
const current = await operations.get(operation._id);
|
|
60
|
-
if (current?.status === "rejected")
|
|
61
|
-
await (0, admissions_1.cancelSupportAttachments)(current);
|
|
62
|
-
if (!current || current.status === "prepared")
|
|
63
|
-
throw error;
|
|
64
|
-
return current;
|
|
65
|
-
}
|
|
66
|
-
async function readyOperation(tenantId, models, operation) {
|
|
67
|
-
const operations = new operations_1.SupportOperationModel(models.tickets.database);
|
|
68
|
-
if (operation.status !== "prepared")
|
|
69
|
-
return operation;
|
|
70
|
-
try {
|
|
71
|
-
await (0, admissions_1.prepareSupportAttachments)(operations, operation, tenantId);
|
|
72
|
-
await operations.finish(operation, "ready");
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
return recoverPreparationFailure(operations, operation, error);
|
|
76
|
-
}
|
|
77
|
-
const current = await operations.get(operation._id);
|
|
78
|
-
(0, interface_api_util_1.assert)(current, HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
79
|
-
return current;
|
|
80
|
-
}
|
|
81
|
-
async function runSupportOperation(request) {
|
|
82
|
-
const prepared = await prepareOperation(request);
|
|
83
|
-
const result = await resumeSupportOperation(request.tenantId, request.models, prepared);
|
|
84
|
-
return (0, publications_1.committedSupportPublication)(result);
|
|
85
|
-
}
|
|
86
|
-
async function resumeSupportOperation(tenantId, models, operation) {
|
|
87
|
-
const ready = await readyOperation(tenantId, models, operation);
|
|
88
|
-
const result = await (0, publications_1.publishSupportOperation)(models, ready);
|
|
89
|
-
if (result.status === "rejected")
|
|
90
|
-
await (0, admissions_1.cancelSupportAttachments)(result);
|
|
91
|
-
return result;
|
|
92
|
-
}
|
|
93
|
-
function ticketResult(publication) {
|
|
94
|
-
if (publication.unchanged)
|
|
95
|
-
return publication.ticket;
|
|
96
|
-
publication.ticket.publicationId = null;
|
|
97
|
-
publication.ticket.mutationId = `${publication.ticket.mutationId}:settled`;
|
|
98
|
-
return publication.ticket;
|
|
99
|
-
}
|
|
100
|
-
async function createSupportTicket(options) {
|
|
101
|
-
const publication = await runSupportOperation({
|
|
102
|
-
tenantId: options.tenant._id,
|
|
103
|
-
actorId: options.authorId,
|
|
104
|
-
requestId: options.requestId,
|
|
105
|
-
kind: "create",
|
|
106
|
-
intent: options.input,
|
|
107
|
-
models: options.models,
|
|
108
|
-
plan: async (id) => {
|
|
109
|
-
await options.validateNewRequest?.();
|
|
110
|
-
return (0, plans_1.createSupportPlan)(options, id);
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
return ticketResult(publication);
|
|
114
|
-
}
|
|
115
|
-
async function addSupportMessage(options) {
|
|
116
|
-
const publication = await runSupportOperation({
|
|
117
|
-
tenantId: options.tenantId,
|
|
118
|
-
actorId: options.authorId,
|
|
119
|
-
requestId: options.requestId,
|
|
120
|
-
kind: "reply",
|
|
121
|
-
intent: [options.ticketId, options.authorType, options.input],
|
|
122
|
-
models: options.models,
|
|
123
|
-
plan: async (id) => (0, plans_1.replySupportPlan)(options, await (0, publications_1.readSupportTicket)(options.models, options.ticketId), id),
|
|
124
|
-
});
|
|
125
|
-
(0, interface_api_util_1.assert)(publication.message, HTTP_UNAVAILABLE, "saas.errors.support.operation_pending");
|
|
126
|
-
return publication.message;
|
|
127
|
-
}
|
|
128
|
-
async function updateSupportTicket(options) {
|
|
129
|
-
const publication = await runSupportOperation({
|
|
130
|
-
tenantId: options.tenantId,
|
|
131
|
-
actorId: options.actorId,
|
|
132
|
-
requestId: options.requestId,
|
|
133
|
-
kind: "update",
|
|
134
|
-
intent: [options.ticketId, options.input],
|
|
135
|
-
models: options.models,
|
|
136
|
-
plan: async (id) => {
|
|
137
|
-
await options.validateNewRequest?.();
|
|
138
|
-
return (0, plans_1.updateSupportPlan)(options, await (0, publications_1.readSupportTicket)(options.models, options.ticketId), id);
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
return ticketResult(publication);
|
|
142
|
-
}
|
|
143
|
-
//# sourceMappingURL=service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/support/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { SupportTicketStatus } from "../db";
|
|
2
|
-
export declare function assertSupportStatusTransition(current: SupportTicketStatus, next: SupportTicketStatus): void;
|
|
3
|
-
export declare function statusAfterTenantMessage(current: SupportTicketStatus): SupportTicketStatus;
|
|
4
|
-
export declare function statusAfterPlatformReply(current: SupportTicketStatus): SupportTicketStatus;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.assertSupportStatusTransition = assertSupportStatusTransition;
|
|
4
|
-
exports.statusAfterTenantMessage = statusAfterTenantMessage;
|
|
5
|
-
exports.statusAfterPlatformReply = statusAfterPlatformReply;
|
|
6
|
-
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
7
|
-
const HTTP_BAD_REQUEST = 400;
|
|
8
|
-
const STATUS_TRANSITIONS = {
|
|
9
|
-
open: ["in_progress", "resolved", "closed"],
|
|
10
|
-
in_progress: ["waiting_customer", "resolved", "closed"],
|
|
11
|
-
waiting_customer: ["in_progress", "resolved", "closed"],
|
|
12
|
-
resolved: ["open", "closed"],
|
|
13
|
-
closed: ["open"],
|
|
14
|
-
};
|
|
15
|
-
function assertSupportStatusTransition(current, next) {
|
|
16
|
-
if (current === next)
|
|
17
|
-
return;
|
|
18
|
-
(0, interface_api_util_1.assert)(STATUS_TRANSITIONS[current].includes(next), HTTP_BAD_REQUEST, "saas.errors.support.invalid_status_transition");
|
|
19
|
-
}
|
|
20
|
-
function statusAfterTenantMessage(current) {
|
|
21
|
-
if (current === "waiting_customer")
|
|
22
|
-
return "in_progress";
|
|
23
|
-
return current === "resolved" || current === "closed" ? "open" : current;
|
|
24
|
-
}
|
|
25
|
-
function statusAfterPlatformReply(current) {
|
|
26
|
-
(0, interface_api_util_1.assert)(current !== "closed", HTTP_BAD_REQUEST, "saas.errors.support.closed_ticket_reply");
|
|
27
|
-
return "waiting_customer";
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=transitions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../src/support/transitions.ts"],"names":[],"mappings":";;AAaA,sEAUC;AAED,4DAKC;AAED,4DASC;AAzCD,uEAAwD;AAGxD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,MAAM,kBAAkB,GAAuD;IAC7E,IAAI,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC3C,WAAW,EAAE,CAAC,kBAAkB,EAAE,UAAU,EAAE,QAAQ,CAAC;IACvD,gBAAgB,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;IACvD,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC5B,MAAM,EAAE,CAAC,MAAM,CAAC;CACjB,CAAC;AAEF,SAAgB,6BAA6B,CAC3C,OAA4B,EAC5B,IAAyB;IAEzB,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO;IAC7B,IAAA,2BAAM,EACJ,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC1C,gBAAgB,EAChB,+CAA+C,CAChD,CAAC;AACJ,CAAC;AAED,SAAgB,wBAAwB,CACtC,OAA4B;IAE5B,IAAI,OAAO,KAAK,kBAAkB;QAAE,OAAO,aAAa,CAAC;IACzD,OAAO,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3E,CAAC;AAED,SAAgB,wBAAwB,CACtC,OAA4B;IAE5B,IAAA,2BAAM,EACJ,OAAO,KAAK,QAAQ,EACpB,gBAAgB,EAChB,yCAAyC,CAC1C,CAAC;IACF,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Table } from "@antelopejs/interface-database-decorators";
|
|
2
|
-
import { type PresignedUploadResponse } from "@antelopejs/interface-file-storage";
|
|
3
|
-
export interface SupportUploadInput {
|
|
4
|
-
filename: string;
|
|
5
|
-
size: number;
|
|
6
|
-
mimetype: string;
|
|
7
|
-
}
|
|
8
|
-
export declare class SupportUpload extends Table {
|
|
9
|
-
_id: string;
|
|
10
|
-
stagedKey: string;
|
|
11
|
-
storage: string;
|
|
12
|
-
tenantId: string;
|
|
13
|
-
}
|
|
14
|
-
declare const SupportUploadModel_base: {
|
|
15
|
-
new (database: import("@antelopejs/interface-database").SchemaInstance<any>): {
|
|
16
|
-
readonly table: import("@antelopejs/interface-database").Table<SupportUpload>;
|
|
17
|
-
readonly database: import("@antelopejs/interface-database").SchemaInstance<any>;
|
|
18
|
-
get(id: string): PromiseLike<SupportUpload | undefined>;
|
|
19
|
-
getBy(index: keyof SupportUpload, ...keys: any[]): PromiseLike<SupportUpload[]>;
|
|
20
|
-
getAll(): PromiseLike<SupportUpload[]>;
|
|
21
|
-
insert(obj: import("@antelopejs/interface-database-decorators").DeepPartial<SupportUpload> | import("@antelopejs/interface-database-decorators").DeepPartial<SupportUpload>[], options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<string[]>;
|
|
22
|
-
update(id: string, obj: import("@antelopejs/interface-database-decorators").DeepPartial<SupportUpload>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
23
|
-
update(obj: import("@antelopejs/interface-database-decorators").DeepPartial<SupportUpload>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
24
|
-
delete(id: string): Promise<number>;
|
|
25
|
-
};
|
|
26
|
-
readonly schemaName: string;
|
|
27
|
-
fromPlainData(obj: any): SupportUpload;
|
|
28
|
-
fromDatabase(obj: any): SupportUpload | undefined;
|
|
29
|
-
toDatabase(obj: any): Record<string, any>;
|
|
30
|
-
validate(obj: unknown, options?: import("@antelopejs/interface-database-decorators").ValidateInputOptions): import("@antelopejs/interface-database-decorators").ValidationResult;
|
|
31
|
-
};
|
|
32
|
-
export declare class SupportUploadModel extends SupportUploadModel_base {
|
|
33
|
-
record(candidate: SupportUpload): Promise<void>;
|
|
34
|
-
}
|
|
35
|
-
export declare function supportUploadId(storage: string, stagedKey: string): string;
|
|
36
|
-
export declare function parseSupportUpload(body: unknown): SupportUploadInput;
|
|
37
|
-
export declare function createSupportUpload(tenantId: string, input: SupportUploadInput): Promise<PresignedUploadResponse>;
|
|
38
|
-
export declare function getSupportUpload(tenantId: string, stagedKey: string): Promise<SupportUpload>;
|
|
39
|
-
export {};
|