summaryrefslogtreecommitdiff
path: root/lib/roles/services.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/roles/services.ts')
-rw-r--r--lib/roles/services.ts104
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