mirror of
https://github.com/OpenSquawk/OpenSquawk
synced 2026-08-04 08:06:26 +08:00
47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import { createError, readBody } from 'h3'
|
|
import { BridgeToken } from '../../models/BridgeToken'
|
|
import { getBridgeTokenFromHeader } from '../../utils/bridge'
|
|
import { logBridgeEvent } from '../../utils/bridgeLog'
|
|
import { pttBus, type PttState } from '../../utils/pttBus'
|
|
|
|
interface PttBody {
|
|
state?: PttState
|
|
}
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const token = getBridgeTokenFromHeader(event)
|
|
if (!token) {
|
|
throw createError({ statusCode: 401, statusMessage: 'x-bridge-token header fehlt oder ist ungültig.' })
|
|
}
|
|
|
|
const body = await readBody<PttBody>(event)
|
|
const state = body?.state
|
|
if (state !== 'down' && state !== 'up') {
|
|
throw createError({ statusCode: 400, statusMessage: "state muss 'down' oder 'up' sein." })
|
|
}
|
|
|
|
// Only relay for a linked token; an unknown/unlinked token is a no-op so the
|
|
// bus is never driven by an unauthenticated caller.
|
|
const exists = await BridgeToken.exists({ token })
|
|
if (!exists) {
|
|
throw createError({ statusCode: 404, statusMessage: 'Bridge-Token ist nicht verknüpft.' })
|
|
}
|
|
|
|
console.info(
|
|
`\x1b[33m[bridge:ptt]\x1b[0m token=\x1b[96m${token.slice(0, 6)}...\x1b[0m state=\x1b[92m${state}\x1b[0m`,
|
|
)
|
|
|
|
pttBus.publish(token, state)
|
|
|
|
logBridgeEvent(token, {
|
|
endpoint: '/api/bridge/ptt',
|
|
method: 'POST',
|
|
statusCode: 200,
|
|
color: '#eab308',
|
|
summary: `ptt=${state}`,
|
|
data: { state },
|
|
})
|
|
|
|
return { ok: true, state }
|
|
})
|