From b6d2e87d92a38978730db35a4034aa926fb318b2 Mon Sep 17 00:00:00 2001 From: gmy Date: Wed, 20 May 2026 14:53:21 +0800 Subject: [PATCH] fix(api): add Fastify request type augmentation to eliminate `as any` casts Add `packages/api/src/types/fastify.d.ts` to extend the Fastify `FastifyRequest` interface with `user`, `authSession`, and `workspaceMember` properties that middleware attaches at runtime. This replaces all `(request as any).user`, `(request as any).authSession`, and `(request as any).workspaceMember` casts across 20 files with direct typed property access, giving TypeScript visibility into these fields for autocompletion, rename refactors, and compile-time safety. No runtime behaviour changes. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/infrastructure/middleware/audit.ts | 6 +-- .../api/src/infrastructure/middleware/auth.ts | 6 +-- .../infrastructure/middleware/workspace.ts | 6 +-- packages/api/src/modules/access/service.ts | 4 +- packages/api/src/modules/auth/controller.ts | 26 +++++------ .../api/src/modules/automation/controller.ts | 18 ++++---- packages/api/src/modules/chat/controller.ts | 2 +- packages/api/src/modules/files/controller.ts | 10 ++-- packages/api/src/modules/im/controller.ts | 12 ++--- .../api/src/modules/mcp-plugins/controller.ts | 12 ++--- .../modules/mcp-plugins/relay-controller.ts | 6 +-- packages/api/src/modules/memory/controller.ts | 2 +- .../src/modules/model-groups/controller.ts | 46 +++++++++---------- .../src/modules/organization/controller.ts | 10 ++-- .../api/src/modules/platform/controller.ts | 4 +- .../src/modules/relationship/controller.ts | 44 +++++++++--------- .../src/modules/remote-agents/controller.ts | 2 +- .../api/src/modules/session/controller.ts | 10 ++-- packages/api/src/modules/skills/controller.ts | 12 ++--- .../api/src/modules/workspace/controller.ts | 20 ++++---- packages/api/src/types/fastify.d.ts | 17 +++++++ 21 files changed, 146 insertions(+), 129 deletions(-) create mode 100644 packages/api/src/types/fastify.d.ts diff --git a/packages/api/src/infrastructure/middleware/audit.ts b/packages/api/src/infrastructure/middleware/audit.ts index 65bd2cdd..111c9ad0 100644 --- a/packages/api/src/infrastructure/middleware/audit.ts +++ b/packages/api/src/infrastructure/middleware/audit.ts @@ -15,11 +15,11 @@ export function auditMiddleware(app: FastifyInstance) { await db .insertInto("audit_logs") .values({ - workspace_id: (request.params as any)?.workspaceId || null, - user_id: (request as any).user?.userId || null, + workspace_id: (request.params as { workspaceId?: string })?.workspaceId || null, + user_id: request.user?.userId || null, action, resource_type: deriveResourceType(request.url), - resource_id: (request.params as any)?.id || null, + resource_id: (request.params as { id?: string })?.id || null, details: { method: request.method, url: request.url, diff --git a/packages/api/src/infrastructure/middleware/auth.ts b/packages/api/src/infrastructure/middleware/auth.ts index 4a90a327..8b4fb9b3 100644 --- a/packages/api/src/infrastructure/middleware/auth.ts +++ b/packages/api/src/infrastructure/middleware/auth.ts @@ -5,11 +5,11 @@ import { authenticateRequestSession } from "../../modules/auth/service.js" async function attachAuthenticatedRequest(request: FastifyRequest) { const authenticated = await authenticateRequestSession(request) if (!authenticated) return null - ;(request as any).user = { + request.user = { userId: authenticated.user.id, email: authenticated.user.email, } - ;(request as any).authSession = authenticated.session + request.authSession = authenticated.session return authenticated } @@ -36,5 +36,5 @@ export async function optionalAuth(request: FastifyRequest) { } export function getUserId(request: FastifyRequest): string { - return (request as any).user?.userId + return request.user?.userId ?? "" } diff --git a/packages/api/src/infrastructure/middleware/workspace.ts b/packages/api/src/infrastructure/middleware/workspace.ts index 0dfa20e9..093c8f99 100644 --- a/packages/api/src/infrastructure/middleware/workspace.ts +++ b/packages/api/src/infrastructure/middleware/workspace.ts @@ -6,12 +6,12 @@ export async function workspaceMiddleware( request: FastifyRequest, reply: FastifyReply ) { - const workspaceId = (request.params as any).workspaceId + const workspaceId = (request.params as { workspaceId?: string }).workspaceId if (!workspaceId) { return reply.status(400).send({ error: "Workspace ID is required" }) } - const user = (request as any).user + const user = request.user if (!user) { return reply.status(401).send({ error: "Authentication required" }) } @@ -23,7 +23,7 @@ export async function workspaceMiddleware( .where("user_id", "=", user.userId) .executeTakeFirst() - ;(request as any).workspaceMember = member ?? null + request.workspaceMember = member ?? null const allowed = await requireRequestAction( request, diff --git a/packages/api/src/modules/access/service.ts b/packages/api/src/modules/access/service.ts index 9b6cb0bf..c2a3020a 100644 --- a/packages/api/src/modules/access/service.ts +++ b/packages/api/src/modules/access/service.ts @@ -46,7 +46,7 @@ export async function resolveWorkspaceAccessSubject( } export function getRequestUserId(request: FastifyRequest): string { - const userId = (request as any).user?.userId as string | undefined + const userId = request.user?.userId as string | undefined if (!userId) { throw new Error("Authenticated user is missing from request") } @@ -60,7 +60,7 @@ export function getRequestUserSubject(request: FastifyRequest): AccessSubject { export function getRequestAccessSubject( request: FastifyRequest ): AccessSubject { - const workspaceMemberId = (request as any).workspaceMember?.id as + const workspaceMemberId = request.workspaceMember?.id as | string | undefined if (workspaceMemberId) { diff --git a/packages/api/src/modules/auth/controller.ts b/packages/api/src/modules/auth/controller.ts index 31011b96..0a76e002 100644 --- a/packages/api/src/modules/auth/controller.ts +++ b/packages/api/src/modules/auth/controller.ts @@ -247,7 +247,7 @@ export function registerAuthRoutes(app: FastifyInstance) { .send( await authService.resolveQrLoginRequest( body.token, - (request as any).user.userId + request.user.userId ) ) } catch (error) { @@ -267,7 +267,7 @@ export function registerAuthRoutes(app: FastifyInstance) { .send( await authService.approveQrLoginRequest( body.token, - (request as any).user.userId, + request.user.userId, body.sessionPersistence ?? "persistent" ) ) @@ -288,7 +288,7 @@ export function registerAuthRoutes(app: FastifyInstance) { .send( await authService.rejectQrLoginRequest( body.token, - (request as any).user.userId + request.user.userId ) ) } catch (error) { @@ -335,7 +335,7 @@ export function registerAuthRoutes(app: FastifyInstance) { { preHandler: [authMiddleware] }, async (request: FastifyRequest, reply: FastifyReply) => { try { - const currentSession = (request as any).authSession + const currentSession = request.authSession await authService.logoutCurrentSession(currentSession.id) clearSessionCookie(reply) return reply.status(204).send() @@ -350,7 +350,7 @@ export function registerAuthRoutes(app: FastifyInstance) { { preHandler: [authMiddleware] }, async (request: FastifyRequest, reply: FastifyReply) => { try { - await authService.logoutAllSessions((request as any).user.userId) + await authService.logoutAllSessions(request.user.userId) clearSessionCookie(reply) return reply.status(204).send() } catch (error) { @@ -365,8 +365,8 @@ export function registerAuthRoutes(app: FastifyInstance) { async (request: FastifyRequest, reply: FastifyReply) => { try { return reply.status(200).send({ - user: await authService.getProfile((request as any).user.userId), - session: (request as any).authSession, + user: await authService.getProfile(request.user.userId), + session: request.authSession, }) } catch (error) { return handleAuthError(error, reply) @@ -381,11 +381,11 @@ export function registerAuthRoutes(app: FastifyInstance) { try { const body = updateMeSchema.parse(request.body) return reply.status(200).send({ - user: await authService.updateProfile((request as any).user.userId, { + user: await authService.updateProfile(request.user.userId, { name: body.name, avatarFileId: body.avatarFileId, }), - session: (request as any).authSession, + session: request.authSession, }) } catch (error) { return handleAuthError(error, reply) @@ -400,8 +400,8 @@ export function registerAuthRoutes(app: FastifyInstance) { try { return reply.status(200).send({ sessions: await authService.listSessions( - (request as any).user.userId, - (request as any).authSession.id + request.user.userId, + request.authSession.id ), }) } catch (error) { @@ -416,9 +416,9 @@ export function registerAuthRoutes(app: FastifyInstance) { async (request: FastifyRequest, reply: FastifyReply) => { try { const params = sessionParamsSchema.parse(request.params) - const currentSessionId = (request as any).authSession.id as string + const currentSessionId = request.authSession.id as string await authService.revokeSessionForUser( - (request as any).user.userId, + request.user.userId, params.sessionId ) diff --git a/packages/api/src/modules/automation/controller.ts b/packages/api/src/modules/automation/controller.ts index ed16ca76..ed379297 100644 --- a/packages/api/src/modules/automation/controller.ts +++ b/packages/api/src/modules/automation/controller.ts @@ -314,7 +314,7 @@ export default async function automationController(app: FastifyInstance) { if (!allowed) return const body = eventSourceSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string const source = await createAutomationEventSource( workspaceId, { kind: "workspace_member", workspaceMemberId }, @@ -390,7 +390,7 @@ export default async function automationController(app: FastifyInstance) { if (!allowed) return const body = accessGrantSchema.parse(request.body || {}) - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string const grant = await grantAutomationEventSourceAccess({ workspaceId, eventSourceId, @@ -450,7 +450,7 @@ export default async function automationController(app: FastifyInstance) { ) if (!allowed) return - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string await revokeAutomationEventSourceAccess({ workspaceId, eventSourceId, @@ -502,7 +502,7 @@ export default async function automationController(app: FastifyInstance) { if (!allowed) return const body = updateEventSourceSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string return updateAutomationEventSource( workspaceId, eventSourceId, @@ -529,7 +529,7 @@ export default async function automationController(app: FastifyInstance) { ) if (!allowed) return - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string await archiveAutomationEventSource(workspaceId, eventSourceId, { workspaceMemberId, }) @@ -628,7 +628,7 @@ export default async function automationController(app: FastifyInstance) { issues, }) } - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string const automation = await createAutomationRule( workspaceId, { kind: "workspace_member", workspaceMemberId }, @@ -681,7 +681,7 @@ export default async function automationController(app: FastifyInstance) { if (!allowed) return const body = updateAutomationSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string try { const automation = await updateAutomationRule( workspaceId, @@ -722,7 +722,7 @@ export default async function automationController(app: FastifyInstance) { ) if (!allowed) return - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string await deleteAutomationRule(workspaceId, automationId, { workspaceMemberId, }) @@ -784,7 +784,7 @@ export default async function automationController(app: FastifyInstance) { if (!allowed) return const body = createWebhookEndpointSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string const created = await createAutomationWebhookEndpoint( workspaceId, workspaceMemberId, diff --git a/packages/api/src/modules/chat/controller.ts b/packages/api/src/modules/chat/controller.ts index 75f41f09..452db64b 100644 --- a/packages/api/src/modules/chat/controller.ts +++ b/packages/api/src/modules/chat/controller.ts @@ -149,7 +149,7 @@ const resolveInteractionSchema = z.union([ ]) function getRequestUserId(request: any) { - return (request as any).user!.userId as string + return request.user!.userId as string } async function resolveRequestWorkspaceMemberId( diff --git a/packages/api/src/modules/files/controller.ts b/packages/api/src/modules/files/controller.ts index 66f7c9f8..2fe0b318 100644 --- a/packages/api/src/modules/files/controller.ts +++ b/packages/api/src/modules/files/controller.ts @@ -63,7 +63,7 @@ export async function filesUploadController(app: FastifyInstance) { Params: { workspaceId: string } }>("/workspaces/:workspaceId/files", async (request, reply) => { const { workspaceId } = request.params - const userId = (request as any).user!.userId + const userId = request.user!.userId let filePart: Awaited> | null = null let originInput: FileCreateOriginInput | null = null @@ -132,7 +132,7 @@ export async function filesReadController(app: FastifyInstance) { app.get<{ Params: { fileId: string } }>("/files/:fileId/info", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const detail = await getFileDetail(request.params.fileId) if (!detail) { return reply.status(404).send({ error: "File not found" }) @@ -152,7 +152,7 @@ export async function filesReadController(app: FastifyInstance) { app.get<{ Params: { fileId: string } }>("/files/:fileId/parses/latest", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const detail = await getFileDetail(request.params.fileId) if (!detail) { return reply.status(404).send({ error: "File not found" }) @@ -177,7 +177,7 @@ export async function filesReadController(app: FastifyInstance) { app.post<{ Params: { fileId: string } }>("/files/:fileId/parses", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const detail = await getFileDetail(request.params.fileId) if (!detail) { return reply.status(404).send({ error: "File not found" }) @@ -207,7 +207,7 @@ export async function filesReadController(app: FastifyInstance) { app.get<{ Params: { fileId: string } }>("/files/:fileId", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const info = await getFileRecord(request.params.fileId) if (!info) { return reply.status(404).send({ error: "File not found" }) diff --git a/packages/api/src/modules/im/controller.ts b/packages/api/src/modules/im/controller.ts index 97438c92..31a88f06 100644 --- a/packages/api/src/modules/im/controller.ts +++ b/packages/api/src/modules/im/controller.ts @@ -417,7 +417,7 @@ export default async function imController(app: FastifyInstance) { const binding = await getCurrentUserWeixinBinding({ workspaceId: request.params.workspaceId, - userId: (request as any).user!.userId, + userId: request.user!.userId, }) return reply.send({ binding }) } @@ -451,8 +451,8 @@ export default async function imController(app: FastifyInstance) { if (!allowed) return const { workspaceId } = request.params - const workspaceMemberId = (request as any).workspaceMember?.id as string - const userId = (request as any).user!.userId as string + const workspaceMemberId = request.workspaceMember?.id as string + const userId = request.user!.userId as string const existing = await getCurrentUserWeixinBinding({ workspaceId, userId, @@ -485,7 +485,7 @@ export default async function imController(app: FastifyInstance) { if (!allowed) return const { workspaceId, sessionId } = request.params - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const owner = getWeixinQrLoginSessionOwner({ workspaceId, sessionId }) if ( !owner || @@ -520,7 +520,7 @@ export default async function imController(app: FastifyInstance) { try { const binding = await linkCurrentUserWeixinBinding({ workspaceId: request.params.workspaceId, - userId: (request as any).user!.userId, + userId: request.user!.userId, }) return reply.send({ binding }) } catch (error) { @@ -555,7 +555,7 @@ export default async function imController(app: FastifyInstance) { const body = bindingAutoLinkSchema.parse(request.body) const binding = await setCurrentUserWeixinBindingAutoLink({ workspaceId: request.params.workspaceId, - userId: (request as any).user!.userId, + userId: request.user!.userId, targetWorkspaceMemberId: body.workspaceMemberId, }) return reply.send({ binding }) diff --git a/packages/api/src/modules/mcp-plugins/controller.ts b/packages/api/src/modules/mcp-plugins/controller.ts index d3a0e104..c2614a43 100644 --- a/packages/api/src/modules/mcp-plugins/controller.ts +++ b/packages/api/src/modules/mcp-plugins/controller.ts @@ -249,7 +249,7 @@ export function registerMcpPluginRoutes(app: FastifyInstance) { bindingKey: string } const body = startAuthSchema.parse(request.body || {}) - const workspaceMember = (request as any).workspaceMember + const workspaceMember = request.workspaceMember const result = await startPluginAuthSession({ workspaceId, pluginId, @@ -283,7 +283,7 @@ export function registerMcpPluginRoutes(app: FastifyInstance) { workspaceId: string sessionId: string } - const workspaceMember = (request as any).workspaceMember + const workspaceMember = request.workspaceMember reply.send({ session: await getPluginAuthSession( sessionId, @@ -314,7 +314,7 @@ export function registerMcpPluginRoutes(app: FastifyInstance) { workspaceId: string sessionId: string } - const workspaceMember = (request as any).workspaceMember + const workspaceMember = request.workspaceMember reply.send( await inspectPluginAuthSession({ workspaceId, @@ -471,7 +471,7 @@ export function registerMcpPluginRoutes(app: FastifyInstance) { lifecycleScope: body.lifecycleScope, configData: body.configData, authSessionIds: body.authSessionIds, - installedByWorkspaceMemberId: (request as any).workspaceMember!.id, + installedByWorkspaceMemberId: request.workspaceMember!.id, }) reply.status(201).send(installation) } catch (error) { @@ -516,7 +516,7 @@ export function registerMcpPluginRoutes(app: FastifyInstance) { const installation = await updateInstallation(installId, { ...body, - updatedByWorkspaceMemberId: (request as any).workspaceMember!.id, + updatedByWorkspaceMemberId: request.workspaceMember!.id, }) reply.send(installation) } catch (error) { @@ -598,7 +598,7 @@ export function registerMcpPluginRoutes(app: FastifyInstance) { accessTarget: body.accessTarget, conversationTypeMaskOverride: body.conversationTypeMaskOverride, reason: body.reason, - grantedByWorkspaceMemberId: (request as any).workspaceMember!.id, + grantedByWorkspaceMemberId: request.workspaceMember!.id, }) reply.status(201).send({ grant }) diff --git a/packages/api/src/modules/mcp-plugins/relay-controller.ts b/packages/api/src/modules/mcp-plugins/relay-controller.ts index ebef44ce..58d8960d 100644 --- a/packages/api/src/modules/mcp-plugins/relay-controller.ts +++ b/packages/api/src/modules/mcp-plugins/relay-controller.ts @@ -1476,8 +1476,8 @@ export function registerRelayRoutes(app: FastifyInstance) { const { workspaceId } = request.params as WorkspaceParams const body = createPairingSchema.parse(request.body) - const userId = (request as any).user.userId as string - const workspaceMemberId = (request as any).workspaceMember?.id as + const userId = request.user.userId as string + const workspaceMemberId = request.workspaceMember?.id as | string | undefined if (!workspaceMemberId) { @@ -1696,7 +1696,7 @@ export function registerRelayRoutes(app: FastifyInstance) { accessTarget: body.accessTarget, conversationTypeMaskOverride: body.conversationTypeMaskOverride, reason: body.reason, - grantedByWorkspaceMemberId: (request as any).workspaceMember!.id, + grantedByWorkspaceMemberId: request.workspaceMember!.id, }) reply.status(201).send({ grant }) diff --git a/packages/api/src/modules/memory/controller.ts b/packages/api/src/modules/memory/controller.ts index ec9e756a..6665f5eb 100644 --- a/packages/api/src/modules/memory/controller.ts +++ b/packages/api/src/modules/memory/controller.ts @@ -210,7 +210,7 @@ async function requireMemorySpaceWritePermission( >, errorMessage: string ) { - const workspaceMemberId = (request as any).workspaceMember?.id as + const workspaceMemberId = request.workspaceMember?.id as | string | undefined const { workspaceId } = request.params as { workspaceId: string } diff --git a/packages/api/src/modules/model-groups/controller.ts b/packages/api/src/modules/model-groups/controller.ts index 80821c6a..3e5b8f28 100644 --- a/packages/api/src/modules/model-groups/controller.ts +++ b/packages/api/src/modules/model-groups/controller.ts @@ -250,7 +250,7 @@ async function requireWorkspaceMemberOwnedGroup( request: FastifyRequest<{ Params: { workspaceId: string; groupId: string } }>, reply: FastifyReply ) { - const workspaceMemberId = (request as any).workspaceMember?.id as + const workspaceMemberId = request.workspaceMember?.id as | string | undefined if (!workspaceMemberId) { @@ -313,7 +313,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { const { workspaceId } = request.params as { workspaceId: string } const body = createGroupSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const group = await createModelGroup({ ...body, ownerType: "workspace", @@ -348,7 +348,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -387,7 +387,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!scopedGroup) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, scopedGroup.id, @@ -428,7 +428,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!scopedGroup) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, scopedGroup.id, @@ -468,7 +468,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -508,7 +508,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -552,7 +552,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -593,7 +593,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -637,7 +637,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -679,7 +679,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -720,7 +720,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -941,7 +941,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const userId = (request as any).user.userId + const userId = request.user.userId const groupAllowed = await requireModelGroupPermission( userId, group.id, @@ -979,7 +979,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const userId = (request as any).user.userId + const userId = request.user.userId const groupAllowed = await requireModelGroupPermission( userId, group.id, @@ -1101,7 +1101,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const userId = (request as any).user.userId + const userId = request.user.userId const groupAllowed = await requireModelGroupPermission( userId, group.id, @@ -1141,7 +1141,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const userId = (request as any).user.userId + const userId = request.user.userId const groupAllowed = await requireModelGroupPermission( userId, group.id, @@ -1180,7 +1180,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const userId = (request as any).user.userId + const userId = request.user.userId const groupAllowed = await requireModelGroupPermission( userId, group.id, @@ -1232,7 +1232,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { { preHandler: wsPreHandler }, async (request: FastifyRequest, reply: FastifyReply) => { try { - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groups = await listWorkspaceMemberOwnedModelGroups(workspaceMemberId) return reply.send({ groups }) @@ -1248,7 +1248,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { async (request: FastifyRequest, reply: FastifyReply) => { try { const body = createGroupSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const group = await createModelGroup({ ...body, ownerType: "workspace_member", @@ -1295,7 +1295,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -1329,7 +1329,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { ) if (!group) return - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const groupAllowed = await requireModelGroupPermission( workspaceMemberId, group.id, @@ -1385,7 +1385,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { const body = issueGrantSchema.parse(request.body) const grant = await issueModelGroupGrant(group.id, { ...body, - grantedByWorkspaceMemberId: (request as any).workspaceMember + grantedByWorkspaceMemberId: request.workspaceMember ?.id as string, }) return reply.status(201).send({ grant }) @@ -1433,7 +1433,7 @@ export function registerModelGroupRoutes(app: FastifyInstance) { const body = addItemSchema.parse(request.body) const item = await addModelItem(group.id, { ...body, - installedByWorkspaceMemberId: (request as any).workspaceMember + installedByWorkspaceMemberId: request.workspaceMember ?.id as string, }) return reply.status(201).send({ item }) diff --git a/packages/api/src/modules/organization/controller.ts b/packages/api/src/modules/organization/controller.ts index 9ca0db5b..c0ca63c9 100644 --- a/packages/api/src/modules/organization/controller.ts +++ b/packages/api/src/modules/organization/controller.ts @@ -144,7 +144,7 @@ export async function organizationController(app: FastifyInstance) { try { const actor = await service.createActor({ workspaceId: (request.params as WorkspaceParams).workspaceId, - createdByWorkspaceMemberId: (request as any).workspaceMember!.id, + createdByWorkspaceMemberId: request.workspaceMember!.id, ...parsed.data, }) return reply.status(201).send(actor) @@ -159,7 +159,7 @@ export async function organizationController(app: FastifyInstance) { const { workspaceId } = request.params as WorkspaceParams const actors = await service.listActors( workspaceId, - workspaceMemberSubject((request as any).workspaceMember!.id) + workspaceMemberSubject(request.workspaceMember!.id) ) return reply.send(actors) }) @@ -168,7 +168,7 @@ export async function organizationController(app: FastifyInstance) { const { workspaceId } = request.params as WorkspaceParams const tree = await service.getFullOrgTree( workspaceId, - workspaceMemberSubject((request as any).workspaceMember!.id) + workspaceMemberSubject(request.workspaceMember!.id) ) return reply.send(tree) }) @@ -218,7 +218,7 @@ export async function organizationController(app: FastifyInstance) { const result = await service.installActorPackage({ workspaceId, packageId, - createdByWorkspaceMemberId: (request as any).workspaceMember!.id, + createdByWorkspaceMemberId: request.workspaceMember!.id, name: parsed.data.name, title: parsed.data.title, parentId: parsed.data.parentId, @@ -300,7 +300,7 @@ export async function organizationController(app: FastifyInstance) { parsed.data, { type: "workspace_member", - workspaceMemberId: (request as any).workspaceMember!.id, + workspaceMemberId: request.workspaceMember!.id, reason: "user_edit", } ) diff --git a/packages/api/src/modules/platform/controller.ts b/packages/api/src/modules/platform/controller.ts index ec8df981..12f66d6c 100644 --- a/packages/api/src/modules/platform/controller.ts +++ b/packages/api/src/modules/platform/controller.ts @@ -43,7 +43,7 @@ export function registerPlatformRoutes(app: FastifyInstance) { const authHook = { preHandler: [authMiddleware] } app.get("/api/v1/platform/navigation", authHook, async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const canManagePlatform = await canPlatformPermission(userId) return reply.send({ @@ -86,7 +86,7 @@ export function registerPlatformRoutes(app: FastifyInstance) { const accessBinding = await grantPlatformAccess({ userId: parsed.data.userId, accessKey: parsed.data.accessKey as PlatformAccessKey, - assignedByUserId: (request as any).user!.userId, + assignedByUserId: request.user!.userId, }) return reply.status(201).send(accessBinding) } catch (err: any) { diff --git a/packages/api/src/modules/relationship/controller.ts b/packages/api/src/modules/relationship/controller.ts index bd2fbcce..cda4cec4 100644 --- a/packages/api/src/modules/relationship/controller.ts +++ b/packages/api/src/modules/relationship/controller.ts @@ -86,7 +86,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/me/relationship-profile", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId return reply.send( await getMemberRelationshipProfile({ workspaceId: request.params.workspaceId, @@ -102,7 +102,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/me/relationship-profile", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const body = updateMemberProfileSchema.parse(request.body) return reply.send( await updateMemberRelationshipProfile({ @@ -129,7 +129,7 @@ export default async function relationshipController(app: FastifyInstance) { "Not allowed to manage this actor relationship profile" ) if (!allowed) return - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send( await getActorRelationshipProfile({ @@ -158,7 +158,7 @@ export default async function relationshipController(app: FastifyInstance) { "Not allowed to manage this actor relationship profile" ) if (!allowed) return - const userId = (request as any).user!.userId + const userId = request.user!.userId const body = updateActorProfileSchema.parse(request.body) try { return reply.send( @@ -192,7 +192,7 @@ export default async function relationshipController(app: FastifyInstance) { "Not allowed to manage this remote agent relationship profile" ) if (!allowed) return - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send( await getRemoteAgentRelationshipProfile({ @@ -221,7 +221,7 @@ export default async function relationshipController(app: FastifyInstance) { "Not allowed to manage this remote agent relationship profile" ) if (!allowed) return - const userId = (request as any).user!.userId + const userId = request.user!.userId const body = updateActorProfileSchema.parse(request.body) try { return reply.send( @@ -248,7 +248,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/relationship-qr/scan", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const body = scanSchema.parse(request.body) try { return reply.send( @@ -270,7 +270,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/identity-search", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const query = identitySearchQuerySchema.parse(request.query) return reply.send( await searchRelationshipsByIdentity({ @@ -288,7 +288,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/identity-search/request", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const body = requestRelationshipBySearchSchema.parse(request.body) try { return reply.send( @@ -307,7 +307,7 @@ export default async function relationshipController(app: FastifyInstance) { app.get<{ Params: { workspaceId: string } }>("/api/v1/workspaces/:workspaceId/friends", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId return reply.send( await listFriends({ workspaceId: request.params.workspaceId, @@ -321,7 +321,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/friend-requests", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId return reply.send( await listFriendRequests({ workspaceId: request.params.workspaceId, @@ -336,7 +336,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/friend-requests/:requestId/approve", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send({ request: await resolveFriendRequest({ @@ -357,7 +357,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/friend-requests/:requestId/reject", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send({ request: await resolveFriendRequest({ @@ -378,7 +378,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/actor-access-requests", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId return reply.send( await listActorAccessRequests({ workspaceId: request.params.workspaceId, @@ -393,7 +393,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/remote-agent-access-requests", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId return reply.send( await listRemoteAgentAccessRequests({ workspaceId: request.params.workspaceId, @@ -408,7 +408,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/actor-access-requests/:requestId/approve", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send({ request: await resolveActorAccessRequest({ @@ -429,7 +429,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/actor-access-requests/:requestId/reject", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send({ request: await resolveActorAccessRequest({ @@ -450,7 +450,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/remote-agent-access-requests/:requestId/approve", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send({ request: await resolveRemoteAgentAccessRequest({ @@ -471,7 +471,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/remote-agent-access-requests/:requestId/reject", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId try { return reply.send({ request: await resolveRemoteAgentAccessRequest({ @@ -490,7 +490,7 @@ export default async function relationshipController(app: FastifyInstance) { app.get<{ Params: { workspaceId: string } }>("/api/v1/workspaces/:workspaceId/contact-hub", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId return reply.send( await getContactHub({ workspaceId: request.params.workspaceId, @@ -504,7 +504,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/contact-hub/:kind/:contactId", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const kind = contactKindSchema.parse(request.params.kind) try { return reply.send( @@ -527,7 +527,7 @@ export default async function relationshipController(app: FastifyInstance) { }>( "/api/v1/workspaces/:workspaceId/direct-conversations/open", async (request, reply) => { - const userId = (request as any).user!.userId + const userId = request.user!.userId const body = openDirectSchema.parse(request.body) try { return reply.send( diff --git a/packages/api/src/modules/remote-agents/controller.ts b/packages/api/src/modules/remote-agents/controller.ts index eeea131c..b7d64c01 100644 --- a/packages/api/src/modules/remote-agents/controller.ts +++ b/packages/api/src/modules/remote-agents/controller.ts @@ -118,7 +118,7 @@ const internalPlanApprovalInteractionSchema = z.object({ }) function getRequestUserId(request: any) { - return (request as any).user!.userId as string + return request.user!.userId as string } function sendServiceError(reply: FastifyReply, error: unknown) { diff --git a/packages/api/src/modules/session/controller.ts b/packages/api/src/modules/session/controller.ts index 771a8cb7..4b32f4df 100644 --- a/packages/api/src/modules/session/controller.ts +++ b/packages/api/src/modules/session/controller.ts @@ -67,7 +67,7 @@ async function requireSessionConversationPermission( return null } - const workspaceMemberId = (request as any).workspaceMember?.id as + const workspaceMemberId = request.workspaceMember?.id as | string | undefined if (!workspaceMemberId) { @@ -111,7 +111,7 @@ export async function sessionController(app: FastifyInstance) { } const normalizedChannelType: SessionsChannelType = channelType === "im" ? "bridge" : (channelType ?? "web") - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string const allowed = await requireActorPermission( request, @@ -171,7 +171,7 @@ export async function sessionController(app: FastifyInstance) { const { contentBlocks } = sendMessageSchema.parse(request.body) as { contentBlocks: CanonicalContentBlock[] } - const workspaceMemberId = (request as any).workspaceMember!.id as string + const workspaceMemberId = request.workspaceMember!.id as string const session = await requireSessionConversationPermission( request, @@ -258,8 +258,8 @@ export async function sessionController(app: FastifyInstance) { async (request, reply) => { const { workspaceId, sessionId } = request.params const { itemId } = retrySessionSchema.parse(request.body || {}) - const userId = (request as any).user!.userId - const workspaceMemberId = (request as any).workspaceMember!.id as string + const userId = request.user!.userId + const workspaceMemberId = request.workspaceMember!.id as string const session = await requireSessionConversationPermission( request, diff --git a/packages/api/src/modules/skills/controller.ts b/packages/api/src/modules/skills/controller.ts index f6cc67a1..cf170aa3 100644 --- a/packages/api/src/modules/skills/controller.ts +++ b/packages/api/src/modules/skills/controller.ts @@ -244,7 +244,7 @@ export function registerSkillRoutes(app: FastifyInstance) { if (!allowed) return const body = publishSkillSchema.parse(request.body) - const user = (request as any).user + const user = request.user const skill = await publishMarketplaceSkill({ ...body, authorUserId: user?.id || user?.userId, @@ -268,7 +268,7 @@ export function registerSkillRoutes(app: FastifyInstance) { if (!allowed) return const body = importMarketplaceSkillSchema.parse(request.body) - const user = (request as any).user + const user = request.user const skill = await importMarketplaceMirrorSkill({ ...body, authorUserId: user?.id || user?.userId, @@ -293,7 +293,7 @@ export function registerSkillRoutes(app: FastifyInstance) { if (!allowed) return const { skillId } = request.params as { skillId: string } - const user = (request as any).user + const user = request.user const skill = await refreshMarketplaceSkill({ skillId, authorUserId: user?.id || user?.userId, @@ -354,7 +354,7 @@ export function registerSkillRoutes(app: FastifyInstance) { if (!allowed) return const body = installSkillSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const skill = await installMarketplaceSkill({ workspaceId, marketSkillId: body.marketSkillId, @@ -384,7 +384,7 @@ export function registerSkillRoutes(app: FastifyInstance) { if (!allowed) return const body = createWorkspaceSkillSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const skill = await createWorkspaceSkill({ workspaceId, name: body.name, @@ -562,7 +562,7 @@ export function registerSkillRoutes(app: FastifyInstance) { if (!allowed) return const body = skillAccessGrantSchema.parse(request.body) - const workspaceMemberId = (request as any).workspaceMember?.id as string + const workspaceMemberId = request.workspaceMember?.id as string const grant = await grantInstalledSkillAccess({ workspaceId, installedSkillId, diff --git a/packages/api/src/modules/workspace/controller.ts b/packages/api/src/modules/workspace/controller.ts index 9f53f8dd..37bc29f8 100644 --- a/packages/api/src/modules/workspace/controller.ts +++ b/packages/api/src/modules/workspace/controller.ts @@ -136,7 +136,7 @@ export async function handleCreateWorkspace( const workspace = await createWorkspace({ name: parsed.data.name, description: parsed.data.description, - userId: (request as any).user!.userId, + userId: request.user!.userId, }) return reply.status(201).send(workspace) @@ -146,7 +146,7 @@ export async function handleListWorkspaces( request: FastifyRequest, reply: FastifyReply ) { - const workspaces = await listUserWorkspaces((request as any).user!.userId) + const workspaces = await listUserWorkspaces(request.user!.userId) return reply.send({ data: workspaces }) } @@ -329,8 +329,8 @@ export async function handleGetWorkspaceChiefActorPreference( ) if (!allowed) return - const userId = (request as any).user!.userId - const workspaceMemberId = (request as any).workspaceMember?.id as + const userId = request.user!.userId + const workspaceMemberId = request.workspaceMember?.id as | string | undefined if (!workspaceMemberId) { @@ -365,7 +365,7 @@ export async function handleUpdateWorkspaceChiefActorPreference( } try { - const workspaceMemberId = (request as any).workspaceMember?.id as + const workspaceMemberId = request.workspaceMember?.id as | string | undefined if (!workspaceMemberId) { @@ -375,7 +375,7 @@ export async function handleUpdateWorkspaceChiefActorPreference( } const preference = await updateWorkspaceChiefActorPreference( request.params.workspaceId, - (request as any).user!.userId, + request.user!.userId, parsed.data.chiefActorId ) return reply.send(preference) @@ -392,7 +392,7 @@ export async function handleGetWorkspaceNavigation( request: FastifyRequest<{ Params: WorkspaceParams }>, reply: FastifyReply ) { - const userId = (request as any).user!.userId + const userId = request.user!.userId const { workspaceId } = request.params const [canViewWorkspace, canAccessWorkspaceModels, canAccessWorkspaceAccess] = @@ -436,7 +436,7 @@ export async function handleGrantWorkspaceAccess( workspaceId: request.params.workspaceId, workspaceMemberId: parsed.data.workspaceMemberId, accessKey: parsed.data.accessKey as WorkspaceAccessKey, - assignedByWorkspaceMemberId: (request as any).workspaceMember!.id, + assignedByWorkspaceMemberId: request.workspaceMember!.id, }) return reply.status(201).send(accessBinding) } catch (err: any) { @@ -510,7 +510,7 @@ export async function handleCreateInvite( const invite = await createInvite({ workspaceId: request.params.workspaceId, - createdByWorkspaceMemberId: (request as any).workspaceMember!.id, + createdByWorkspaceMemberId: request.workspaceMember!.id, trustLevel: parsed.data.trustLevel, maxUses: parsed.data.maxUses, expiresAt: parsed.data.expiresAt, @@ -583,7 +583,7 @@ export async function handleRedeemInvite( request: FastifyRequest<{ Params: TokenParams }>, reply: FastifyReply ) { - const userId = (request as any).user!.userId + const userId = request.user!.userId try { const result = await redeemInvite(request.params.token, userId) return reply.send(result) diff --git a/packages/api/src/types/fastify.d.ts b/packages/api/src/types/fastify.d.ts new file mode 100644 index 00000000..b2cdfe8c --- /dev/null +++ b/packages/api/src/types/fastify.d.ts @@ -0,0 +1,17 @@ +import type { AuthSessionSummary } from "@synapse/shared" + +declare module "fastify" { + interface FastifyRequest { + user?: { + userId: string + email: string + } + authSession?: AuthSessionSummary + workspaceMember?: { + id: string + workspace_id: string + user_id: string + trust_level: string + } | null + } +}