mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-15 15:26:59 +10:00
3f050e5213
Replace 12 near-identical try/catch blocks in threads/actions/attachments/messages handlers with a single AnyMiddleware that maps the AGENT_ENVIRONMENT_UNAVAILABLE sentinel to PRECONDITION_FAILED ORPCError. Claude-Session: https://claude.ai/code/session_012Bnvt1MghwHj4qQRxuQUGa
55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import z from "zod";
|
|
import { protectedProcedure } from "../../context";
|
|
import { storageUploadRateLimit } from "../../middleware/rate-limit";
|
|
import { mapAgentEnvironmentError } from "./routing";
|
|
import { agentService } from "./service";
|
|
|
|
function base64ToUint8Array(value: string) {
|
|
return Uint8Array.from(Buffer.from(value, "base64"));
|
|
}
|
|
|
|
export const attachmentsRouter = {
|
|
create: protectedProcedure
|
|
.route({
|
|
method: "POST",
|
|
path: "/agent/attachments",
|
|
tags: ["Agent"],
|
|
operationId: "createAgentAttachment",
|
|
summary: "Create agent attachment",
|
|
})
|
|
.input(
|
|
z.object({
|
|
threadId: z.string(),
|
|
filename: z.string().trim().min(1),
|
|
mediaType: z.string().trim().min(1),
|
|
data: z.string().min(1),
|
|
}),
|
|
)
|
|
.use(storageUploadRateLimit)
|
|
.use(mapAgentEnvironmentError)
|
|
.handler(async ({ context, input }) => {
|
|
return await agentService.attachments.create({
|
|
userId: context.user.id,
|
|
threadId: input.threadId,
|
|
filename: input.filename,
|
|
mediaType: input.mediaType,
|
|
data: base64ToUint8Array(input.data),
|
|
});
|
|
}),
|
|
|
|
delete: protectedProcedure
|
|
.route({
|
|
method: "DELETE",
|
|
path: "/agent/attachments/{id}",
|
|
tags: ["Agent"],
|
|
operationId: "deleteAgentAttachment",
|
|
summary: "Delete agent attachment",
|
|
})
|
|
.input(z.object({ id: z.string() }))
|
|
.output(z.void())
|
|
.use(mapAgentEnvironmentError)
|
|
.handler(async ({ context, input }) => {
|
|
await agentService.attachments.delete({ id: input.id, userId: context.user.id });
|
|
}),
|
|
};
|