mirror of
https://github.com/hanzoai/sign.git
synced 2026-10-21 01:21:51 +00:00
The resource API is /v1/rest and the operation API is /v1/rpc: named for what they are, so neither shadows the other, and the v2-beta alias is gone. Hanzo IAM returns to /auth/callback, the callback path IAM already derives for this host, so sign-in needs no IAM change. Claude-Session: https://claude.ai/code/session_01TUxvfuta1Z44KVNYuAz71F
61 lines
1.2 KiB
TypeScript
61 lines
1.2 KiB
TypeScript
import { initClient } from '@ts-rest/core';
|
|
|
|
import { ApiContractV1 } from '../contract';
|
|
|
|
const main = async () => {
|
|
const client = initClient(ApiContractV1, {
|
|
baseUrl: 'http://localhost:3000/v1/rest',
|
|
baseHeaders: {
|
|
authorization: 'Bearer <my-token>',
|
|
},
|
|
});
|
|
|
|
const { status, body } = await client.createDocument({
|
|
body: {
|
|
title: 'My Document',
|
|
recipients: [
|
|
{
|
|
name: 'John Doe',
|
|
email: '[email protected]',
|
|
role: 'SIGNER',
|
|
},
|
|
{
|
|
name: 'Jane Doe',
|
|
email: '[email protected]',
|
|
role: 'APPROVER',
|
|
},
|
|
],
|
|
meta: {
|
|
subject: 'Please sign this document',
|
|
message: 'Hey {signer.name}, please sign the following document: {document.name}',
|
|
},
|
|
},
|
|
});
|
|
|
|
if (status !== 200) {
|
|
throw new Error('Failed to create document');
|
|
}
|
|
|
|
const { uploadUrl, documentId } = body;
|
|
|
|
await fetch(uploadUrl, {
|
|
method: 'PUT',
|
|
headers: {
|
|
'Content-Type': 'application/octet-stream',
|
|
},
|
|
body: '<raw-binary-data>',
|
|
});
|
|
|
|
await client.sendDocument({
|
|
params: {
|
|
id: documentId.toString(),
|
|
},
|
|
body: {},
|
|
});
|
|
};
|
|
|
|
main().catch((error) => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|