d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
377 lines
13 KiB
TypeScript
377 lines
13 KiB
TypeScript
import { z } from 'zod'
|
|
import type {
|
|
ContractBody,
|
|
ContractBodyInput,
|
|
ContractJsonResponse,
|
|
} from '@/lib/api/contracts/types'
|
|
import { defineRouteContract } from '@/lib/api/contracts/types'
|
|
|
|
const asanaUserSummarySchema = z.object({
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
})
|
|
|
|
const asanaCreatedBySchema = asanaUserSummarySchema.extend({
|
|
resource_type: z.string().optional(),
|
|
})
|
|
|
|
const asanaTaskSchema = z.object({
|
|
gid: z.string(),
|
|
resource_type: z.string().optional(),
|
|
resource_subtype: z.string().optional(),
|
|
name: z.string(),
|
|
notes: z.string(),
|
|
completed: z.boolean(),
|
|
assignee: asanaUserSummarySchema.optional(),
|
|
created_by: asanaCreatedBySchema.optional(),
|
|
due_on: z.string().optional(),
|
|
created_at: z.string().optional(),
|
|
modified_at: z.string().optional(),
|
|
})
|
|
|
|
const asanaTaskMutationResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
notes: z.string(),
|
|
completed: z.boolean(),
|
|
created_at: z.string().optional(),
|
|
modified_at: z.string().optional(),
|
|
permalink_url: z.string().optional(),
|
|
})
|
|
|
|
const asanaTasksResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
tasks: z.array(asanaTaskSchema),
|
|
next_page: z.unknown().optional(),
|
|
})
|
|
|
|
const asanaSingleTaskResponseSchema = asanaTaskSchema.extend({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
})
|
|
|
|
const asanaProjectSchema = z.object({
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
resource_type: z.string(),
|
|
})
|
|
|
|
const asanaProjectsResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
projects: z.array(asanaProjectSchema),
|
|
})
|
|
|
|
const asanaCommentResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
gid: z.string(),
|
|
text: z.string(),
|
|
created_at: z.string().optional(),
|
|
created_by: asanaUserSummarySchema.optional(),
|
|
})
|
|
|
|
const asanaGetTaskResponseSchema = z.union([
|
|
asanaSingleTaskResponseSchema,
|
|
asanaTasksResponseSchema,
|
|
])
|
|
|
|
const asanaProjectRecordResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
notes: z.string(),
|
|
archived: z.boolean().optional(),
|
|
color: z.string().nullable().optional(),
|
|
created_at: z.string().optional(),
|
|
modified_at: z.string().optional(),
|
|
permalink_url: z.string().optional(),
|
|
})
|
|
|
|
const asanaWorkspaceSchema = z.object({
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
resource_type: z.string().optional(),
|
|
})
|
|
|
|
const asanaListWorkspacesResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
workspaces: z.array(asanaWorkspaceSchema),
|
|
})
|
|
|
|
const asanaDeleteTaskResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
gid: z.string(),
|
|
deleted: z.literal(true),
|
|
})
|
|
|
|
const asanaAddFollowersResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
followers: z.array(asanaUserSummarySchema),
|
|
})
|
|
|
|
const asanaSectionSchema = z.object({
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
resource_type: z.string().optional(),
|
|
})
|
|
|
|
const asanaSectionResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
gid: z.string(),
|
|
name: z.string(),
|
|
created_at: z.string().optional(),
|
|
})
|
|
|
|
const asanaListSectionsResponseSchema = z.object({
|
|
success: z.literal(true),
|
|
ts: z.string(),
|
|
sections: z.array(asanaSectionSchema),
|
|
})
|
|
|
|
export const asanaAddCommentBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
taskGid: z.string().min(1, 'Task GID is required'),
|
|
text: z.string().min(1, 'Comment text is required'),
|
|
})
|
|
|
|
export const asanaCreateTaskBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
name: z.string().min(1, 'Task name is required'),
|
|
workspace: z.string().min(1, 'Workspace GID is required'),
|
|
notes: z.string().nullish(),
|
|
assignee: z.string().nullish(),
|
|
due_on: z.string().nullish(),
|
|
})
|
|
|
|
export const asanaGetProjectsBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
workspace: z.string().min(1, 'Workspace is required'),
|
|
})
|
|
|
|
export const asanaGetTaskBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
taskGid: z.string().nullish(),
|
|
workspace: z.string().nullish(),
|
|
project: z.string().nullish(),
|
|
limit: z.union([z.string(), z.number()]).nullish(),
|
|
})
|
|
|
|
export const asanaSearchTasksBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
workspace: z.string().min(1, 'Workspace is required'),
|
|
text: z.string().nullish(),
|
|
assignee: z.string().nullish(),
|
|
projects: z.array(z.string()).nullish(),
|
|
completed: z.boolean().nullish(),
|
|
})
|
|
|
|
export const asanaUpdateTaskBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
taskGid: z.string().min(1, 'Task GID is required'),
|
|
name: z.string().nullish(),
|
|
notes: z.string().nullish(),
|
|
assignee: z.string().nullish(),
|
|
completed: z.boolean().nullish(),
|
|
due_on: z.string().nullish(),
|
|
})
|
|
|
|
export const asanaCreateProjectBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
workspace: z.string().min(1, 'Workspace GID is required'),
|
|
name: z.string().min(1, 'Project name is required'),
|
|
notes: z.string().nullish(),
|
|
})
|
|
|
|
export const asanaGetProjectBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
projectGid: z.string().min(1, 'Project GID is required'),
|
|
})
|
|
|
|
export const asanaListWorkspacesBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
})
|
|
|
|
export const asanaCreateSubtaskBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
taskGid: z.string().min(1, 'Parent task GID is required'),
|
|
name: z.string().min(1, 'Subtask name is required'),
|
|
notes: z.string().nullish(),
|
|
assignee: z.string().nullish(),
|
|
due_on: z.string().nullish(),
|
|
})
|
|
|
|
export const asanaDeleteTaskBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
taskGid: z.string().min(1, 'Task GID is required'),
|
|
})
|
|
|
|
export const asanaAddFollowersBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
taskGid: z.string().min(1, 'Task GID is required'),
|
|
followers: z.array(z.string().min(1)).min(1, 'At least one follower GID is required'),
|
|
})
|
|
|
|
export const asanaCreateSectionBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
projectGid: z.string().min(1, 'Project GID is required'),
|
|
name: z.string().min(1, 'Section name is required'),
|
|
})
|
|
|
|
export const asanaListSectionsBodySchema = z.object({
|
|
accessToken: z.string().min(1, 'Access token is required'),
|
|
projectGid: z.string().min(1, 'Project GID is required'),
|
|
})
|
|
|
|
export const asanaAddCommentContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/add-comment',
|
|
body: asanaAddCommentBodySchema,
|
|
response: { mode: 'json', schema: asanaCommentResponseSchema },
|
|
})
|
|
|
|
export const asanaCreateTaskContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/create-task',
|
|
body: asanaCreateTaskBodySchema,
|
|
response: { mode: 'json', schema: asanaTaskMutationResponseSchema },
|
|
})
|
|
|
|
export const asanaGetProjectsContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/get-projects',
|
|
body: asanaGetProjectsBodySchema,
|
|
response: { mode: 'json', schema: asanaProjectsResponseSchema },
|
|
})
|
|
|
|
export const asanaGetTaskContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/get-task',
|
|
body: asanaGetTaskBodySchema,
|
|
response: { mode: 'json', schema: asanaGetTaskResponseSchema },
|
|
})
|
|
|
|
export const asanaSearchTasksContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/search-tasks',
|
|
body: asanaSearchTasksBodySchema,
|
|
response: { mode: 'json', schema: asanaTasksResponseSchema },
|
|
})
|
|
|
|
export const asanaUpdateTaskContract = defineRouteContract({
|
|
method: 'PUT',
|
|
path: '/api/tools/asana/update-task',
|
|
body: asanaUpdateTaskBodySchema,
|
|
response: { mode: 'json', schema: asanaTaskMutationResponseSchema },
|
|
})
|
|
|
|
export const asanaCreateProjectContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/create-project',
|
|
body: asanaCreateProjectBodySchema,
|
|
response: { mode: 'json', schema: asanaProjectRecordResponseSchema },
|
|
})
|
|
|
|
export const asanaGetProjectContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/get-project',
|
|
body: asanaGetProjectBodySchema,
|
|
response: { mode: 'json', schema: asanaProjectRecordResponseSchema },
|
|
})
|
|
|
|
export const asanaListWorkspacesContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/list-workspaces',
|
|
body: asanaListWorkspacesBodySchema,
|
|
response: { mode: 'json', schema: asanaListWorkspacesResponseSchema },
|
|
})
|
|
|
|
export const asanaCreateSubtaskContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/create-subtask',
|
|
body: asanaCreateSubtaskBodySchema,
|
|
response: { mode: 'json', schema: asanaTaskMutationResponseSchema },
|
|
})
|
|
|
|
export const asanaDeleteTaskContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/delete-task',
|
|
body: asanaDeleteTaskBodySchema,
|
|
response: { mode: 'json', schema: asanaDeleteTaskResponseSchema },
|
|
})
|
|
|
|
export const asanaAddFollowersContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/add-followers',
|
|
body: asanaAddFollowersBodySchema,
|
|
response: { mode: 'json', schema: asanaAddFollowersResponseSchema },
|
|
})
|
|
|
|
export const asanaCreateSectionContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/create-section',
|
|
body: asanaCreateSectionBodySchema,
|
|
response: { mode: 'json', schema: asanaSectionResponseSchema },
|
|
})
|
|
|
|
export const asanaListSectionsContract = defineRouteContract({
|
|
method: 'POST',
|
|
path: '/api/tools/asana/list-sections',
|
|
body: asanaListSectionsBodySchema,
|
|
response: { mode: 'json', schema: asanaListSectionsResponseSchema },
|
|
})
|
|
|
|
export type AsanaCreateProjectBody = ContractBody<typeof asanaCreateProjectContract>
|
|
export type AsanaCreateProjectBodyInput = ContractBodyInput<typeof asanaCreateProjectContract>
|
|
export type AsanaCreateProjectResponse = ContractJsonResponse<typeof asanaCreateProjectContract>
|
|
export type AsanaGetProjectBody = ContractBody<typeof asanaGetProjectContract>
|
|
export type AsanaGetProjectBodyInput = ContractBodyInput<typeof asanaGetProjectContract>
|
|
export type AsanaGetProjectResponse = ContractJsonResponse<typeof asanaGetProjectContract>
|
|
export type AsanaListWorkspacesBody = ContractBody<typeof asanaListWorkspacesContract>
|
|
export type AsanaListWorkspacesBodyInput = ContractBodyInput<typeof asanaListWorkspacesContract>
|
|
export type AsanaListWorkspacesResponse = ContractJsonResponse<typeof asanaListWorkspacesContract>
|
|
export type AsanaCreateSubtaskBody = ContractBody<typeof asanaCreateSubtaskContract>
|
|
export type AsanaCreateSubtaskBodyInput = ContractBodyInput<typeof asanaCreateSubtaskContract>
|
|
export type AsanaCreateSubtaskResponse = ContractJsonResponse<typeof asanaCreateSubtaskContract>
|
|
export type AsanaDeleteTaskBody = ContractBody<typeof asanaDeleteTaskContract>
|
|
export type AsanaDeleteTaskBodyInput = ContractBodyInput<typeof asanaDeleteTaskContract>
|
|
export type AsanaDeleteTaskResponse = ContractJsonResponse<typeof asanaDeleteTaskContract>
|
|
export type AsanaAddFollowersBody = ContractBody<typeof asanaAddFollowersContract>
|
|
export type AsanaAddFollowersBodyInput = ContractBodyInput<typeof asanaAddFollowersContract>
|
|
export type AsanaAddFollowersResponse = ContractJsonResponse<typeof asanaAddFollowersContract>
|
|
export type AsanaCreateSectionBody = ContractBody<typeof asanaCreateSectionContract>
|
|
export type AsanaCreateSectionBodyInput = ContractBodyInput<typeof asanaCreateSectionContract>
|
|
export type AsanaCreateSectionResponse = ContractJsonResponse<typeof asanaCreateSectionContract>
|
|
export type AsanaListSectionsBody = ContractBody<typeof asanaListSectionsContract>
|
|
export type AsanaListSectionsBodyInput = ContractBodyInput<typeof asanaListSectionsContract>
|
|
export type AsanaListSectionsResponse = ContractJsonResponse<typeof asanaListSectionsContract>
|
|
|
|
export type AsanaAddCommentBody = ContractBody<typeof asanaAddCommentContract>
|
|
export type AsanaAddCommentBodyInput = ContractBodyInput<typeof asanaAddCommentContract>
|
|
export type AsanaAddCommentResponse = ContractJsonResponse<typeof asanaAddCommentContract>
|
|
export type AsanaCreateTaskBody = ContractBody<typeof asanaCreateTaskContract>
|
|
export type AsanaCreateTaskBodyInput = ContractBodyInput<typeof asanaCreateTaskContract>
|
|
export type AsanaCreateTaskResponse = ContractJsonResponse<typeof asanaCreateTaskContract>
|
|
export type AsanaGetProjectsBody = ContractBody<typeof asanaGetProjectsContract>
|
|
export type AsanaGetProjectsBodyInput = ContractBodyInput<typeof asanaGetProjectsContract>
|
|
export type AsanaGetProjectsResponse = ContractJsonResponse<typeof asanaGetProjectsContract>
|
|
export type AsanaGetTaskBody = ContractBody<typeof asanaGetTaskContract>
|
|
export type AsanaGetTaskBodyInput = ContractBodyInput<typeof asanaGetTaskContract>
|
|
export type AsanaGetTaskResponse = ContractJsonResponse<typeof asanaGetTaskContract>
|
|
export type AsanaSearchTasksBody = ContractBody<typeof asanaSearchTasksContract>
|
|
export type AsanaSearchTasksBodyInput = ContractBodyInput<typeof asanaSearchTasksContract>
|
|
export type AsanaSearchTasksResponse = ContractJsonResponse<typeof asanaSearchTasksContract>
|
|
export type AsanaUpdateTaskBody = ContractBody<typeof asanaUpdateTaskContract>
|
|
export type AsanaUpdateTaskBodyInput = ContractBodyInput<typeof asanaUpdateTaskContract>
|
|
export type AsanaUpdateTaskResponse = ContractJsonResponse<typeof asanaUpdateTaskContract>
|