@voyantjs/legal 0.3.0 → 0.4.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/contracts/index.d.ts +5 -2
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +3 -1
- package/dist/contracts/routes.d.ts +1831 -36
- package/dist/contracts/routes.d.ts.map +1 -1
- package/dist/contracts/routes.js +280 -222
- package/dist/contracts/service-documents.d.ts +66 -0
- package/dist/contracts/service-documents.d.ts.map +1 -0
- package/dist/contracts/service-documents.js +244 -0
- package/dist/contracts/service-shared.d.ts.map +1 -1
- package/dist/contracts/service-shared.js +2 -44
- package/dist/contracts/service-templates.d.ts +19 -0
- package/dist/contracts/service-templates.d.ts.map +1 -1
- package/dist/contracts/service-templates.js +24 -0
- package/dist/contracts/service.d.ts +29 -0
- package/dist/contracts/service.d.ts.map +1 -1
- package/dist/contracts/service.js +2 -0
- package/dist/contracts/validation.d.ts +62 -0
- package/dist/contracts/validation.d.ts.map +1 -1
- package/dist/contracts/validation.js +40 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -12
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/contracts/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/contracts/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAGjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAoB/C,KAAK,GAAG,GAAG;IACT,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,EAAE;QACT,EAAE,EAAE,kBAAkB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG,UAAU,CAChD,OAAO,gBAAgB,CAAC,wBAAwB,CACjD,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;AAEjB,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,EAAE,yBAAyB,CAAA;IAC7C,wBAAwB,CAAC,EAAE,CACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,yBAAyB,GAAG,SAAS,CAAA;CAC3C;AASD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,qBAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCA+Q7E;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAA+B,CAAA;AAEhE,wBAAgB,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoC1C;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAAgC,CAAA;AAElE,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAC9D,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAA"}
|
package/dist/contracts/routes.js
CHANGED
|
@@ -1,224 +1,282 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { contractsService } from "./service.js";
|
|
3
|
-
import { contractListQuerySchema, contractTemplateListQuerySchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return c.json({
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return c.json({
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return c.json({
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
})
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
return c.json({
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
3
|
+
import { contractListQuerySchema, contractTemplateDefaultQuerySchema, contractTemplateListQuerySchema, generateContractDocumentInputSchema, insertContractAttachmentSchema, insertContractNumberSeriesSchema, insertContractSchema, insertContractSignatureSchema, insertContractTemplateSchema, insertContractTemplateVersionSchema, publicRenderTemplatePreviewInputSchema, renderTemplateInputSchema, updateContractAttachmentSchema, updateContractNumberSeriesSchema, updateContractSchema, updateContractTemplateSchema, } from "./validation.js";
|
|
4
|
+
function resolveDocumentGenerator(options, bindings) {
|
|
5
|
+
return options?.resolveDocumentGenerator?.(bindings) ?? options?.documentGenerator;
|
|
6
|
+
}
|
|
7
|
+
export function createContractsAdminRoutes(options = {}) {
|
|
8
|
+
return new Hono()
|
|
9
|
+
.get("/templates", async (c) => {
|
|
10
|
+
const query = contractTemplateListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
|
|
11
|
+
return c.json(await contractsService.listTemplates(c.get("db"), query));
|
|
12
|
+
})
|
|
13
|
+
.get("/templates/default", async (c) => {
|
|
14
|
+
const query = contractTemplateDefaultQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
|
|
15
|
+
const row = await contractsService.getDefaultTemplate(c.get("db"), query);
|
|
16
|
+
if (!row)
|
|
17
|
+
return c.json({ error: "Template not found" }, 404);
|
|
18
|
+
return c.json({ data: row });
|
|
19
|
+
})
|
|
20
|
+
.post("/templates", async (c) => {
|
|
21
|
+
const row = await contractsService.createTemplate(c.get("db"), insertContractTemplateSchema.parse(await c.req.json()));
|
|
22
|
+
return c.json({ data: row }, 201);
|
|
23
|
+
})
|
|
24
|
+
.get("/templates/:id", async (c) => {
|
|
25
|
+
const row = await contractsService.getTemplateById(c.get("db"), c.req.param("id"));
|
|
26
|
+
if (!row)
|
|
27
|
+
return c.json({ error: "Template not found" }, 404);
|
|
28
|
+
return c.json({ data: row });
|
|
29
|
+
})
|
|
30
|
+
.patch("/templates/:id", async (c) => {
|
|
31
|
+
const row = await contractsService.updateTemplate(c.get("db"), c.req.param("id"), updateContractTemplateSchema.parse(await c.req.json()));
|
|
32
|
+
if (!row)
|
|
33
|
+
return c.json({ error: "Template not found" }, 404);
|
|
34
|
+
return c.json({ data: row });
|
|
35
|
+
})
|
|
36
|
+
.delete("/templates/:id", async (c) => {
|
|
37
|
+
const row = await contractsService.deleteTemplate(c.get("db"), c.req.param("id"));
|
|
38
|
+
if (!row)
|
|
39
|
+
return c.json({ error: "Template not found" }, 404);
|
|
40
|
+
return c.json({ success: true });
|
|
41
|
+
})
|
|
42
|
+
.post("/templates/:id/preview", async (c) => {
|
|
43
|
+
const input = renderTemplateInputSchema.parse(await c.req.json());
|
|
44
|
+
const template = await contractsService.getTemplateById(c.get("db"), c.req.param("id"));
|
|
45
|
+
if (!template)
|
|
46
|
+
return c.json({ error: "Template not found" }, 404);
|
|
47
|
+
const body = input.body ?? template.body;
|
|
48
|
+
const bodyFormat = input.bodyFormat ?? template.bodyFormat;
|
|
49
|
+
const rendered = contractsService.renderPreview({ ...input, body, bodyFormat });
|
|
50
|
+
return c.json({ data: { rendered, bodyFormat } });
|
|
51
|
+
})
|
|
52
|
+
.get("/templates/:id/versions", async (c) => {
|
|
53
|
+
const rows = await contractsService.listTemplateVersions(c.get("db"), c.req.param("id"));
|
|
54
|
+
return c.json({ data: rows });
|
|
55
|
+
})
|
|
56
|
+
.post("/templates/:id/versions", async (c) => {
|
|
57
|
+
const version = await contractsService.createTemplateVersion(c.get("db"), c.req.param("id"), insertContractTemplateVersionSchema.parse(await c.req.json()));
|
|
58
|
+
if (!version)
|
|
59
|
+
return c.json({ error: "Template not found" }, 404);
|
|
60
|
+
return c.json({ data: version }, 201);
|
|
61
|
+
})
|
|
62
|
+
.get("/template-versions/:id", async (c) => {
|
|
63
|
+
const row = await contractsService.getTemplateVersionById(c.get("db"), c.req.param("id"));
|
|
64
|
+
if (!row)
|
|
65
|
+
return c.json({ error: "Template version not found" }, 404);
|
|
66
|
+
return c.json({ data: row });
|
|
67
|
+
})
|
|
68
|
+
.get("/number-series", async (c) => {
|
|
69
|
+
const rows = await contractsService.listSeries(c.get("db"));
|
|
70
|
+
return c.json({ data: rows });
|
|
71
|
+
})
|
|
72
|
+
.post("/number-series", async (c) => {
|
|
73
|
+
const row = await contractsService.createSeries(c.get("db"), insertContractNumberSeriesSchema.parse(await c.req.json()));
|
|
74
|
+
return c.json({ data: row }, 201);
|
|
75
|
+
})
|
|
76
|
+
.get("/number-series/:id", async (c) => {
|
|
77
|
+
const row = await contractsService.getSeriesById(c.get("db"), c.req.param("id"));
|
|
78
|
+
if (!row)
|
|
79
|
+
return c.json({ error: "Series not found" }, 404);
|
|
80
|
+
return c.json({ data: row });
|
|
81
|
+
})
|
|
82
|
+
.patch("/number-series/:id", async (c) => {
|
|
83
|
+
const row = await contractsService.updateSeries(c.get("db"), c.req.param("id"), updateContractNumberSeriesSchema.parse(await c.req.json()));
|
|
84
|
+
if (!row)
|
|
85
|
+
return c.json({ error: "Series not found" }, 404);
|
|
86
|
+
return c.json({ data: row });
|
|
87
|
+
})
|
|
88
|
+
.delete("/number-series/:id", async (c) => {
|
|
89
|
+
const row = await contractsService.deleteSeries(c.get("db"), c.req.param("id"));
|
|
90
|
+
if (!row)
|
|
91
|
+
return c.json({ error: "Series not found" }, 404);
|
|
92
|
+
return c.json({ success: true });
|
|
93
|
+
})
|
|
94
|
+
.get("/", async (c) => {
|
|
95
|
+
const query = contractListQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
|
|
96
|
+
return c.json(await contractsService.listContracts(c.get("db"), query));
|
|
97
|
+
})
|
|
98
|
+
.post("/", async (c) => {
|
|
99
|
+
const row = await contractsService.createContract(c.get("db"), insertContractSchema.parse(await c.req.json()));
|
|
100
|
+
return c.json({ data: row }, 201);
|
|
101
|
+
})
|
|
102
|
+
.get("/:id", async (c) => {
|
|
103
|
+
const row = await contractsService.getContractById(c.get("db"), c.req.param("id"));
|
|
104
|
+
if (!row)
|
|
105
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
106
|
+
return c.json({ data: row });
|
|
107
|
+
})
|
|
108
|
+
.patch("/:id", async (c) => {
|
|
109
|
+
const row = await contractsService.updateContract(c.get("db"), c.req.param("id"), updateContractSchema.parse(await c.req.json()));
|
|
110
|
+
if (!row)
|
|
111
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
112
|
+
return c.json({ data: row });
|
|
113
|
+
})
|
|
114
|
+
.delete("/:id", async (c) => {
|
|
115
|
+
const result = await contractsService.deleteContract(c.get("db"), c.req.param("id"));
|
|
116
|
+
if (result.status === "not_found")
|
|
117
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
118
|
+
if (result.status === "not_draft") {
|
|
119
|
+
return c.json({ error: "Only draft contracts can be deleted" }, 409);
|
|
120
|
+
}
|
|
121
|
+
return c.json({ success: true });
|
|
122
|
+
})
|
|
123
|
+
.post("/:id/issue", async (c) => {
|
|
124
|
+
const result = await contractsService.issueContract(c.get("db"), c.req.param("id"));
|
|
125
|
+
if (result.status === "not_found")
|
|
126
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
127
|
+
if (result.status === "not_draft") {
|
|
128
|
+
return c.json({ error: "Only draft contracts can be issued" }, 409);
|
|
129
|
+
}
|
|
130
|
+
return c.json({ data: result.contract });
|
|
131
|
+
})
|
|
132
|
+
.post("/:id/send", async (c) => {
|
|
133
|
+
const result = await contractsService.sendContract(c.get("db"), c.req.param("id"));
|
|
134
|
+
if (result.status === "not_found")
|
|
135
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
136
|
+
if (result.status === "not_issued") {
|
|
137
|
+
return c.json({ error: "Only issued/sent contracts can be sent" }, 409);
|
|
138
|
+
}
|
|
139
|
+
return c.json({ data: result.contract });
|
|
140
|
+
})
|
|
141
|
+
.post("/:id/sign", async (c) => {
|
|
142
|
+
const input = insertContractSignatureSchema.parse(await c.req.json());
|
|
143
|
+
const result = await contractsService.signContract(c.get("db"), c.req.param("id"), input);
|
|
144
|
+
if (result.status === "not_found")
|
|
145
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
146
|
+
if (result.status === "not_signable") {
|
|
147
|
+
return c.json({ error: "Contract is not in a signable state" }, 409);
|
|
148
|
+
}
|
|
149
|
+
return c.json({ data: { contract: result.contract, signature: result.signature } });
|
|
150
|
+
})
|
|
151
|
+
.post("/:id/execute", async (c) => {
|
|
152
|
+
const result = await contractsService.executeContract(c.get("db"), c.req.param("id"));
|
|
153
|
+
if (result.status === "not_found")
|
|
154
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
155
|
+
if (result.status === "not_signed") {
|
|
156
|
+
return c.json({ error: "Only signed contracts can be executed" }, 409);
|
|
157
|
+
}
|
|
158
|
+
return c.json({ data: result.contract });
|
|
159
|
+
})
|
|
160
|
+
.post("/:id/void", async (c) => {
|
|
161
|
+
const result = await contractsService.voidContract(c.get("db"), c.req.param("id"));
|
|
162
|
+
if (result.status === "not_found")
|
|
163
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
164
|
+
if (result.status === "already_void") {
|
|
165
|
+
return c.json({ error: "Contract is already void" }, 409);
|
|
166
|
+
}
|
|
167
|
+
return c.json({ data: result.contract });
|
|
168
|
+
})
|
|
169
|
+
.post("/:id/render", async (c) => {
|
|
170
|
+
const input = renderTemplateInputSchema.parse(await c.req.json());
|
|
171
|
+
const contract = await contractsService.getContractById(c.get("db"), c.req.param("id"));
|
|
172
|
+
if (!contract)
|
|
173
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
174
|
+
const rendered = contractsService.renderPreview(input);
|
|
175
|
+
return c.json({ data: { rendered } });
|
|
176
|
+
})
|
|
177
|
+
.post("/:id/generate-document", async (c) => {
|
|
178
|
+
const generator = resolveDocumentGenerator(options, c.env);
|
|
179
|
+
if (!generator) {
|
|
180
|
+
return c.json({ error: "Contract document generator is not configured" }, 501);
|
|
181
|
+
}
|
|
182
|
+
const result = await contractsService.generateContractDocument(c.get("db"), c.req.param("id"), generateContractDocumentInputSchema.parse(await c.req.json().catch(() => ({}))), { generator, bindings: c.env });
|
|
183
|
+
if (result.status === "not_found")
|
|
184
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
185
|
+
if (result.status === "not_draft") {
|
|
186
|
+
return c.json({ error: "Only draft contracts can be auto-issued for document generation" }, 409);
|
|
187
|
+
}
|
|
188
|
+
if (result.status === "render_unavailable") {
|
|
189
|
+
return c.json({ error: "Contract has no renderable body or template version" }, 409);
|
|
190
|
+
}
|
|
191
|
+
if (result.status === "generator_failed") {
|
|
192
|
+
return c.json({ error: "Contract document generation failed" }, 502);
|
|
193
|
+
}
|
|
194
|
+
return c.json({ data: result }, 201);
|
|
195
|
+
})
|
|
196
|
+
.post("/:id/regenerate-document", async (c) => {
|
|
197
|
+
const generator = resolveDocumentGenerator(options, c.env);
|
|
198
|
+
if (!generator) {
|
|
199
|
+
return c.json({ error: "Contract document generator is not configured" }, 501);
|
|
200
|
+
}
|
|
201
|
+
const result = await contractsService.regenerateContractDocument(c.get("db"), c.req.param("id"), generateContractDocumentInputSchema.parse(await c.req.json().catch(() => ({}))), { generator, bindings: c.env });
|
|
202
|
+
if (result.status === "not_found")
|
|
203
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
204
|
+
if (result.status === "not_draft") {
|
|
205
|
+
return c.json({ error: "Only draft contracts can be auto-issued for document generation" }, 409);
|
|
206
|
+
}
|
|
207
|
+
if (result.status === "render_unavailable") {
|
|
208
|
+
return c.json({ error: "Contract has no renderable body or template version" }, 409);
|
|
209
|
+
}
|
|
210
|
+
if (result.status === "generator_failed") {
|
|
211
|
+
return c.json({ error: "Contract document generation failed" }, 502);
|
|
212
|
+
}
|
|
213
|
+
return c.json({ data: result });
|
|
214
|
+
})
|
|
215
|
+
.get("/:id/signatures", async (c) => {
|
|
216
|
+
const rows = await contractsService.listSignatures(c.get("db"), c.req.param("id"));
|
|
217
|
+
return c.json({ data: rows });
|
|
218
|
+
})
|
|
219
|
+
.get("/:id/attachments", async (c) => {
|
|
220
|
+
const rows = await contractsService.listAttachments(c.get("db"), c.req.param("id"));
|
|
221
|
+
return c.json({ data: rows });
|
|
222
|
+
})
|
|
223
|
+
.post("/:id/attachments", async (c) => {
|
|
224
|
+
const row = await contractsService.createAttachment(c.get("db"), c.req.param("id"), insertContractAttachmentSchema.parse(await c.req.json()));
|
|
225
|
+
if (!row)
|
|
226
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
227
|
+
return c.json({ data: row }, 201);
|
|
228
|
+
})
|
|
229
|
+
.patch("/attachments/:attachmentId", async (c) => {
|
|
230
|
+
const row = await contractsService.updateAttachment(c.get("db"), c.req.param("attachmentId"), updateContractAttachmentSchema.parse(await c.req.json()));
|
|
231
|
+
if (!row)
|
|
232
|
+
return c.json({ error: "Attachment not found" }, 404);
|
|
233
|
+
return c.json({ data: row });
|
|
234
|
+
})
|
|
235
|
+
.delete("/attachments/:attachmentId", async (c) => {
|
|
236
|
+
const row = await contractsService.deleteAttachment(c.get("db"), c.req.param("attachmentId"));
|
|
237
|
+
if (!row)
|
|
238
|
+
return c.json({ error: "Attachment not found" }, 404);
|
|
239
|
+
return c.json({ success: true });
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
export const contractsAdminRoutes = createContractsAdminRoutes();
|
|
243
|
+
export function createContractsPublicRoutes() {
|
|
244
|
+
return new Hono()
|
|
245
|
+
.get("/templates/default", async (c) => {
|
|
246
|
+
const query = contractTemplateDefaultQuerySchema.parse(Object.fromEntries(new URL(c.req.url).searchParams));
|
|
247
|
+
const row = await contractsService.getDefaultTemplate(c.get("db"), query);
|
|
248
|
+
if (!row)
|
|
249
|
+
return c.json({ error: "Template not found" }, 404);
|
|
250
|
+
return c.json({ data: row });
|
|
251
|
+
})
|
|
252
|
+
.post("/templates/:id/preview", async (c) => {
|
|
253
|
+
const input = publicRenderTemplatePreviewInputSchema.parse(await c.req.json());
|
|
254
|
+
const template = await contractsService.getTemplateById(c.get("db"), c.req.param("id"));
|
|
255
|
+
if (!template?.active)
|
|
256
|
+
return c.json({ error: "Template not found" }, 404);
|
|
257
|
+
const rendered = contractsService.renderPreview({
|
|
258
|
+
variables: input.variables,
|
|
259
|
+
body: template.body,
|
|
260
|
+
bodyFormat: template.bodyFormat,
|
|
261
|
+
});
|
|
262
|
+
return c.json({ data: { rendered, bodyFormat: template.bodyFormat } });
|
|
263
|
+
})
|
|
264
|
+
.get("/:id", async (c) => {
|
|
265
|
+
const row = await contractsService.getContractById(c.get("db"), c.req.param("id"));
|
|
266
|
+
if (!row)
|
|
267
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
268
|
+
const { metadata: _metadata, ...publicContract } = row;
|
|
269
|
+
return c.json({ data: publicContract });
|
|
270
|
+
})
|
|
271
|
+
.post("/:id/sign", async (c) => {
|
|
272
|
+
const input = insertContractSignatureSchema.parse(await c.req.json());
|
|
273
|
+
const result = await contractsService.signContract(c.get("db"), c.req.param("id"), input);
|
|
274
|
+
if (result.status === "not_found")
|
|
275
|
+
return c.json({ error: "Contract not found" }, 404);
|
|
276
|
+
if (result.status === "not_signable") {
|
|
277
|
+
return c.json({ error: "Contract is not in a signable state" }, 409);
|
|
278
|
+
}
|
|
279
|
+
return c.json({ data: { signature: result.signature } });
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
export const contractsPublicRoutes = createContractsPublicRoutes();
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { StorageProvider, StorageUploadBody } from "@voyantjs/voyant-storage";
|
|
2
|
+
import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
|
|
3
|
+
import { contractAttachments, contracts, contractTemplateVersions } from "./schema.js";
|
|
4
|
+
import type { GenerateContractDocumentInput } from "./validation.js";
|
|
5
|
+
export interface GeneratedContractDocumentArtifact {
|
|
6
|
+
kind?: string | null;
|
|
7
|
+
name: string;
|
|
8
|
+
mimeType?: string | null;
|
|
9
|
+
fileSize?: number | null;
|
|
10
|
+
storageKey?: string | null;
|
|
11
|
+
checksum?: string | null;
|
|
12
|
+
metadata?: Record<string, unknown> | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ContractDocumentGeneratorContext {
|
|
15
|
+
db: PostgresJsDatabase;
|
|
16
|
+
contract: typeof contracts.$inferSelect;
|
|
17
|
+
templateVersion: typeof contractTemplateVersions.$inferSelect | null;
|
|
18
|
+
renderedBody: string;
|
|
19
|
+
renderedBodyFormat: "markdown" | "html" | "lexical_json";
|
|
20
|
+
variables: Record<string, unknown>;
|
|
21
|
+
bindings: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export type ContractDocumentGenerator = (context: ContractDocumentGeneratorContext) => Promise<GeneratedContractDocumentArtifact>;
|
|
24
|
+
export interface ContractDocumentRuntimeOptions {
|
|
25
|
+
bindings?: Record<string, unknown>;
|
|
26
|
+
generator: ContractDocumentGenerator;
|
|
27
|
+
}
|
|
28
|
+
export interface StorageBackedContractDocumentUpload {
|
|
29
|
+
body: StorageUploadBody;
|
|
30
|
+
name?: string | null;
|
|
31
|
+
mimeType?: string | null;
|
|
32
|
+
key?: string | null;
|
|
33
|
+
metadata?: Record<string, unknown> | null;
|
|
34
|
+
kind?: string | null;
|
|
35
|
+
}
|
|
36
|
+
export type StorageBackedContractDocumentSerializer = (context: ContractDocumentGeneratorContext) => Promise<StorageBackedContractDocumentUpload> | StorageBackedContractDocumentUpload;
|
|
37
|
+
export interface StorageBackedContractDocumentGeneratorOptions {
|
|
38
|
+
storage: StorageProvider;
|
|
39
|
+
keyPrefix?: string | ((context: ContractDocumentGeneratorContext) => Promise<string> | string);
|
|
40
|
+
serializer?: StorageBackedContractDocumentSerializer;
|
|
41
|
+
signedUrlExpiresIn?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface GeneratedContractDocumentRecord {
|
|
44
|
+
contractId: string;
|
|
45
|
+
contractStatus: (typeof contracts.$inferSelect)["status"];
|
|
46
|
+
renderedBodyFormat: "markdown" | "html" | "lexical_json";
|
|
47
|
+
renderedBody: string;
|
|
48
|
+
attachment: typeof contractAttachments.$inferSelect;
|
|
49
|
+
}
|
|
50
|
+
export declare function defaultStorageBackedContractDocumentSerializer(context: ContractDocumentGeneratorContext): StorageBackedContractDocumentUpload;
|
|
51
|
+
export declare function defaultPdfContractDocumentSerializer(context: ContractDocumentGeneratorContext): Promise<StorageBackedContractDocumentUpload>;
|
|
52
|
+
export declare function createStorageBackedContractDocumentGenerator(options: StorageBackedContractDocumentGeneratorOptions): ContractDocumentGenerator;
|
|
53
|
+
export declare function createPdfContractDocumentGenerator(options: Omit<StorageBackedContractDocumentGeneratorOptions, "serializer">): ContractDocumentGenerator;
|
|
54
|
+
export declare const contractDocumentsService: {
|
|
55
|
+
generateContractDocument(db: PostgresJsDatabase, contractId: string, input: GenerateContractDocumentInput, runtime: ContractDocumentRuntimeOptions): Promise<{
|
|
56
|
+
status: "not_found" | "not_draft" | "render_unavailable" | "generator_failed";
|
|
57
|
+
} | ({
|
|
58
|
+
status: "generated";
|
|
59
|
+
} & GeneratedContractDocumentRecord)>;
|
|
60
|
+
regenerateContractDocument(db: PostgresJsDatabase, contractId: string, input: GenerateContractDocumentInput, runtime: ContractDocumentRuntimeOptions): Promise<{
|
|
61
|
+
status: "not_found" | "not_draft" | "render_unavailable" | "generator_failed";
|
|
62
|
+
} | ({
|
|
63
|
+
status: "generated";
|
|
64
|
+
} & GeneratedContractDocumentRecord)>;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=service-documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-documents.d.ts","sourceRoot":"","sources":["../../src/contracts/service-documents.ts"],"names":[],"mappings":"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"}
|