mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 08:13:56 +10:00
chore: add examples
This commit is contained in:
59
packages/api/v1/examples/01-create-and-send-document.ts
Normal file
59
packages/api/v1/examples/01-create-and-send-document.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { status, body } = await client.createDocument({
|
||||||
|
body: {
|
||||||
|
title: 'My Document',
|
||||||
|
recipients: [
|
||||||
|
{
|
||||||
|
name: 'John Doe',
|
||||||
|
email: 'john@example.com',
|
||||||
|
role: 'SIGNER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Jane Doe',
|
||||||
|
email: 'jane@example.com',
|
||||||
|
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(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
43
packages/api/v1/examples/02-add-a-field.ts
Normal file
43
packages/api/v1/examples/02-add-a-field.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentId = '1';
|
||||||
|
const recipientId = 1;
|
||||||
|
|
||||||
|
const { status, body } = await client.createField({
|
||||||
|
params: {
|
||||||
|
id: documentId,
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
type: 'SIGNATURE',
|
||||||
|
pageHeight: 2.5, // percent of page to occupy in height
|
||||||
|
pageWidth: 5, // percent of page to occupy in width
|
||||||
|
pageX: 10, // percent from left
|
||||||
|
pageY: 10, // percent from top
|
||||||
|
pageNumber: 1,
|
||||||
|
recipientId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to create field');
|
||||||
|
}
|
||||||
|
|
||||||
|
const { id: fieldId } = body;
|
||||||
|
|
||||||
|
console.log(`Field created with id: ${fieldId}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
39
packages/api/v1/examples/03-update-a-field.ts
Normal file
39
packages/api/v1/examples/03-update-a-field.ts
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentId = '1';
|
||||||
|
const fieldId = '1';
|
||||||
|
|
||||||
|
const { status } = await client.updateField({
|
||||||
|
params: {
|
||||||
|
id: documentId,
|
||||||
|
fieldId,
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
type: 'SIGNATURE',
|
||||||
|
pageHeight: 2.5, // percent of page to occupy in height
|
||||||
|
pageWidth: 5, // percent of page to occupy in width
|
||||||
|
pageX: 10, // percent from left
|
||||||
|
pageY: 10, // percent from top
|
||||||
|
pageNumber: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to update field');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
31
packages/api/v1/examples/04-remove-a-field.ts
Normal file
31
packages/api/v1/examples/04-remove-a-field.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentId = '1';
|
||||||
|
const fieldId = '1';
|
||||||
|
|
||||||
|
const { status } = await client.deleteField({
|
||||||
|
params: {
|
||||||
|
id: documentId,
|
||||||
|
fieldId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to remove field');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
38
packages/api/v1/examples/05-add-a-recipient.ts
Normal file
38
packages/api/v1/examples/05-add-a-recipient.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentId = '1';
|
||||||
|
|
||||||
|
const { status, body } = await client.createRecipient({
|
||||||
|
params: {
|
||||||
|
id: documentId,
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
name: 'John Doe',
|
||||||
|
email: 'john@example.com',
|
||||||
|
role: 'APPROVER',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to add recipient');
|
||||||
|
}
|
||||||
|
|
||||||
|
const { id: recipientId } = body;
|
||||||
|
|
||||||
|
console.log(`Recipient added with id: ${recipientId}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
34
packages/api/v1/examples/06-update-a-recipient.ts
Normal file
34
packages/api/v1/examples/06-update-a-recipient.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentId = '1';
|
||||||
|
const recipientId = '1';
|
||||||
|
|
||||||
|
const { status } = await client.updateRecipient({
|
||||||
|
params: {
|
||||||
|
id: documentId,
|
||||||
|
recipientId,
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
name: 'Johnathon Doe',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to update recipient');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
31
packages/api/v1/examples/07-remove-a-recipient.ts
Normal file
31
packages/api/v1/examples/07-remove-a-recipient.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentId = '1';
|
||||||
|
const recipientId = '1';
|
||||||
|
|
||||||
|
const { status } = await client.deleteRecipient({
|
||||||
|
params: {
|
||||||
|
id: documentId,
|
||||||
|
recipientId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to update recipient');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
31
packages/api/v1/examples/08-get-a-document.ts
Normal file
31
packages/api/v1/examples/08-get-a-document.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentId = '1';
|
||||||
|
|
||||||
|
const { status, body } = await client.getDocument({
|
||||||
|
params: {
|
||||||
|
id: documentId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to get document');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Got document with id: ${documentId} and title: ${body.title}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
37
packages/api/v1/examples/09-paginate-all-documents.ts
Normal file
37
packages/api/v1/examples/09-paginate-all-documents.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { initClient } from '@ts-rest/core';
|
||||||
|
|
||||||
|
import { ApiContractV1 } from '../contract';
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
const client = initClient(ApiContractV1, {
|
||||||
|
baseUrl: 'http://localhost:3000/api/v1',
|
||||||
|
baseHeaders: {
|
||||||
|
authorization: 'Bearer <my-token>',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const page = 1;
|
||||||
|
const perPage = 10;
|
||||||
|
|
||||||
|
const { status, body } = await client.getDocuments({
|
||||||
|
query: {
|
||||||
|
page,
|
||||||
|
perPage,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status !== 200) {
|
||||||
|
throw new Error('Failed to get documents');
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const document of body.documents) {
|
||||||
|
console.log(`Got document with id: ${document.id} and title: ${document.title}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Total documents: ${body.totalPages * perPage}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
@ -12,8 +12,8 @@ import {
|
|||||||
* Documents
|
* Documents
|
||||||
*/
|
*/
|
||||||
export const ZGetDocumentsQuerySchema = z.object({
|
export const ZGetDocumentsQuerySchema = z.object({
|
||||||
page: z.string().optional(),
|
page: z.number().min(1).optional().default(1),
|
||||||
perPage: z.string().optional(),
|
perPage: z.number().min(1).optional().default(1),
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TGetDocumentsQuerySchema = z.infer<typeof ZGetDocumentsQuerySchema>;
|
export type TGetDocumentsQuerySchema = z.infer<typeof ZGetDocumentsQuerySchema>;
|
||||||
@ -55,13 +55,15 @@ export const ZCreateDocumentMutationSchema = z.object({
|
|||||||
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
meta: z.object({
|
meta: z
|
||||||
|
.object({
|
||||||
subject: z.string(),
|
subject: z.string(),
|
||||||
message: z.string(),
|
message: z.string(),
|
||||||
timezone: z.string(),
|
timezone: z.string(),
|
||||||
dateFormat: z.string(),
|
dateFormat: z.string(),
|
||||||
redirectUrl: z.string(),
|
redirectUrl: z.string(),
|
||||||
}),
|
})
|
||||||
|
.partial(),
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TCreateDocumentMutationSchema = z.infer<typeof ZCreateDocumentMutationSchema>;
|
export type TCreateDocumentMutationSchema = z.infer<typeof ZCreateDocumentMutationSchema>;
|
||||||
@ -142,6 +144,7 @@ export const ZDeleteFieldMutationSchema = null;
|
|||||||
export type TDeleteFieldMutationSchema = typeof ZDeleteFieldMutationSchema;
|
export type TDeleteFieldMutationSchema = typeof ZDeleteFieldMutationSchema;
|
||||||
|
|
||||||
export const ZSuccessfulFieldResponseSchema = z.object({
|
export const ZSuccessfulFieldResponseSchema = z.object({
|
||||||
|
id: z.number(),
|
||||||
documentId: z.number(),
|
documentId: z.number(),
|
||||||
recipientId: z.number(),
|
recipientId: z.number(),
|
||||||
type: z.nativeEnum(FieldType),
|
type: z.nativeEnum(FieldType),
|
||||||
|
|||||||
Reference in New Issue
Block a user