mirror of https://github.com/buster-so/buster.git
Refactor Slack handler to utilize shared types and remove local schema definitions
This commit is contained in:
parent
3a3836761f
commit
f5eb9496c5
|
@ -1,56 +1,18 @@
|
||||||
import { getUserOrganizationId } from '@buster/database';
|
import { getUserOrganizationId } from '@buster/database';
|
||||||
|
import {
|
||||||
|
InitiateOAuthSchema,
|
||||||
|
OAuthCallbackSchema,
|
||||||
|
SlackError,
|
||||||
|
SlackErrorCodes,
|
||||||
|
UpdateIntegrationSchema,
|
||||||
|
} from '@buster/server-shared/slack';
|
||||||
import { SlackChannelService } from '@buster/slack';
|
import { SlackChannelService } from '@buster/slack';
|
||||||
import type { Context } from 'hono';
|
import type { Context } from 'hono';
|
||||||
import { HTTPException } from 'hono/http-exception';
|
import { HTTPException } from 'hono/http-exception';
|
||||||
import { z } from 'zod';
|
|
||||||
import { getActiveIntegration, updateDefaultChannel } from './services/slack-helpers';
|
import { getActiveIntegration, updateDefaultChannel } from './services/slack-helpers';
|
||||||
import * as slackHelpers from './services/slack-helpers';
|
import * as slackHelpers from './services/slack-helpers';
|
||||||
import { type SlackOAuthService, createSlackOAuthService } from './services/slack-oauth-service';
|
import { type SlackOAuthService, createSlackOAuthService } from './services/slack-oauth-service';
|
||||||
|
|
||||||
// Request schemas
|
|
||||||
const InitiateOAuthSchema = z.object({
|
|
||||||
metadata: z
|
|
||||||
.object({
|
|
||||||
returnUrl: z.string().optional(),
|
|
||||||
source: z.string().optional(),
|
|
||||||
projectId: z.string().uuid().optional(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const OAuthCallbackSchema = z.object({
|
|
||||||
code: z.string(),
|
|
||||||
state: z.string(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const UpdateIntegrationSchema = z.object({
|
|
||||||
default_channel: z
|
|
||||||
.object({
|
|
||||||
name: z.string().min(1),
|
|
||||||
id: z.string().min(1),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Custom error class
|
|
||||||
export class SlackError extends Error {
|
|
||||||
constructor(
|
|
||||||
message: string,
|
|
||||||
public statusCode: 500 | 400 | 401 | 403 | 404 | 409 | 429 | 503 = 500,
|
|
||||||
public code?: string
|
|
||||||
) {
|
|
||||||
super(message);
|
|
||||||
this.name = 'SlackError';
|
|
||||||
}
|
|
||||||
|
|
||||||
toResponse() {
|
|
||||||
return {
|
|
||||||
error: this.message,
|
|
||||||
code: this.code,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SlackHandler {
|
export class SlackHandler {
|
||||||
private slackOAuthService: SlackOAuthService | null = null;
|
private slackOAuthService: SlackOAuthService | null = null;
|
||||||
private _initializationAttempted = false;
|
private _initializationAttempted = false;
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { Hono } from 'hono';
|
import { Hono } from 'hono';
|
||||||
import { HTTPException } from 'hono/http-exception';
|
import { HTTPException } from 'hono/http-exception';
|
||||||
import { requireAuth } from '../../../middleware/auth';
|
import { requireAuth } from '../../../middleware/auth';
|
||||||
import { SlackError, slackHandler } from './handler';
|
import { slackHandler } from './handler';
|
||||||
|
import { SlackError } from '@buster/server-shared/slack';
|
||||||
|
|
||||||
const app = new Hono()
|
const app = new Hono()
|
||||||
// Public endpoints (no auth required for OAuth flow)
|
// Public endpoints (no auth required for OAuth flow)
|
||||||
|
|
|
@ -34,6 +34,10 @@
|
||||||
"./currency": {
|
"./currency": {
|
||||||
"types": "./dist/currency/index.d.ts",
|
"types": "./dist/currency/index.d.ts",
|
||||||
"default": "./dist/currency/index.js"
|
"default": "./dist/currency/index.js"
|
||||||
|
},
|
||||||
|
"./slack": {
|
||||||
|
"types": "./dist/slack/index.d.ts",
|
||||||
|
"default": "./dist/slack/index.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Custom error class for Slack integration errors
|
||||||
|
export class SlackError extends Error {
|
||||||
|
constructor(
|
||||||
|
message: string,
|
||||||
|
public statusCode: 500 | 400 | 401 | 403 | 404 | 409 | 429 | 503 = 500,
|
||||||
|
public code?: string
|
||||||
|
) {
|
||||||
|
super(message);
|
||||||
|
this.name = 'SlackError';
|
||||||
|
}
|
||||||
|
|
||||||
|
toResponse() {
|
||||||
|
return {
|
||||||
|
error: this.message,
|
||||||
|
code: this.code,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Common error codes
|
||||||
|
export const SlackErrorCodes = {
|
||||||
|
INTEGRATION_NOT_CONFIGURED: 'INTEGRATION_NOT_CONFIGURED',
|
||||||
|
INTEGRATION_DISABLED: 'INTEGRATION_DISABLED',
|
||||||
|
INTEGRATION_EXISTS: 'INTEGRATION_EXISTS',
|
||||||
|
INTEGRATION_NOT_FOUND: 'INTEGRATION_NOT_FOUND',
|
||||||
|
OAUTH_INIT_ERROR: 'OAUTH_INIT_ERROR',
|
||||||
|
GET_INTEGRATION_ERROR: 'GET_INTEGRATION_ERROR',
|
||||||
|
REMOVE_INTEGRATION_ERROR: 'REMOVE_INTEGRATION_ERROR',
|
||||||
|
UPDATE_DEFAULT_CHANNEL_ERROR: 'UPDATE_DEFAULT_CHANNEL_ERROR',
|
||||||
|
INVALID_REQUEST_BODY: 'INVALID_REQUEST_BODY',
|
||||||
|
TOKEN_RETRIEVAL_ERROR: 'TOKEN_RETRIEVAL_ERROR',
|
||||||
|
INVALID_TOKEN: 'INVALID_TOKEN',
|
||||||
|
RATE_LIMITED: 'RATE_LIMITED',
|
||||||
|
GET_CHANNELS_ERROR: 'GET_CHANNELS_ERROR',
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export type SlackErrorCode = (typeof SlackErrorCodes)[keyof typeof SlackErrorCodes];
|
|
@ -0,0 +1,11 @@
|
||||||
|
// Export all request types and schemas
|
||||||
|
export * from './requests.types';
|
||||||
|
export type * from './requests.types';
|
||||||
|
|
||||||
|
// Export all response types
|
||||||
|
export * from './responses.types';
|
||||||
|
export type * from './responses.types';
|
||||||
|
|
||||||
|
// Export error types and classes
|
||||||
|
export * from './errors.types';
|
||||||
|
export type * from './errors.types';
|
Loading…
Reference in New Issue