You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.5 KiB
64 lines
1.5 KiB
/**
|
|
* PATCH /api/user/active-role
|
|
*
|
|
* Switch user's active role (used by RoleSwitcher component)
|
|
*
|
|
* Request body:
|
|
* {
|
|
* "roleCode": "educator"
|
|
* }
|
|
*
|
|
* Response:
|
|
* {
|
|
* "success": true,
|
|
* "activeRoleCode": "educator"
|
|
* }
|
|
*
|
|
* Validates that user has the requested role before switching
|
|
* Updates both session (immediate) and database (preference)
|
|
*/
|
|
|
|
import { z } from 'zod'
|
|
import { setUserActiveRole } from '../../utils/role-session'
|
|
|
|
const switchRoleSchema = z.object({
|
|
roleCode: z.enum(['private', 'educator', 'company'], {
|
|
errorMap: () => ({ message: 'Ungültige Rolle' }),
|
|
}),
|
|
})
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
// Require authentication
|
|
await requireUserSession(event)
|
|
|
|
// Validate request body
|
|
const body = await readBody(event)
|
|
const { roleCode } = switchRoleSchema.parse(body)
|
|
|
|
try {
|
|
// Set active role (validates + updates session + saves to DB)
|
|
await setUserActiveRole(event, roleCode)
|
|
|
|
return {
|
|
success: true,
|
|
activeRoleCode: roleCode,
|
|
}
|
|
} catch (error: any) {
|
|
// setUserActiveRole throws 403 if user doesn't have role
|
|
if (error.statusCode === 403) {
|
|
setResponseStatus(event, 403)
|
|
return {
|
|
success: false,
|
|
message: error.message || 'Du hast diese Rolle nicht',
|
|
}
|
|
}
|
|
|
|
// Other errors
|
|
console.error('Role switch error:', error)
|
|
setResponseStatus(event, 500)
|
|
return {
|
|
success: false,
|
|
message: 'Fehler beim Wechseln der Rolle',
|
|
}
|
|
}
|
|
})
|
|
|