Files
overleaf-cep/services/chat/app/js/Features/Messages/MessageHttpSchemas.js
T
Jakob Ackermann 2e8f6f0d03 [chat] adopt strict zod types (#36102)
GitOrigin-RevId: eb3e245599f5db2d29366ce5d8e0993ec6b20338
2026-09-17 11:48:40 +00:00

99 lines
2.8 KiB
JavaScript

import { z, zz } from '@overleaf/validation-tools'
export const MAX_MESSAGE_LENGTH = 10 * 1024 // 10kb, about 1,500 words
const DEFAULT_MESSAGE_LIMIT = 50
const projectParams = z.strictObject({ projectId: zz.objectId() })
const threadParams = projectParams.extend({ threadId: zz.objectId() })
const messageParams = projectParams.extend({ messageId: zz.objectId() })
const threadMessageParams = threadParams.extend({ messageId: zz.objectId() })
const userMessageParams = threadMessageParams.extend({ userId: zz.objectId() })
const messageContent = z
.string({ error: 'No content provided' })
.min(1, 'No content provided')
.max(MAX_MESSAGE_LENGTH, `Content too long (> ${MAX_MESSAGE_LENGTH} bytes)`)
const sendMessageBody = z.strictObject({
user_id: zz.objectId(),
content: messageContent,
})
// web sends `userId` (camelCase) when editing, unlike `user_id` when sending.
const editMessageBody = z.strictObject({
content: messageContent,
userId: zz.objectId().optional(),
})
const threadsBody = z.strictObject({ threads: z.array(zz.objectId()) })
export const getGlobalMessages = z.object({
params: projectParams,
query: z.strictObject({
before: z.coerce.number().int().optional(),
limit: z.coerce.number().int().default(DEFAULT_MESSAGE_LIMIT),
}),
})
export const sendGlobalMessage = z.object({
params: projectParams,
body: sendMessageBody,
})
export const getGlobalMessage = z.object({ params: messageParams })
export const deleteGlobalMessage = z.object({ params: messageParams })
export const editGlobalMessage = z.object({
params: messageParams,
body: editMessageBody,
})
export const sendMessage = z.object({
params: threadParams,
body: sendMessageBody,
})
export const getThreadMessage = z.object({ params: threadMessageParams })
export const deleteMessage = z.object({ params: threadMessageParams })
export const editMessage = z.object({
params: threadMessageParams,
body: editMessageBody,
})
export const deleteUserMessage = z.object({ params: userMessageParams })
export const resolveThread = z.object({
params: threadParams,
body: z.strictObject({ user_id: zz.objectId() }),
})
export const reopenThread = z.object({ params: threadParams })
export const getThread = z.object({ params: threadParams })
export const deleteThread = z.object({ params: threadParams })
export const getThreads = z.object({ params: projectParams })
export const getResolvedThreadIds = z.object({ params: projectParams })
export const destroyProject = z.object({ params: projectParams })
export const duplicateCommentThreads = z.object({
params: projectParams,
body: threadsBody,
})
export const generateThreadData = z.object({
params: projectParams,
body: threadsBody,
})
export const cloneCommentThreads = z.object({
params: projectParams,
body: z.strictObject({ targetProjectId: zz.objectId() }),
})