From 3a3836761ffa0fccbcdb335578edd164c6a34101 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 3 Jul 2025 22:04:11 +0000 Subject: [PATCH] Add Slack integration request and response type definitions Co-authored-by: dallin --- .../server-shared/src/slack/requests.types.ts | 45 ++++++++++++ .../src/slack/responses.types.ts | 69 +++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 packages/server-shared/src/slack/requests.types.ts create mode 100644 packages/server-shared/src/slack/responses.types.ts diff --git a/packages/server-shared/src/slack/requests.types.ts b/packages/server-shared/src/slack/requests.types.ts new file mode 100644 index 000000000..7c0a12c2f --- /dev/null +++ b/packages/server-shared/src/slack/requests.types.ts @@ -0,0 +1,45 @@ +import { z } from 'zod'; + +// POST /api/v2/slack/auth/init +export const InitiateOAuthSchema = z.object({ + metadata: z + .object({ + returnUrl: z.string().optional(), + source: z.string().optional(), + projectId: z.string().uuid().optional(), + }) + .optional(), +}); + +export type InitiateOAuthRequest = z.infer; + +// GET /api/v2/slack/auth/callback +export const OAuthCallbackSchema = z.object({ + code: z.string(), + state: z.string(), +}); + +export type OAuthCallbackRequest = z.infer; + +// PUT /api/v2/slack/integration +export const UpdateIntegrationSchema = z.object({ + default_channel: z + .object({ + name: z.string().min(1), + id: z.string().min(1), + }) + .optional(), +}); + +export type UpdateIntegrationRequest = z.infer; + +// OAuth metadata schema (used internally) +export const OAuthMetadataSchema = z.object({ + returnUrl: z.string().optional(), + source: z.string().optional(), + projectId: z.string().uuid().optional(), + initiatedAt: z.string().datetime().optional(), + ipAddress: z.string().optional(), +}); + +export type OAuthMetadata = z.infer; diff --git a/packages/server-shared/src/slack/responses.types.ts b/packages/server-shared/src/slack/responses.types.ts new file mode 100644 index 000000000..4d89f2d50 --- /dev/null +++ b/packages/server-shared/src/slack/responses.types.ts @@ -0,0 +1,69 @@ +// Error response type +export interface SlackErrorResponse { + error: string; + code?: string; +} + +// POST /api/v2/slack/auth/init +export interface InitiateOAuthResponse { + authUrl: string; + state: string; +} + +// GET /api/v2/slack/auth/callback +// This endpoint returns a redirect, not JSON + +// GET /api/v2/slack/integration +export interface GetIntegrationResponse { + connected: boolean; + integration?: { + id: string; + teamName: string; + teamDomain?: string; + installedAt: string; + lastUsedAt?: string; + }; +} + +// DELETE /api/v2/slack/integration +export interface RemoveIntegrationResponse { + message: string; +} + +// PUT /api/v2/slack/integration +export interface UpdateIntegrationResponse { + message: string; + default_channel?: { + name: string; + id: string; + }; +} + +// GET /api/v2/slack/channels +export interface GetChannelsResponse { + channels: Array<{ + id: string; + name: string; + }>; +} + +// OAuth callback result (used internally) +export interface OAuthCallbackResult { + success: boolean; + integrationId: string; + metadata?: { + returnUrl?: string; + source?: string; + projectId?: string; + initiatedAt?: string; + ipAddress?: string; + }; + teamName?: string; + error?: string; +} + +// Remove integration result (used internally) +export interface RemoveIntegrationResult { + success: boolean; + error?: string; +}