diff options
Diffstat (limited to 'lib/roles/services.ts')
| -rw-r--r-- | lib/roles/services.ts | 104 |
1 files changed, 103 insertions, 1 deletions
diff --git a/lib/roles/services.ts b/lib/roles/services.ts index 1a91d4fa..54c7d833 100644 --- a/lib/roles/services.ts +++ b/lib/roles/services.ts @@ -3,7 +3,7 @@ import { revalidateTag, unstable_cache, unstable_noStore } from "next/cache"; import db from "@/db/db"; import { permissions, Role, rolePermissions, roles, RoleView, roleView, userRoles } from "@/db/schema/users"; -import { and, or, asc, desc, ilike, eq, inArray } from "drizzle-orm"; +import { and, or, asc, desc, ilike, eq, inArray, sql } from "drizzle-orm"; import { filterColumns } from "@/lib/filter-columns"; import { selectRolesWithUserCount, @@ -297,4 +297,106 @@ export async function getMenuPermissions( .where(ilike(permissions.permissionKey, pattern)); return rows; +} + + +export async function checkRegularEvaluationRoleExists(): Promise<boolean> { + try { + const existingRoles = await db + .select({ id: roles.id, name: roles.name }) + .from(roles) + .where(sql`${roles.name} ILIKE '%정기평가%'`) + .limit(1) + + return existingRoles.length > 0 + } catch (error) { + console.error("정기평가 role 체크 중 에러:", error) + throw new Error("정기평가 role 체크에 실패했습니다") + } +} + + + +/** + * 여러 정기평가 role들의 할당 상태를 한번에 체크 + */ +export async function checkMultipleRegularEvaluationRolesAssigned(roleIds: number[]): Promise<{[roleId: number]: boolean}> { + try { + // 정기평가 role들만 필터링 + const regularEvaluationRoles = await db + .select({ id: roles.id, name: roles.name }) + .from(roles) + .where( + and( + inArray(roles.id, roleIds), + sql`${roles.name} ILIKE '%정기평가%'` + ) + ) + + const regularEvaluationRoleIds = regularEvaluationRoles.map(r => r.id) + const result: {[roleId: number]: boolean} = {} + + // 모든 role ID에 대해 초기값 설정 + roleIds.forEach(roleId => { + result[roleId] = false + }) + + if (regularEvaluationRoleIds.length > 0) { + // 할당된 정기평가 role들 체크 + const assignedRoles = await db + .select({ roleId: userRoles.roleId }) + .from(userRoles) + .where(inArray(userRoles.roleId, regularEvaluationRoleIds)) + + // 할당된 role들을 true로 설정 + assignedRoles.forEach(assignment => { + result[assignment.roleId] = true + }) + } + + return result + } catch (error) { + console.error("여러 정기평가 role 할당 상태 체크 중 에러:", error) + throw new Error("정기평가 role 할당 상태 체크에 실패했습니다") + } +} + +/** + * 특정 유저가 이미 다른 정기평가 role을 가지고 있는지 체크 + */ +export async function checkUserHasRegularEvaluationRole(userId: string): Promise<{hasRole: boolean, roleName?: string}> { + try { + const userRegularEvaluationRoles = await db + .select({ + roleId: userRoles.roleId, + roleName: roles.name + }) + .from(userRoles) + .innerJoin(roles, eq(userRoles.roleId, roles.id)) + .where( + and( + eq(userRoles.userId, userId), + sql`${roles.name} ILIKE '%정기평가%'` + ) + ) + .limit(1) + + return { + hasRole: userRegularEvaluationRoles.length > 0, + roleName: userRegularEvaluationRoles[0]?.roleName + } + } catch (error) { + console.error(`유저 ${userId}의 정기평가 role 체크 중 에러:`, error) + throw new Error("유저 정기평가 role 체크에 실패했습니다") + } +} + + +export async function removeRolesFromUsers(roleIds: number[], userIds: number[]) { + try { + // userRoles 테이블에서 해당 역할들을 제거하는 로직 + // 구현 필요 + } catch (error) { + return { error: "역할 제거 실패" } + } }
\ No newline at end of file |
