feat(auth): integrate normalizePermissionKeys for consistent permission handling
Build and Push Auth Portal Docker Image / build-and-push (push) Successful in 1m54s
Build and Push Auth Portal Docker Image / create-release (push) Skipped

- Updated auth, admin, and auth-guards routes to utilize normalizePermissionKeys for permissions.
- Enhanced permission mapping to ensure legacy keys are correctly transformed to current catalog keys.
- Improved overall permission validation and user access management across the application.
This commit is contained in:
Denozordec
2026-07-19 00:19:18 +07:00
parent cfbe1fceda
commit 21d6603b57
4 changed files with 42 additions and 11 deletions
+4 -2
View File
@@ -6,7 +6,7 @@ import {
type UserRow,
} from '@authportal/db'
import type { AppId, MeResponse } from '@authportal/shared'
import { APP_IDS } from '@authportal/shared'
import { APP_IDS, normalizePermissionKeys } from '@authportal/shared'
export type AuthUser = {
id: string
@@ -68,7 +68,9 @@ export function loadAuthUser(
user: UserRow,
): AuthUser {
const apps = getUserApps(request.server.db, user.id)
const permissions = getUserPermissions(request.server.db, user.id)
const permissions = normalizePermissionKeys(
getUserPermissions(request.server.db, user.id),
)
return {
id: user.id,
email: user.email,
+8 -8
View File
@@ -18,6 +18,7 @@ import {
allPermissionKeys,
appSwitcherConfigSchema,
createUserRequestSchema,
normalizePermissionKeys,
patchUserRequestSchema,
putUserAccessRequestSchema,
type AdminUser,
@@ -34,7 +35,7 @@ function mapUser(
const apps = getUserApps(db, user.id).filter((a): a is AppId =>
(APP_IDS as readonly string[]).includes(a),
)
const permissions = getUserPermissions(db, user.id)
const permissions = normalizePermissionKeys(getUserPermissions(db, user.id))
return {
id: user.id,
email: user.email,
@@ -93,12 +94,13 @@ export async function adminRoutes(app: FastifyInstance): Promise<void> {
})
}
const data = parsed.data
const permissions = normalizePermissionKeys(data.permissions)
if (getUserByEmail(app.db, data.email)) {
return reply.status(409).send({
error: { code: 'CONFLICT', message: 'Email уже занят' },
})
}
const accessError = validateAccess(data.apps, data.permissions)
const accessError = validateAccess(data.apps, permissions)
if (accessError) {
return reply.status(400).send({
error: { code: 'VALIDATION_ERROR', message: accessError },
@@ -112,7 +114,7 @@ export async function adminRoutes(app: FastifyInstance): Promise<void> {
passwordHash,
isAdmin: data.is_admin,
})
setUserAccess(app.db, user.id, data.apps, data.permissions)
setUserAccess(app.db, user.id, data.apps, permissions)
return reply.status(201).send(mapUser(app.db, getUserById(app.db, user.id)!))
})
@@ -190,10 +192,8 @@ export async function adminRoutes(app: FastifyInstance): Promise<void> {
error: { code: 'NOT_FOUND', message: 'Пользователь не найден' },
})
}
const accessError = validateAccess(
parsed.data.apps,
parsed.data.permissions,
)
const permissions = normalizePermissionKeys(parsed.data.permissions)
const accessError = validateAccess(parsed.data.apps, permissions)
if (accessError) {
return reply.status(400).send({
error: { code: 'VALIDATION_ERROR', message: accessError },
@@ -203,7 +203,7 @@ export async function adminRoutes(app: FastifyInstance): Promise<void> {
app.db,
request.params.id,
parsed.data.apps,
parsed.data.permissions,
permissions,
)
return mapUser(app.db, getUserById(app.db, request.params.id)!)
},
+4 -1
View File
@@ -5,6 +5,7 @@ import {
PERMISSION_CATALOG,
appsMetaFromSwitcher,
loginRequestSchema,
normalizePermissionKeys,
type LoginResponse,
} from '@authportal/shared'
import {
@@ -52,7 +53,9 @@ export async function authRoutes(app: FastifyInstance): Promise<void> {
}
const apps = getUserApps(app.db, user.id)
const permissions = getUserPermissions(app.db, user.id)
const permissions = normalizePermissionKeys(
getUserPermissions(app.db, user.id),
)
const me = toMe(user, apps, permissions)
const expiresAt = new Date(