[action].post.ts 1.33 KB
import { z } from 'zod'
import { SN_ACTION_VALUES } from '../../../../../app/types/sn'
import { mutateMockSnStatus } from '../../../../utils/mock-sns'

const actionValues = SN_ACTION_VALUES.filter(action => action !== 'import')

const paramsSchema = z.object({
  action: z.enum(actionValues as [string, ...string[]])
})

const payloadSchema = z.object({
  operator: z.string().trim().min(1),
  reason: z.string().trim().min(1)
})

export default eventHandler(async (event) => {
  const idRaw = getRouterParam(event, 'id')
  const id = Number(idRaw)

  if (!Number.isInteger(id) || id <= 0) {
    return {
      success: false,
      errorCode: 'VALIDATION_ERROR',
      message: 'SN 标识不正确。'
    }
  }

  const actionRaw = getRouterParam(event, 'action')
  const parsedAction = paramsSchema.safeParse({ action: actionRaw })
  if (!parsedAction.success) {
    return {
      success: false,
      errorCode: 'VALIDATION_ERROR',
      message: 'SN 动作不支持。'
    }
  }

  const body = await readBody(event)
  const parsedBody = payloadSchema.safeParse(body)

  if (!parsedBody.success) {
    return {
      success: false,
      errorCode: 'VALIDATION_ERROR',
      message: 'SN 操作参数不正确。'
    }
  }

  return mutateMockSnStatus(
    id,
    parsedAction.data.action as 'freeze' | 'unfreeze' | 'scrap',
    parsedBody.data
  )
})