@josephomills/esign 0.4.0 → 0.5.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/{ports-DtICqgEf.d.cts → ports-DM0-2hQd.d.cts} +65 -3
- package/dist/{ports-DtICqgEf.d.ts → ports-DM0-2hQd.d.ts} +65 -3
- package/dist/prisma/index.cjs +9 -2
- package/dist/prisma/index.cjs.map +1 -1
- package/dist/prisma/index.d.cts +1 -1
- package/dist/prisma/index.d.ts +1 -1
- package/dist/prisma/index.js +9 -2
- package/dist/prisma/index.js.map +1 -1
- package/dist/server/index.cjs +37 -29
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +8 -7
- package/dist/server/index.d.ts +8 -7
- package/dist/server/index.js +36 -30
- package/dist/server/index.js.map +1 -1
- package/dist/ui/index.cjs +305 -71
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.d.cts +12 -9
- package/dist/ui/index.d.ts +12 -9
- package/dist/ui/index.js +306 -72
- package/dist/ui/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -47,6 +47,68 @@ declare const placementSchema: z.ZodObject<{
|
|
|
47
47
|
w: number;
|
|
48
48
|
h: number;
|
|
49
49
|
}>;
|
|
50
|
+
/**
|
|
51
|
+
* A named signature field — a placement with an id + label. A document version
|
|
52
|
+
* carries one or more; the signer signs once and the signature is stamped at
|
|
53
|
+
* every field. Labels organize the fields in the designer ("Signature", "Initials
|
|
54
|
+
* page 2", …); the signer always sees "Sign here".
|
|
55
|
+
*/
|
|
56
|
+
interface SignatureField extends Placement {
|
|
57
|
+
id: string;
|
|
58
|
+
label: string;
|
|
59
|
+
}
|
|
60
|
+
declare const signatureFieldSchema: z.ZodObject<{
|
|
61
|
+
page: z.ZodNumber;
|
|
62
|
+
x: z.ZodNumber;
|
|
63
|
+
y: z.ZodNumber;
|
|
64
|
+
w: z.ZodNumber;
|
|
65
|
+
h: z.ZodNumber;
|
|
66
|
+
} & {
|
|
67
|
+
id: z.ZodString;
|
|
68
|
+
label: z.ZodString;
|
|
69
|
+
}, "strict", z.ZodTypeAny, {
|
|
70
|
+
page: number;
|
|
71
|
+
x: number;
|
|
72
|
+
y: number;
|
|
73
|
+
w: number;
|
|
74
|
+
h: number;
|
|
75
|
+
id: string;
|
|
76
|
+
label: string;
|
|
77
|
+
}, {
|
|
78
|
+
page: number;
|
|
79
|
+
x: number;
|
|
80
|
+
y: number;
|
|
81
|
+
w: number;
|
|
82
|
+
h: number;
|
|
83
|
+
id: string;
|
|
84
|
+
label: string;
|
|
85
|
+
}>;
|
|
86
|
+
declare const placementsSchema: z.ZodArray<z.ZodObject<{
|
|
87
|
+
page: z.ZodNumber;
|
|
88
|
+
x: z.ZodNumber;
|
|
89
|
+
y: z.ZodNumber;
|
|
90
|
+
w: z.ZodNumber;
|
|
91
|
+
h: z.ZodNumber;
|
|
92
|
+
} & {
|
|
93
|
+
id: z.ZodString;
|
|
94
|
+
label: z.ZodString;
|
|
95
|
+
}, "strict", z.ZodTypeAny, {
|
|
96
|
+
page: number;
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
w: number;
|
|
100
|
+
h: number;
|
|
101
|
+
id: string;
|
|
102
|
+
label: string;
|
|
103
|
+
}, {
|
|
104
|
+
page: number;
|
|
105
|
+
x: number;
|
|
106
|
+
y: number;
|
|
107
|
+
w: number;
|
|
108
|
+
h: number;
|
|
109
|
+
id: string;
|
|
110
|
+
label: string;
|
|
111
|
+
}>, "many">;
|
|
50
112
|
/** A resolved recipient — the only thing the fan-out needs. subjectId = the host's profileId. */
|
|
51
113
|
interface Recipient {
|
|
52
114
|
name: string;
|
|
@@ -124,7 +186,7 @@ interface SigningDocumentVersionDTO {
|
|
|
124
186
|
version: number;
|
|
125
187
|
sourceObjectKey: string;
|
|
126
188
|
sourceSha256: string;
|
|
127
|
-
|
|
189
|
+
placements: SignatureField[];
|
|
128
190
|
changeNote: string | null;
|
|
129
191
|
createdById: string | null;
|
|
130
192
|
createdAt: string;
|
|
@@ -448,7 +510,7 @@ interface PersistencePort {
|
|
|
448
510
|
version: number;
|
|
449
511
|
sourceObjectKey: string;
|
|
450
512
|
sourceSha256: string;
|
|
451
|
-
|
|
513
|
+
placements: SignatureField[];
|
|
452
514
|
changeNote: string | null;
|
|
453
515
|
createdById: string | null;
|
|
454
516
|
}): Promise<SigningDocumentVersionDTO>;
|
|
@@ -550,4 +612,4 @@ interface EsignConfig<S> {
|
|
|
550
612
|
defaultExpiryDays?: number;
|
|
551
613
|
}
|
|
552
614
|
|
|
553
|
-
export {
|
|
615
|
+
export { placementsSchema as $, ACTIVE_STATUSES as A, type SigningCampaignDTO as B, type Clock as C, type DocumentStatsRow as D, type EsignChannel as E, type StatusCountMap as F, type GroupBreakdown as G, type HooksPort as H, type SubjectFilter as I, type SubjectFilterField as J, type SubjectSigningState as K, type SubjectSummary as L, type SubmitSignatureInput as M, type NotifierPort as N, type OutstandingRequest as O, type PersistencePort as P, assertTransition as Q, type ResendPolicy as R, type SubjectSelection as S, TERMINAL_STATUSES as T, canTransition as U, type VersionPolicy as V, declineSchema as W, esignChannelSchema as X, isActive as Y, isTerminal as Z, placementSchema as _, type SubjectsPort as a, signatureFieldSchema as a0, subjectSelectionSchema as a1, submitSignatureSchema as a2, type SkippedSubject as b, type SignatureField as c, type StoragePort as d, type SigningDocumentVersionDTO as e, type SigningDocumentDTO as f, type SigningRequestDTO as g, type EsignConfig as h, type SubjectSigningStatus as i, type CoverageReport as j, type CampaignStatsRow as k, type StatsRange as l, type ScopeStatsRow as m, type SubjectTypeDescriptor as n, type Placement as o, type AuthPort as p, type DeclineInput as q, ESIGN_CHANNELS as r, ESIGN_STATUSES as s, type EsignStatus as t, type NewAuditEventRow as u, type NewRequestRow as v, type NotifierAttachment as w, type Recipient as x, type RequestSummary as y, type SigningAuditEventDTO as z };
|
|
@@ -47,6 +47,68 @@ declare const placementSchema: z.ZodObject<{
|
|
|
47
47
|
w: number;
|
|
48
48
|
h: number;
|
|
49
49
|
}>;
|
|
50
|
+
/**
|
|
51
|
+
* A named signature field — a placement with an id + label. A document version
|
|
52
|
+
* carries one or more; the signer signs once and the signature is stamped at
|
|
53
|
+
* every field. Labels organize the fields in the designer ("Signature", "Initials
|
|
54
|
+
* page 2", …); the signer always sees "Sign here".
|
|
55
|
+
*/
|
|
56
|
+
interface SignatureField extends Placement {
|
|
57
|
+
id: string;
|
|
58
|
+
label: string;
|
|
59
|
+
}
|
|
60
|
+
declare const signatureFieldSchema: z.ZodObject<{
|
|
61
|
+
page: z.ZodNumber;
|
|
62
|
+
x: z.ZodNumber;
|
|
63
|
+
y: z.ZodNumber;
|
|
64
|
+
w: z.ZodNumber;
|
|
65
|
+
h: z.ZodNumber;
|
|
66
|
+
} & {
|
|
67
|
+
id: z.ZodString;
|
|
68
|
+
label: z.ZodString;
|
|
69
|
+
}, "strict", z.ZodTypeAny, {
|
|
70
|
+
page: number;
|
|
71
|
+
x: number;
|
|
72
|
+
y: number;
|
|
73
|
+
w: number;
|
|
74
|
+
h: number;
|
|
75
|
+
id: string;
|
|
76
|
+
label: string;
|
|
77
|
+
}, {
|
|
78
|
+
page: number;
|
|
79
|
+
x: number;
|
|
80
|
+
y: number;
|
|
81
|
+
w: number;
|
|
82
|
+
h: number;
|
|
83
|
+
id: string;
|
|
84
|
+
label: string;
|
|
85
|
+
}>;
|
|
86
|
+
declare const placementsSchema: z.ZodArray<z.ZodObject<{
|
|
87
|
+
page: z.ZodNumber;
|
|
88
|
+
x: z.ZodNumber;
|
|
89
|
+
y: z.ZodNumber;
|
|
90
|
+
w: z.ZodNumber;
|
|
91
|
+
h: z.ZodNumber;
|
|
92
|
+
} & {
|
|
93
|
+
id: z.ZodString;
|
|
94
|
+
label: z.ZodString;
|
|
95
|
+
}, "strict", z.ZodTypeAny, {
|
|
96
|
+
page: number;
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
w: number;
|
|
100
|
+
h: number;
|
|
101
|
+
id: string;
|
|
102
|
+
label: string;
|
|
103
|
+
}, {
|
|
104
|
+
page: number;
|
|
105
|
+
x: number;
|
|
106
|
+
y: number;
|
|
107
|
+
w: number;
|
|
108
|
+
h: number;
|
|
109
|
+
id: string;
|
|
110
|
+
label: string;
|
|
111
|
+
}>, "many">;
|
|
50
112
|
/** A resolved recipient — the only thing the fan-out needs. subjectId = the host's profileId. */
|
|
51
113
|
interface Recipient {
|
|
52
114
|
name: string;
|
|
@@ -124,7 +186,7 @@ interface SigningDocumentVersionDTO {
|
|
|
124
186
|
version: number;
|
|
125
187
|
sourceObjectKey: string;
|
|
126
188
|
sourceSha256: string;
|
|
127
|
-
|
|
189
|
+
placements: SignatureField[];
|
|
128
190
|
changeNote: string | null;
|
|
129
191
|
createdById: string | null;
|
|
130
192
|
createdAt: string;
|
|
@@ -448,7 +510,7 @@ interface PersistencePort {
|
|
|
448
510
|
version: number;
|
|
449
511
|
sourceObjectKey: string;
|
|
450
512
|
sourceSha256: string;
|
|
451
|
-
|
|
513
|
+
placements: SignatureField[];
|
|
452
514
|
changeNote: string | null;
|
|
453
515
|
createdById: string | null;
|
|
454
516
|
}): Promise<SigningDocumentVersionDTO>;
|
|
@@ -550,4 +612,4 @@ interface EsignConfig<S> {
|
|
|
550
612
|
defaultExpiryDays?: number;
|
|
551
613
|
}
|
|
552
614
|
|
|
553
|
-
export {
|
|
615
|
+
export { placementsSchema as $, ACTIVE_STATUSES as A, type SigningCampaignDTO as B, type Clock as C, type DocumentStatsRow as D, type EsignChannel as E, type StatusCountMap as F, type GroupBreakdown as G, type HooksPort as H, type SubjectFilter as I, type SubjectFilterField as J, type SubjectSigningState as K, type SubjectSummary as L, type SubmitSignatureInput as M, type NotifierPort as N, type OutstandingRequest as O, type PersistencePort as P, assertTransition as Q, type ResendPolicy as R, type SubjectSelection as S, TERMINAL_STATUSES as T, canTransition as U, type VersionPolicy as V, declineSchema as W, esignChannelSchema as X, isActive as Y, isTerminal as Z, placementSchema as _, type SubjectsPort as a, signatureFieldSchema as a0, subjectSelectionSchema as a1, submitSignatureSchema as a2, type SkippedSubject as b, type SignatureField as c, type StoragePort as d, type SigningDocumentVersionDTO as e, type SigningDocumentDTO as f, type SigningRequestDTO as g, type EsignConfig as h, type SubjectSigningStatus as i, type CoverageReport as j, type CampaignStatsRow as k, type StatsRange as l, type ScopeStatsRow as m, type SubjectTypeDescriptor as n, type Placement as o, type AuthPort as p, type DeclineInput as q, ESIGN_CHANNELS as r, ESIGN_STATUSES as s, type EsignStatus as t, type NewAuditEventRow as u, type NewRequestRow as v, type NotifierAttachment as w, type Recipient as x, type RequestSummary as y, type SigningAuditEventDTO as z };
|
package/dist/prisma/index.cjs
CHANGED
|
@@ -39,13 +39,20 @@ var mapDoc = (r) => ({
|
|
|
39
39
|
createdAt: iso(r.createdAt),
|
|
40
40
|
updatedAt: iso(r.updatedAt)
|
|
41
41
|
});
|
|
42
|
+
function toFields(raw) {
|
|
43
|
+
if (Array.isArray(raw)) return raw;
|
|
44
|
+
if (raw && typeof raw === "object") {
|
|
45
|
+
return [{ ...raw, id: "field-1", label: "Signature" }];
|
|
46
|
+
}
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
42
49
|
var mapVer = (r) => ({
|
|
43
50
|
id: r.id,
|
|
44
51
|
documentId: r.documentId,
|
|
45
52
|
version: r.version,
|
|
46
53
|
sourceObjectKey: r.sourceObjectKey,
|
|
47
54
|
sourceSha256: r.sourceSha256,
|
|
48
|
-
|
|
55
|
+
placements: toFields(r.placement),
|
|
49
56
|
changeNote: r.changeNote,
|
|
50
57
|
createdById: r.createdById,
|
|
51
58
|
createdAt: iso(r.createdAt)
|
|
@@ -185,7 +192,7 @@ function createPrismaPersistence(prisma) {
|
|
|
185
192
|
version: input.version,
|
|
186
193
|
sourceObjectKey: input.sourceObjectKey,
|
|
187
194
|
sourceSha256: input.sourceSha256,
|
|
188
|
-
placement: input.
|
|
195
|
+
placement: input.placements,
|
|
189
196
|
changeNote: input.changeNote,
|
|
190
197
|
createdById: input.createdById
|
|
191
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/flow.ts","../../src/server/uid.ts","../../src/adapters/prisma/adapter.ts"],"names":["randomBytes"],"mappings":"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","file":"index.cjs","sourcesContent":["import { EsignError } from \"./errors\";\n\n/**\n * Lifecycle of a single signing request. PENDING/VIEWED are the only active\n * states; SIGNED/DECLINED/EXPIRED/REVOKED are terminal. The submit handler is\n * idempotent, so a no-op transition to the same state is always allowed.\n */\nexport type EsignStatus =\n | \"PENDING\"\n | \"VIEWED\"\n | \"SIGNED\"\n | \"DECLINED\"\n | \"EXPIRED\"\n | \"REVOKED\";\n\nexport const ESIGN_STATUSES: readonly EsignStatus[] = [\n \"PENDING\",\n \"VIEWED\",\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\n/** Active (still-actionable) states — eligible for view/sign/decline. */\nexport const ACTIVE_STATUSES: readonly EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\n/** Terminal states — no further transitions. */\nexport const TERMINAL_STATUSES: readonly EsignStatus[] = [\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\nconst TRANSITIONS: Record<EsignStatus, readonly EsignStatus[]> = {\n PENDING: [\"VIEWED\", \"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n VIEWED: [\"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n SIGNED: [],\n DECLINED: [],\n EXPIRED: [],\n REVOKED: [],\n};\n\nexport function isActive(status: EsignStatus): boolean {\n return ACTIVE_STATUSES.includes(status);\n}\n\nexport function isTerminal(status: EsignStatus): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n/** Whether `from → to` is a legal move (a same-state no-op counts as legal). */\nexport function canTransition(from: EsignStatus, to: EsignStatus): boolean {\n if (from === to) return true;\n return TRANSITIONS[from].includes(to);\n}\n\n/** Throw `EsignError('CONFLICT')` on an illegal transition. */\nexport function assertTransition(from: EsignStatus, to: EsignStatus): void {\n if (!canTransition(from, to)) {\n throw new EsignError(\n \"CONFLICT\",\n `Illegal signing-request transition: ${from} → ${to}.`,\n );\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\n// 62-char URL-safe alphabet. 16 chars ≈ 95 bits of entropy — ample for row ids.\nconst ALPHABET =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\n/**\n * A 16-char unique id, matching the host `@db.VarChar(16)` convention. The\n * package generates ids in code (the Prisma fragment carries no `@default`), so\n * every esign-owned row gets a uid the same way across dhm-estates / flc-missions\n * / flc-hr. Rejection sampling keeps the distribution uniform (no modulo bias).\n */\nexport function uid(size = 16): string {\n let out = \"\";\n while (out.length < size) {\n for (const byte of randomBytes(size)) {\n if (byte < 248) {\n // 248 = floor(256 / 62) * 62 — discard the biased tail.\n out += ALPHABET[byte % 62];\n if (out.length === size) break;\n }\n }\n }\n return out;\n}\n","import type { EsignStatus } from \"../../server/flow\";\nimport type { NewRequestRow, PersistencePort, RequestSummary } from \"../../server/ports\";\nimport { ESIGN_STATUSES } from \"../../server/flow\";\nimport { uid } from \"../../server/uid\";\nimport type {\n CampaignStatsRow,\n DocumentStatsRow,\n EsignChannel,\n GroupBreakdown,\n OutstandingRequest,\n Placement,\n ScopeStatsRow,\n SigningAuditEventDTO,\n SigningCampaignDTO,\n SigningDocumentDTO,\n SigningDocumentVersionDTO,\n SigningRequestDTO,\n StatsRange,\n StatusCountMap,\n SubjectSelection,\n SubjectSigningStatus,\n} from \"../../server/types\";\n\n// Structural Prisma client — accepts any client exposing the five esign\n// delegates. Keeps `@prisma/client` out of the package's dependency graph\n// (mirrors @firstlovecenter/milestone-grid). The host passes its own `prisma`.\ninterface Delegate {\n create(args: { data: unknown }): Promise<unknown>;\n createMany(args: { data: unknown[] }): Promise<unknown>;\n findUnique(args: { where: unknown; select?: unknown }): Promise<unknown>;\n findFirst(args: {\n where?: unknown;\n orderBy?: unknown;\n select?: unknown;\n }): Promise<unknown>;\n findMany(args: {\n where?: unknown;\n orderBy?: unknown;\n take?: number;\n select?: unknown;\n }): Promise<unknown[]>;\n update(args: { where: unknown; data: unknown }): Promise<unknown>;\n count(args: { where?: unknown }): Promise<number>;\n groupBy(args: { by: string[]; where?: unknown; _count?: unknown }): Promise<unknown[]>;\n}\n\nexport interface PrismaLike {\n signingDocument: Delegate;\n signingDocumentVersion: Delegate;\n signingCampaign: Delegate;\n signingRequest: Delegate;\n signingAuditEvent: Delegate;\n}\n\nconst iso = (d: Date): string => d.toISOString();\nconst isoN = (d: Date | null): string | null => (d ? d.toISOString() : null);\n\ninterface DocRow {\n id: string;\n scopeId: string | null;\n documentType: string | null;\n title: string;\n audience: unknown;\n currentVersionId: string | null;\n createdById: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\nconst mapDoc = (r: DocRow): SigningDocumentDTO => ({\n id: r.id,\n scopeId: r.scopeId,\n documentType: r.documentType,\n title: r.title,\n audience: (r.audience as SubjectSelection | null) ?? null,\n currentVersionId: r.currentVersionId,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n updatedAt: iso(r.updatedAt),\n});\n\ninterface VerRow {\n id: string;\n documentId: string;\n version: number;\n sourceObjectKey: string;\n sourceSha256: string;\n placement: unknown;\n changeNote: string | null;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapVer = (r: VerRow): SigningDocumentVersionDTO => ({\n id: r.id,\n documentId: r.documentId,\n version: r.version,\n sourceObjectKey: r.sourceObjectKey,\n sourceSha256: r.sourceSha256,\n placement: r.placement as Placement,\n changeNote: r.changeNote,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface CampRow {\n id: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n note: string | null;\n emailReceipt: boolean;\n targeting: unknown;\n expiresAt: Date;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapCamp = (r: CampRow): SigningCampaignDTO => ({\n id: r.id,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n note: r.note,\n emailReceipt: r.emailReceipt,\n targeting: r.targeting as SubjectSelection,\n expiresAt: iso(r.expiresAt),\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface ReqRow {\n id: string;\n campaignId: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n subjectType: string;\n subjectId: string;\n subjectGroup: string | null;\n recipientName: string;\n recipientEmail: string | null;\n recipientWhatsapp: string | null;\n channels: unknown;\n status: EsignStatus;\n viewedAt: Date | null;\n signedAt: Date | null;\n declinedAt: Date | null;\n expiresAt: Date;\n revokedAt: Date | null;\n sealedObjectKey: string | null;\n sealedSha256: string | null;\n createdAt: Date;\n}\nconst mapReq = (r: ReqRow): SigningRequestDTO => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status,\n viewedAt: isoN(r.viewedAt),\n signedAt: isoN(r.signedAt),\n declinedAt: isoN(r.declinedAt),\n expiresAt: iso(r.expiresAt),\n revokedAt: isoN(r.revokedAt),\n sealedObjectKey: r.sealedObjectKey,\n sealedSha256: r.sealedSha256,\n createdAt: iso(r.createdAt),\n});\n\nconst emptyCounts = (): StatusCountMap =>\n Object.fromEntries(ESIGN_STATUSES.map((s) => [s, 0])) as StatusCountMap;\n\ninterface GroupRow {\n status: EsignStatus;\n _count: { _all: number };\n}\nconst totalOf = (c: StatusCountMap): number =>\n ESIGN_STATUSES.reduce((sum, s) => sum + c[s], 0);\nconst completion = (c: StatusCountMap): number => {\n const total = totalOf(c);\n return total === 0 ? 0 : c.SIGNED / total;\n};\n\n/** Fold groupBy([key,status]) rows into per-key status-count breakdowns. */\nfunction foldBreakdown<K extends string>(\n rows: ({ status: EsignStatus; _count: { _all: number } } & Record<K, string | null>)[],\n key: K,\n): { value: string | null; counts: StatusCountMap; total: number }[] {\n const map = new Map<string | null, StatusCountMap>();\n for (const row of rows) {\n const k = row[key];\n let counts = map.get(k);\n if (!counts) {\n counts = emptyCounts();\n map.set(k, counts);\n }\n counts[row.status] += row._count._all;\n }\n return [...map.entries()].map(([value, counts]) => ({\n value,\n counts,\n total: totalOf(counts),\n }));\n}\n\nconst ACTIVE: EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\nexport function createPrismaPersistence(prisma: PrismaLike): PersistencePort {\n async function statusCounts(where: unknown): Promise<StatusCountMap> {\n const rows = (await prisma.signingRequest.groupBy({\n by: [\"status\"],\n where,\n _count: { _all: true },\n })) as GroupRow[];\n const counts = emptyCounts();\n for (const r of rows) counts[r.status] = r._count._all;\n return counts;\n }\n\n async function outstandingFor(\n where: Record<string, unknown>,\n now: Date,\n limit: number,\n ): Promise<OutstandingRequest[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { ...where, status: { in: ACTIVE }, expiresAt: { gt: now } },\n orderBy: { createdAt: \"asc\" },\n take: limit,\n })) as ReqRow[];\n return rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n recipientName: r.recipientName,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status as \"PENDING\" | \"VIEWED\",\n viewedAt: isoN(r.viewedAt),\n createdAt: iso(r.createdAt),\n expiresAt: iso(r.expiresAt),\n }));\n }\n\n return {\n // Documents\n async createDocument(input) {\n const row = (await prisma.signingDocument.create({\n data: {\n id: uid(),\n scopeId: input.scopeId,\n documentType: input.documentType,\n title: input.title,\n audience: input.audience ?? undefined,\n createdById: input.createdById,\n },\n })) as DocRow;\n return mapDoc(row);\n },\n async getDocument(id) {\n const row = (await prisma.signingDocument.findFirst({\n where: { id, deletedAt: null },\n })) as DocRow | null;\n return row ? mapDoc(row) : null;\n },\n async updateDocument(id, patch) {\n const data: Record<string, unknown> = {};\n if (patch.title !== undefined) data.title = patch.title;\n if (patch.currentVersionId !== undefined) data.currentVersionId = patch.currentVersionId;\n if (patch.audience !== undefined && patch.audience !== null) data.audience = patch.audience;\n const row = (await prisma.signingDocument.update({ where: { id }, data })) as DocRow;\n return mapDoc(row);\n },\n async listDocuments(opts) {\n const rows = (await prisma.signingDocument.findMany({\n where: { deletedAt: null, scopeId: opts.scopeId ?? undefined, documentType: opts.documentType ?? undefined },\n orderBy: { createdAt: \"desc\" },\n })) as DocRow[];\n return rows.map(mapDoc);\n },\n\n // Versions\n async createVersion(input) {\n const row = (await prisma.signingDocumentVersion.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n version: input.version,\n sourceObjectKey: input.sourceObjectKey,\n sourceSha256: input.sourceSha256,\n placement: input.placement,\n changeNote: input.changeNote,\n createdById: input.createdById,\n },\n })) as VerRow;\n return mapVer(row);\n },\n async getVersion(id) {\n const row = (await prisma.signingDocumentVersion.findUnique({ where: { id } })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n async listVersions(documentId) {\n const rows = (await prisma.signingDocumentVersion.findMany({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow[];\n return rows.map(mapVer);\n },\n async latestVersion(documentId) {\n const row = (await prisma.signingDocumentVersion.findFirst({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n\n // Campaigns\n async createCampaign(input) {\n const row = (await prisma.signingCampaign.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n documentVersionId: input.documentVersionId,\n scopeId: input.scopeId,\n note: input.note,\n emailReceipt: input.emailReceipt,\n targeting: input.targeting,\n expiresAt: input.expiresAt,\n createdById: input.createdById,\n },\n })) as CampRow;\n return mapCamp(row);\n },\n async getCampaign(id) {\n const row = (await prisma.signingCampaign.findFirst({ where: { id, deletedAt: null } })) as CampRow | null;\n return row ? mapCamp(row) : null;\n },\n async listCampaigns(documentId) {\n const rows = (await prisma.signingCampaign.findMany({\n where: { documentId, deletedAt: null },\n orderBy: { createdAt: \"desc\" },\n })) as CampRow[];\n return rows.map(mapCamp);\n },\n\n // Requests\n async createRequests(rows: NewRequestRow[]) {\n if (rows.length === 0) return;\n await prisma.signingRequest.createMany({\n data: rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: r.channels,\n tokenHash: r.tokenHash,\n expiresAt: r.expiresAt,\n })),\n });\n },\n async getRequest(id) {\n const row = (await prisma.signingRequest.findUnique({ where: { id } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async findRequestByTokenHash(tokenHash) {\n const row = (await prisma.signingRequest.findUnique({ where: { tokenHash } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async updateRequest(id, patch) {\n const row = (await prisma.signingRequest.update({ where: { id }, data: patch })) as ReqRow;\n return mapReq(row);\n },\n async listRequests(opts) {\n const rows = (await prisma.signingRequest.findMany({\n where: {\n campaignId: opts.campaignId,\n documentId: opts.documentId,\n subjectType: opts.subjectType,\n subjectId: opts.subjectId,\n },\n orderBy: { createdAt: \"desc\" },\n })) as ReqRow[];\n return rows.map(mapReq);\n },\n async requestSummaryBySubject(documentId): Promise<RequestSummary[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { documentId },\n orderBy: { createdAt: \"desc\" },\n select: {\n subjectId: true,\n status: true,\n signedAt: true,\n version: { select: { version: true } },\n },\n })) as {\n subjectId: string;\n status: EsignStatus;\n signedAt: Date | null;\n version: { version: number };\n }[];\n const seen = new Map<string, RequestSummary>();\n for (const r of rows) {\n if (seen.has(r.subjectId)) continue; // first = latest (desc order)\n seen.set(r.subjectId, {\n subjectId: r.subjectId,\n status: r.status,\n version: r.version.version,\n signedAt: isoN(r.signedAt),\n });\n }\n return [...seen.values()];\n },\n\n // Audit chain\n async appendAuditEvent(row) {\n const created = (await prisma.signingAuditEvent.create({\n data: {\n id: uid(),\n requestId: row.requestId,\n seq: row.seq,\n type: row.type,\n payload: row.payload,\n prevHash: row.prevHash,\n hash: row.hash,\n },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n };\n return {\n id: created.id,\n requestId: created.requestId,\n seq: created.seq,\n type: created.type,\n payload: created.payload,\n prevHash: created.prevHash,\n hash: created.hash,\n occurredAt: iso(created.occurredAt),\n } satisfies SigningAuditEventDTO;\n },\n async listAuditEvents(requestId) {\n const rows = (await prisma.signingAuditEvent.findMany({\n where: { requestId },\n orderBy: { seq: \"asc\" },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n }[];\n return rows.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n seq: r.seq,\n type: r.type,\n payload: r.payload,\n prevHash: r.prevHash,\n hash: r.hash,\n occurredAt: iso(r.occurredAt),\n }));\n },\n async lastAuditHash(requestId) {\n const row = (await prisma.signingAuditEvent.findFirst({\n where: { requestId },\n orderBy: { seq: \"desc\" },\n select: { seq: true, hash: true },\n })) as { seq: number; hash: string } | null;\n return row ?? null;\n },\n\n // Green-check + stats\n async subjectSigningStatus(args): Promise<SubjectSigningStatus> {\n const where: Record<string, unknown> = {\n subjectType: args.subjectType,\n subjectId: args.subjectId,\n };\n if (args.documentId) where.documentId = args.documentId;\n else if (args.documentType) where.document = { documentType: args.documentType };\n\n const latest = (await prisma.signingRequest.findFirst({\n where,\n orderBy: { createdAt: \"desc\" },\n select: {\n id: true,\n status: true,\n signedAt: true,\n sealedObjectKey: true,\n documentId: true,\n version: { select: { version: true } },\n },\n })) as {\n id: string;\n status: EsignStatus;\n signedAt: Date | null;\n sealedObjectKey: string | null;\n documentId: string;\n version: { version: number };\n } | null;\n\n if (!latest) {\n return { state: \"NONE\", signedAt: null, signedVersion: null, requestId: null, sealedObjectKey: null };\n }\n\n const base = {\n signedAt: isoN(latest.signedAt),\n signedVersion: latest.version.version,\n requestId: latest.id,\n sealedObjectKey: latest.sealedObjectKey,\n };\n\n if (latest.status !== \"SIGNED\") {\n const state =\n latest.status === \"PENDING\" || latest.status === \"VIEWED\" || latest.status === \"DECLINED\"\n ? latest.status\n : \"NONE\";\n return { state, ...base, signedAt: null };\n }\n\n if (args.versionPolicy === \"any\") return { state: \"SIGNED\", ...base };\n\n // \"current\": needs re-sign if signed an older version than the doc's current.\n const doc = (await prisma.signingDocument.findFirst({\n where: { id: latest.documentId },\n select: { currentVersionId: true },\n })) as { currentVersionId: string | null } | null;\n let currentNumber = latest.version.version;\n if (doc?.currentVersionId) {\n const cur = (await prisma.signingDocumentVersion.findUnique({\n where: { id: doc.currentVersionId },\n select: { version: true },\n })) as { version: number } | null;\n if (cur) currentNumber = cur.version;\n }\n return {\n state: latest.version.version >= currentNumber ? \"SIGNED\" : \"NEEDS_RESIGN\",\n ...base,\n };\n },\n\n async campaignStats(campaignId): Promise<CampaignStatsRow> {\n const counts = await statusCounts({ campaignId });\n const total = totalOf(counts);\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { campaignId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const signed = (await prisma.signingRequest.findMany({\n where: { campaignId, status: \"SIGNED\" },\n select: { createdAt: true, signedAt: true },\n })) as { createdAt: Date; signedAt: Date | null }[];\n const durations = signed\n .filter((r) => r.signedAt)\n .map((r) => r.signedAt!.getTime() - r.createdAt.getTime());\n const avgTimeToSignMs =\n durations.length === 0 ? null : Math.round(durations.reduce((a, b) => a + b, 0) / durations.length);\n const outstanding = await outstandingFor({ campaignId }, new Date(0), 100).catch(() => []);\n\n return {\n campaignId,\n counts,\n total,\n viewedNotSigned: counts.VIEWED,\n completionRate: completion(counts),\n avgTimeToSignMs,\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n outstanding,\n };\n },\n\n async documentStats(documentId): Promise<DocumentStatsRow> {\n const counts = await statusCounts({ documentId });\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n return {\n documentId,\n counts,\n total: totalOf(counts),\n completionRate: completion(counts),\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n };\n },\n\n async scopeStats(scopeId, range?: StatsRange): Promise<ScopeStatsRow> {\n const createdAt =\n range?.from || range?.to\n ? { gte: range?.from ?? undefined, lte: range?.to ?? undefined }\n : undefined;\n const reqWhere = { scopeId: scopeId ?? undefined, createdAt };\n const counts = await statusCounts(reqWhere);\n const campaignsSent = await prisma.signingCampaign.count({\n where: { scopeId: scopeId ?? undefined, deletedAt: null, createdAt },\n });\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: reqWhere,\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n const oldestOutstanding = await outstandingFor(\n { scopeId: scopeId ?? undefined },\n new Date(0),\n 20,\n );\n return {\n campaignsSent,\n requestsSent: totalOf(counts),\n counts,\n completionRate: completion(counts),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n oldestOutstanding,\n };\n },\n\n async outstandingRequests(filter) {\n return outstandingFor(\n {\n scopeId: filter.scopeId ?? undefined,\n documentId: filter.documentId,\n campaignId: filter.campaignId,\n },\n filter.now,\n filter.limit ?? 100,\n );\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/flow.ts","../../src/server/uid.ts","../../src/adapters/prisma/adapter.ts"],"names":["randomBytes"],"mappings":"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","file":"index.cjs","sourcesContent":["import { EsignError } from \"./errors\";\n\n/**\n * Lifecycle of a single signing request. PENDING/VIEWED are the only active\n * states; SIGNED/DECLINED/EXPIRED/REVOKED are terminal. The submit handler is\n * idempotent, so a no-op transition to the same state is always allowed.\n */\nexport type EsignStatus =\n | \"PENDING\"\n | \"VIEWED\"\n | \"SIGNED\"\n | \"DECLINED\"\n | \"EXPIRED\"\n | \"REVOKED\";\n\nexport const ESIGN_STATUSES: readonly EsignStatus[] = [\n \"PENDING\",\n \"VIEWED\",\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\n/** Active (still-actionable) states — eligible for view/sign/decline. */\nexport const ACTIVE_STATUSES: readonly EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\n/** Terminal states — no further transitions. */\nexport const TERMINAL_STATUSES: readonly EsignStatus[] = [\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\nconst TRANSITIONS: Record<EsignStatus, readonly EsignStatus[]> = {\n PENDING: [\"VIEWED\", \"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n VIEWED: [\"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n SIGNED: [],\n DECLINED: [],\n EXPIRED: [],\n REVOKED: [],\n};\n\nexport function isActive(status: EsignStatus): boolean {\n return ACTIVE_STATUSES.includes(status);\n}\n\nexport function isTerminal(status: EsignStatus): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n/** Whether `from → to` is a legal move (a same-state no-op counts as legal). */\nexport function canTransition(from: EsignStatus, to: EsignStatus): boolean {\n if (from === to) return true;\n return TRANSITIONS[from].includes(to);\n}\n\n/** Throw `EsignError('CONFLICT')` on an illegal transition. */\nexport function assertTransition(from: EsignStatus, to: EsignStatus): void {\n if (!canTransition(from, to)) {\n throw new EsignError(\n \"CONFLICT\",\n `Illegal signing-request transition: ${from} → ${to}.`,\n );\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\n// 62-char URL-safe alphabet. 16 chars ≈ 95 bits of entropy — ample for row ids.\nconst ALPHABET =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\n/**\n * A 16-char unique id, matching the host `@db.VarChar(16)` convention. The\n * package generates ids in code (the Prisma fragment carries no `@default`), so\n * every esign-owned row gets a uid the same way across dhm-estates / flc-missions\n * / flc-hr. Rejection sampling keeps the distribution uniform (no modulo bias).\n */\nexport function uid(size = 16): string {\n let out = \"\";\n while (out.length < size) {\n for (const byte of randomBytes(size)) {\n if (byte < 248) {\n // 248 = floor(256 / 62) * 62 — discard the biased tail.\n out += ALPHABET[byte % 62];\n if (out.length === size) break;\n }\n }\n }\n return out;\n}\n","import type { EsignStatus } from \"../../server/flow\";\nimport type { NewRequestRow, PersistencePort, RequestSummary } from \"../../server/ports\";\nimport { ESIGN_STATUSES } from \"../../server/flow\";\nimport { uid } from \"../../server/uid\";\nimport type {\n CampaignStatsRow,\n DocumentStatsRow,\n EsignChannel,\n GroupBreakdown,\n OutstandingRequest,\n Placement,\n ScopeStatsRow,\n SignatureField,\n SigningAuditEventDTO,\n SigningCampaignDTO,\n SigningDocumentDTO,\n SigningDocumentVersionDTO,\n SigningRequestDTO,\n StatsRange,\n StatusCountMap,\n SubjectSelection,\n SubjectSigningStatus,\n} from \"../../server/types\";\n\n// Structural Prisma client — accepts any client exposing the five esign\n// delegates. Keeps `@prisma/client` out of the package's dependency graph\n// (mirrors @firstlovecenter/milestone-grid). The host passes its own `prisma`.\ninterface Delegate {\n create(args: { data: unknown }): Promise<unknown>;\n createMany(args: { data: unknown[] }): Promise<unknown>;\n findUnique(args: { where: unknown; select?: unknown }): Promise<unknown>;\n findFirst(args: {\n where?: unknown;\n orderBy?: unknown;\n select?: unknown;\n }): Promise<unknown>;\n findMany(args: {\n where?: unknown;\n orderBy?: unknown;\n take?: number;\n select?: unknown;\n }): Promise<unknown[]>;\n update(args: { where: unknown; data: unknown }): Promise<unknown>;\n count(args: { where?: unknown }): Promise<number>;\n groupBy(args: { by: string[]; where?: unknown; _count?: unknown }): Promise<unknown[]>;\n}\n\nexport interface PrismaLike {\n signingDocument: Delegate;\n signingDocumentVersion: Delegate;\n signingCampaign: Delegate;\n signingRequest: Delegate;\n signingAuditEvent: Delegate;\n}\n\nconst iso = (d: Date): string => d.toISOString();\nconst isoN = (d: Date | null): string | null => (d ? d.toISOString() : null);\n\ninterface DocRow {\n id: string;\n scopeId: string | null;\n documentType: string | null;\n title: string;\n audience: unknown;\n currentVersionId: string | null;\n createdById: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\nconst mapDoc = (r: DocRow): SigningDocumentDTO => ({\n id: r.id,\n scopeId: r.scopeId,\n documentType: r.documentType,\n title: r.title,\n audience: (r.audience as SubjectSelection | null) ?? null,\n currentVersionId: r.currentVersionId,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n updatedAt: iso(r.updatedAt),\n});\n\ninterface VerRow {\n id: string;\n documentId: string;\n version: number;\n sourceObjectKey: string;\n sourceSha256: string;\n placement: unknown;\n changeNote: string | null;\n createdById: string | null;\n createdAt: Date;\n}\n/** The `placement` Json column holds a SignatureField[]; tolerate a legacy single object. */\nfunction toFields(raw: unknown): SignatureField[] {\n if (Array.isArray(raw)) return raw as SignatureField[];\n if (raw && typeof raw === \"object\") {\n return [{ ...(raw as Placement), id: \"field-1\", label: \"Signature\" }];\n }\n return [];\n}\n\nconst mapVer = (r: VerRow): SigningDocumentVersionDTO => ({\n id: r.id,\n documentId: r.documentId,\n version: r.version,\n sourceObjectKey: r.sourceObjectKey,\n sourceSha256: r.sourceSha256,\n placements: toFields(r.placement),\n changeNote: r.changeNote,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface CampRow {\n id: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n note: string | null;\n emailReceipt: boolean;\n targeting: unknown;\n expiresAt: Date;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapCamp = (r: CampRow): SigningCampaignDTO => ({\n id: r.id,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n note: r.note,\n emailReceipt: r.emailReceipt,\n targeting: r.targeting as SubjectSelection,\n expiresAt: iso(r.expiresAt),\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface ReqRow {\n id: string;\n campaignId: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n subjectType: string;\n subjectId: string;\n subjectGroup: string | null;\n recipientName: string;\n recipientEmail: string | null;\n recipientWhatsapp: string | null;\n channels: unknown;\n status: EsignStatus;\n viewedAt: Date | null;\n signedAt: Date | null;\n declinedAt: Date | null;\n expiresAt: Date;\n revokedAt: Date | null;\n sealedObjectKey: string | null;\n sealedSha256: string | null;\n createdAt: Date;\n}\nconst mapReq = (r: ReqRow): SigningRequestDTO => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status,\n viewedAt: isoN(r.viewedAt),\n signedAt: isoN(r.signedAt),\n declinedAt: isoN(r.declinedAt),\n expiresAt: iso(r.expiresAt),\n revokedAt: isoN(r.revokedAt),\n sealedObjectKey: r.sealedObjectKey,\n sealedSha256: r.sealedSha256,\n createdAt: iso(r.createdAt),\n});\n\nconst emptyCounts = (): StatusCountMap =>\n Object.fromEntries(ESIGN_STATUSES.map((s) => [s, 0])) as StatusCountMap;\n\ninterface GroupRow {\n status: EsignStatus;\n _count: { _all: number };\n}\nconst totalOf = (c: StatusCountMap): number =>\n ESIGN_STATUSES.reduce((sum, s) => sum + c[s], 0);\nconst completion = (c: StatusCountMap): number => {\n const total = totalOf(c);\n return total === 0 ? 0 : c.SIGNED / total;\n};\n\n/** Fold groupBy([key,status]) rows into per-key status-count breakdowns. */\nfunction foldBreakdown<K extends string>(\n rows: ({ status: EsignStatus; _count: { _all: number } } & Record<K, string | null>)[],\n key: K,\n): { value: string | null; counts: StatusCountMap; total: number }[] {\n const map = new Map<string | null, StatusCountMap>();\n for (const row of rows) {\n const k = row[key];\n let counts = map.get(k);\n if (!counts) {\n counts = emptyCounts();\n map.set(k, counts);\n }\n counts[row.status] += row._count._all;\n }\n return [...map.entries()].map(([value, counts]) => ({\n value,\n counts,\n total: totalOf(counts),\n }));\n}\n\nconst ACTIVE: EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\nexport function createPrismaPersistence(prisma: PrismaLike): PersistencePort {\n async function statusCounts(where: unknown): Promise<StatusCountMap> {\n const rows = (await prisma.signingRequest.groupBy({\n by: [\"status\"],\n where,\n _count: { _all: true },\n })) as GroupRow[];\n const counts = emptyCounts();\n for (const r of rows) counts[r.status] = r._count._all;\n return counts;\n }\n\n async function outstandingFor(\n where: Record<string, unknown>,\n now: Date,\n limit: number,\n ): Promise<OutstandingRequest[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { ...where, status: { in: ACTIVE }, expiresAt: { gt: now } },\n orderBy: { createdAt: \"asc\" },\n take: limit,\n })) as ReqRow[];\n return rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n recipientName: r.recipientName,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status as \"PENDING\" | \"VIEWED\",\n viewedAt: isoN(r.viewedAt),\n createdAt: iso(r.createdAt),\n expiresAt: iso(r.expiresAt),\n }));\n }\n\n return {\n // Documents\n async createDocument(input) {\n const row = (await prisma.signingDocument.create({\n data: {\n id: uid(),\n scopeId: input.scopeId,\n documentType: input.documentType,\n title: input.title,\n audience: input.audience ?? undefined,\n createdById: input.createdById,\n },\n })) as DocRow;\n return mapDoc(row);\n },\n async getDocument(id) {\n const row = (await prisma.signingDocument.findFirst({\n where: { id, deletedAt: null },\n })) as DocRow | null;\n return row ? mapDoc(row) : null;\n },\n async updateDocument(id, patch) {\n const data: Record<string, unknown> = {};\n if (patch.title !== undefined) data.title = patch.title;\n if (patch.currentVersionId !== undefined) data.currentVersionId = patch.currentVersionId;\n if (patch.audience !== undefined && patch.audience !== null) data.audience = patch.audience;\n const row = (await prisma.signingDocument.update({ where: { id }, data })) as DocRow;\n return mapDoc(row);\n },\n async listDocuments(opts) {\n const rows = (await prisma.signingDocument.findMany({\n where: { deletedAt: null, scopeId: opts.scopeId ?? undefined, documentType: opts.documentType ?? undefined },\n orderBy: { createdAt: \"desc\" },\n })) as DocRow[];\n return rows.map(mapDoc);\n },\n\n // Versions\n async createVersion(input) {\n const row = (await prisma.signingDocumentVersion.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n version: input.version,\n sourceObjectKey: input.sourceObjectKey,\n sourceSha256: input.sourceSha256,\n placement: input.placements,\n changeNote: input.changeNote,\n createdById: input.createdById,\n },\n })) as VerRow;\n return mapVer(row);\n },\n async getVersion(id) {\n const row = (await prisma.signingDocumentVersion.findUnique({ where: { id } })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n async listVersions(documentId) {\n const rows = (await prisma.signingDocumentVersion.findMany({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow[];\n return rows.map(mapVer);\n },\n async latestVersion(documentId) {\n const row = (await prisma.signingDocumentVersion.findFirst({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n\n // Campaigns\n async createCampaign(input) {\n const row = (await prisma.signingCampaign.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n documentVersionId: input.documentVersionId,\n scopeId: input.scopeId,\n note: input.note,\n emailReceipt: input.emailReceipt,\n targeting: input.targeting,\n expiresAt: input.expiresAt,\n createdById: input.createdById,\n },\n })) as CampRow;\n return mapCamp(row);\n },\n async getCampaign(id) {\n const row = (await prisma.signingCampaign.findFirst({ where: { id, deletedAt: null } })) as CampRow | null;\n return row ? mapCamp(row) : null;\n },\n async listCampaigns(documentId) {\n const rows = (await prisma.signingCampaign.findMany({\n where: { documentId, deletedAt: null },\n orderBy: { createdAt: \"desc\" },\n })) as CampRow[];\n return rows.map(mapCamp);\n },\n\n // Requests\n async createRequests(rows: NewRequestRow[]) {\n if (rows.length === 0) return;\n await prisma.signingRequest.createMany({\n data: rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: r.channels,\n tokenHash: r.tokenHash,\n expiresAt: r.expiresAt,\n })),\n });\n },\n async getRequest(id) {\n const row = (await prisma.signingRequest.findUnique({ where: { id } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async findRequestByTokenHash(tokenHash) {\n const row = (await prisma.signingRequest.findUnique({ where: { tokenHash } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async updateRequest(id, patch) {\n const row = (await prisma.signingRequest.update({ where: { id }, data: patch })) as ReqRow;\n return mapReq(row);\n },\n async listRequests(opts) {\n const rows = (await prisma.signingRequest.findMany({\n where: {\n campaignId: opts.campaignId,\n documentId: opts.documentId,\n subjectType: opts.subjectType,\n subjectId: opts.subjectId,\n },\n orderBy: { createdAt: \"desc\" },\n })) as ReqRow[];\n return rows.map(mapReq);\n },\n async requestSummaryBySubject(documentId): Promise<RequestSummary[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { documentId },\n orderBy: { createdAt: \"desc\" },\n select: {\n subjectId: true,\n status: true,\n signedAt: true,\n version: { select: { version: true } },\n },\n })) as {\n subjectId: string;\n status: EsignStatus;\n signedAt: Date | null;\n version: { version: number };\n }[];\n const seen = new Map<string, RequestSummary>();\n for (const r of rows) {\n if (seen.has(r.subjectId)) continue; // first = latest (desc order)\n seen.set(r.subjectId, {\n subjectId: r.subjectId,\n status: r.status,\n version: r.version.version,\n signedAt: isoN(r.signedAt),\n });\n }\n return [...seen.values()];\n },\n\n // Audit chain\n async appendAuditEvent(row) {\n const created = (await prisma.signingAuditEvent.create({\n data: {\n id: uid(),\n requestId: row.requestId,\n seq: row.seq,\n type: row.type,\n payload: row.payload,\n prevHash: row.prevHash,\n hash: row.hash,\n },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n };\n return {\n id: created.id,\n requestId: created.requestId,\n seq: created.seq,\n type: created.type,\n payload: created.payload,\n prevHash: created.prevHash,\n hash: created.hash,\n occurredAt: iso(created.occurredAt),\n } satisfies SigningAuditEventDTO;\n },\n async listAuditEvents(requestId) {\n const rows = (await prisma.signingAuditEvent.findMany({\n where: { requestId },\n orderBy: { seq: \"asc\" },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n }[];\n return rows.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n seq: r.seq,\n type: r.type,\n payload: r.payload,\n prevHash: r.prevHash,\n hash: r.hash,\n occurredAt: iso(r.occurredAt),\n }));\n },\n async lastAuditHash(requestId) {\n const row = (await prisma.signingAuditEvent.findFirst({\n where: { requestId },\n orderBy: { seq: \"desc\" },\n select: { seq: true, hash: true },\n })) as { seq: number; hash: string } | null;\n return row ?? null;\n },\n\n // Green-check + stats\n async subjectSigningStatus(args): Promise<SubjectSigningStatus> {\n const where: Record<string, unknown> = {\n subjectType: args.subjectType,\n subjectId: args.subjectId,\n };\n if (args.documentId) where.documentId = args.documentId;\n else if (args.documentType) where.document = { documentType: args.documentType };\n\n const latest = (await prisma.signingRequest.findFirst({\n where,\n orderBy: { createdAt: \"desc\" },\n select: {\n id: true,\n status: true,\n signedAt: true,\n sealedObjectKey: true,\n documentId: true,\n version: { select: { version: true } },\n },\n })) as {\n id: string;\n status: EsignStatus;\n signedAt: Date | null;\n sealedObjectKey: string | null;\n documentId: string;\n version: { version: number };\n } | null;\n\n if (!latest) {\n return { state: \"NONE\", signedAt: null, signedVersion: null, requestId: null, sealedObjectKey: null };\n }\n\n const base = {\n signedAt: isoN(latest.signedAt),\n signedVersion: latest.version.version,\n requestId: latest.id,\n sealedObjectKey: latest.sealedObjectKey,\n };\n\n if (latest.status !== \"SIGNED\") {\n const state =\n latest.status === \"PENDING\" || latest.status === \"VIEWED\" || latest.status === \"DECLINED\"\n ? latest.status\n : \"NONE\";\n return { state, ...base, signedAt: null };\n }\n\n if (args.versionPolicy === \"any\") return { state: \"SIGNED\", ...base };\n\n // \"current\": needs re-sign if signed an older version than the doc's current.\n const doc = (await prisma.signingDocument.findFirst({\n where: { id: latest.documentId },\n select: { currentVersionId: true },\n })) as { currentVersionId: string | null } | null;\n let currentNumber = latest.version.version;\n if (doc?.currentVersionId) {\n const cur = (await prisma.signingDocumentVersion.findUnique({\n where: { id: doc.currentVersionId },\n select: { version: true },\n })) as { version: number } | null;\n if (cur) currentNumber = cur.version;\n }\n return {\n state: latest.version.version >= currentNumber ? \"SIGNED\" : \"NEEDS_RESIGN\",\n ...base,\n };\n },\n\n async campaignStats(campaignId): Promise<CampaignStatsRow> {\n const counts = await statusCounts({ campaignId });\n const total = totalOf(counts);\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { campaignId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const signed = (await prisma.signingRequest.findMany({\n where: { campaignId, status: \"SIGNED\" },\n select: { createdAt: true, signedAt: true },\n })) as { createdAt: Date; signedAt: Date | null }[];\n const durations = signed\n .filter((r) => r.signedAt)\n .map((r) => r.signedAt!.getTime() - r.createdAt.getTime());\n const avgTimeToSignMs =\n durations.length === 0 ? null : Math.round(durations.reduce((a, b) => a + b, 0) / durations.length);\n const outstanding = await outstandingFor({ campaignId }, new Date(0), 100).catch(() => []);\n\n return {\n campaignId,\n counts,\n total,\n viewedNotSigned: counts.VIEWED,\n completionRate: completion(counts),\n avgTimeToSignMs,\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n outstanding,\n };\n },\n\n async documentStats(documentId): Promise<DocumentStatsRow> {\n const counts = await statusCounts({ documentId });\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n return {\n documentId,\n counts,\n total: totalOf(counts),\n completionRate: completion(counts),\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n };\n },\n\n async scopeStats(scopeId, range?: StatsRange): Promise<ScopeStatsRow> {\n const createdAt =\n range?.from || range?.to\n ? { gte: range?.from ?? undefined, lte: range?.to ?? undefined }\n : undefined;\n const reqWhere = { scopeId: scopeId ?? undefined, createdAt };\n const counts = await statusCounts(reqWhere);\n const campaignsSent = await prisma.signingCampaign.count({\n where: { scopeId: scopeId ?? undefined, deletedAt: null, createdAt },\n });\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: reqWhere,\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n const oldestOutstanding = await outstandingFor(\n { scopeId: scopeId ?? undefined },\n new Date(0),\n 20,\n );\n return {\n campaignsSent,\n requestsSent: totalOf(counts),\n counts,\n completionRate: completion(counts),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n oldestOutstanding,\n };\n },\n\n async outstandingRequests(filter) {\n return outstandingFor(\n {\n scopeId: filter.scopeId ?? undefined,\n documentId: filter.documentId,\n campaignId: filter.campaignId,\n },\n filter.now,\n filter.limit ?? 100,\n );\n },\n };\n}\n"]}
|
package/dist/prisma/index.d.cts
CHANGED
package/dist/prisma/index.d.ts
CHANGED
package/dist/prisma/index.js
CHANGED
|
@@ -37,13 +37,20 @@ var mapDoc = (r) => ({
|
|
|
37
37
|
createdAt: iso(r.createdAt),
|
|
38
38
|
updatedAt: iso(r.updatedAt)
|
|
39
39
|
});
|
|
40
|
+
function toFields(raw) {
|
|
41
|
+
if (Array.isArray(raw)) return raw;
|
|
42
|
+
if (raw && typeof raw === "object") {
|
|
43
|
+
return [{ ...raw, id: "field-1", label: "Signature" }];
|
|
44
|
+
}
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
40
47
|
var mapVer = (r) => ({
|
|
41
48
|
id: r.id,
|
|
42
49
|
documentId: r.documentId,
|
|
43
50
|
version: r.version,
|
|
44
51
|
sourceObjectKey: r.sourceObjectKey,
|
|
45
52
|
sourceSha256: r.sourceSha256,
|
|
46
|
-
|
|
53
|
+
placements: toFields(r.placement),
|
|
47
54
|
changeNote: r.changeNote,
|
|
48
55
|
createdById: r.createdById,
|
|
49
56
|
createdAt: iso(r.createdAt)
|
|
@@ -183,7 +190,7 @@ function createPrismaPersistence(prisma) {
|
|
|
183
190
|
version: input.version,
|
|
184
191
|
sourceObjectKey: input.sourceObjectKey,
|
|
185
192
|
sourceSha256: input.sourceSha256,
|
|
186
|
-
placement: input.
|
|
193
|
+
placement: input.placements,
|
|
187
194
|
changeNote: input.changeNote,
|
|
188
195
|
createdById: input.createdById
|
|
189
196
|
}
|