ghostguild-org/server/api/admin/board-channels.post.js
Jennie Robinson Faber 1578055a27 feat(board-channels): skip Slack createChannel in dev/test mode
Mirrors the dev-mode short-circuit in invite.post.js. Without
SLACK_BOT_TOKEN, board-channel create returned 500 'Slack integration
not configured', breaking e2e in CI. With ALLOW_DEV_TEST_ENDPOINTS=true,
generate a stub channel ID and proceed; everything DB-side still runs.
2026-05-01 10:13:21 +01:00

69 lines
2.1 KiB
JavaScript

import BoardChannel from '../../models/boardChannel.js'
import { requireAdmin } from '../../utils/auth.js'
import { validateBody } from '../../utils/validateBody.js'
import { boardChannelCreateSchema } from '../../utils/schemas.js'
import { getSlackAdminService } from '../../utils/slack.ts'
export default defineEventHandler(async (event) => {
await requireAdmin(event)
const body = await validateBody(event, boardChannelCreateSchema)
if (body.tagSlugs && body.tagSlugs.length) {
const conflict = await BoardChannel.findOne({ tagSlugs: { $in: body.tagSlugs } }).lean()
if (conflict) {
const taken = (conflict.tagSlugs || []).filter((s) => body.tagSlugs.includes(s))
throw createError({
statusCode: 409,
statusMessage: `Tag${taken.length > 1 ? 's' : ''} already mapped to "${conflict.name}": ${taken.join(', ')}`,
})
}
}
let slackChannelId = body.slackChannelId
let channelName = body.name
if (!slackChannelId) {
if (process.env.ALLOW_DEV_TEST_ENDPOINTS === 'true') {
slackChannelId = `dev-stub-${Date.now()}`
console.log('[slack] DEV MODE — skipping createChannel', { name: body.name, slackChannelId })
} else {
const slack = getSlackAdminService()
if (!slack) {
throw createError({
statusCode: 500,
statusMessage: 'Slack integration not configured',
})
}
try {
const created = await slack.createChannel(body.name)
slackChannelId = created.id
channelName = created.name
} catch (err) {
throw createError({
statusCode: 502,
statusMessage: `Failed to create Slack channel: ${err.data?.error || err.message}`,
})
}
}
}
try {
const channel = await BoardChannel.create({
name: channelName,
slackChannelId,
tagSlugs: body.tagSlugs || []
})
setResponseStatus(event, 201)
return { channel: channel.toObject() }
} catch (err) {
if (err.code === 11000) {
throw createError({
statusCode: 409,
statusMessage: 'A channel with that Slack channel ID already exists'
})
}
throw err
}
})