Advertisement
djbob2000

Untitled

Jan 27th, 2025
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. //server/auth/role-db.ts
  2. import { Role } from "@/auth/roles/role.resource";
  3. import { db } from "@server/db/db";
  4. import { dbIsAny } from "@server/fd/fd-toolbox/db/db";
  5. import { resourceNames } from "@/fd/fd-toolbox/resources/resource-names";
  6. import { eq } from "drizzle-orm";
  7. import { createResource, getResourceById, updateResource } from "@server/fd/fd-toolbox/db/type-db";
  8. import { tableNames } from "@server/db/table-names";
  9. import { getQuery } from "@server/web/drizzle";
  10. import { UserRole } from "@/users/user-role.resource";
  11. import { User } from "@/users/user.resource";
  12. import { parseJson } from "@/lib/utils";
  13. import { roleSchema, userRoleSchema, userSchema } from "@packages/plugin/schema";
  14. import { apiNotFoundError } from "@server/web/errors";
  15. import { errorMessages } from "@/meta/constants/error-messages";
  16.  
  17. type TableNames = typeof tableNames;
  18.  
  19. type RowType = Record<TableNames[keyof TableNames], Record<string, unknown> | null>;
  20.  
  21. export async function getAllIncludingUserToRoles() {
  22. const query = getQuery(roleSchema)
  23. .leftJoin(userRoleSchema, eq(userRoleSchema.roleId, roleSchema.id))
  24. .leftJoin(userSchema, eq(userRoleSchema.userId, userSchema.id));
  25. const rolesJoined: RowType[] = await query;
  26.  
  27. const rolesMap = new Map<string, Role>();
  28.  
  29. for (const row of rolesJoined) {
  30. const roleData = row[tableNames.role];
  31. if (!roleData) continue;
  32.  
  33. const roleObj = parseJson<Role>(roleData);
  34. const role = getRoleFromMap(rolesMap, roleObj);
  35.  
  36. const userRoleData = row[tableNames.userRole];
  37. const userData = row[tableNames.user];
  38. if (!userRoleData || !userData) continue;
  39.  
  40. const userRole = parseJson<UserRole>(userRoleData);
  41. const user = parseJson<User>(userData);
  42.  
  43. role.userRoleList?.push({
  44. ...userRole,
  45. role,
  46. user,
  47. });
  48. }
  49.  
  50. return Array.from(rolesMap.values());
  51. }
  52.  
  53. function getRoleFromMap(rolesMap: Map<string, Role>, roleObj: Role) {
  54. if (!rolesMap.has(roleObj.id)) {
  55. roleObj.userRoleList = [];
  56. rolesMap.set(roleObj.id, roleObj);
  57. }
  58. return rolesMap.get(roleObj.id)!;
  59. }
  60.  
  61. export async function getRoleByName(name: string, throwIfNotFound?: true): Promise<Role>;
  62. export async function getRoleByName(name: string, throwIfNotFound?: boolean): Promise<Role | undefined>;
  63. export async function getRoleByName(name: string, throwIfNotFound = false) {
  64. const roleFromDb: Role | undefined = await db.query.roleSchema.findFirst({
  65. where: eq(roleSchema.name, name),
  66. });
  67.  
  68. if (throwIfNotFound && !roleFromDb) {
  69. throw apiNotFoundError(errorMessages.roleNotFound.replace("{0}", name));
  70. }
  71.  
  72. return roleFromDb;
  73. }
  74.  
  75. export async function anyRoleExists() {
  76. const result = dbIsAny(resourceNames.role);
  77.  
  78. return result;
  79. }
  80.  
  81. export async function upsertRole(roleModel: Role) {
  82. const resourceFromDb = await getResourceById(resourceNames.role, roleModel.id, false);
  83.  
  84. if (resourceFromDb) {
  85. await updateResource(roleModel, resourceNames.role);
  86. } else {
  87. await createResource(roleModel, resourceNames.role);
  88. }
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement