Advertisement
djbob2000

Untitled

Jan 27th, 2025
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.56 KB | None | 0 0
  1. import { FdMemoryCacheOptions } from "@server/fd/fd-toolbox/cachings/fd-memory-cache-options";
  2. import { Permission } from "@/fd/fd-toolbox-web/permissions/permission.resource";
  3. import { PermissionPackageToPermission } from "@/fd/fd-toolbox-web/permissions/permission-package-to-permission.resource";
  4. import { PermissionDto } from "@server/auth/permission-dto";
  5. import {
  6. PermissionLevel,
  7. permissionType,
  8. PermissionType,
  9. } from "@/fd/fd-toolbox-core/auth/permissions/permission-enums";
  10. import { setCoreCache, tryGetObjectFromCoreCache } from "@server/fd/fd-toolbox/cachings/core-memory-cache";
  11. import { addListValueToDictionary, addMapValueToMap } from "@server/fd/fd-toolbox/services/dictionaries";
  12. import { RoleToPermission } from "@server/auth/role-to-permission";
  13. import { getAllIncludingUserToRoles } from "@server/auth/role-db";
  14. import {
  15. resourceSchema,
  16. permissionSchema as permissionTable,
  17. roleToPermissionSchema,
  18. } from "@packages/plugin/schema";
  19. import { eq, getTableColumns } from "drizzle-orm";
  20. import { getQuery } from "@server/web/drizzle";
  21. import { UserRole } from "@/users/user-role.resource";
  22. import { getPermissionPackageToPermissions } from "../fd-toolbox-web/auth/permissions/permission-package-to-permission-db";
  23. import { getRoleToPermissionPackages } from "../fd-toolbox-web/models/roles/role-to-permission-package-db";
  24. import { getPermissionCacheKey, createShallowPermission } from "../fd-toolbox-web/permissions/permissions";
  25. import { fdCacheKeys } from "../fd-toolbox-web/constants/fd-cache-keys";
  26. import { parseJson } from "@/lib/utils";
  27.  
  28. export async function getUserRoleIdsToRoleLevels() {
  29. const roles = await getAllIncludingUserToRoles();
  30.  
  31. const userRoleIdsLevels = new Map<string, Map<string, PermissionLevel>>();
  32.  
  33. for (const roleItem of roles) {
  34. if (roleItem.userRoleList) {
  35. for (const userRoleItem of roleItem.userRoleList.filter(
  36. (ur: UserRole) => ur.roleId === roleItem.id,
  37. )) {
  38. addMapValueToMap(userRoleIdsLevels, userRoleItem.userId, userRoleItem.roleId, roleItem.level);
  39. }
  40. }
  41. }
  42.  
  43. return userRoleIdsLevels;
  44. }
  45.  
  46. export async function saveRoleToPermissionsToCache(
  47. rolePackageToPermissions: Map<string, string[]>,
  48. ids: string[],
  49. type: PermissionType,
  50. ) {
  51. let cacheKeyPrefix: string = fdCacheKeys.roleToDefaultPermissions;
  52.  
  53. if (type === permissionType.resource) {
  54. cacheKeyPrefix = fdCacheKeys.roleToResourcePermissions;
  55. } else if (type === permissionType.property) {
  56. cacheKeyPrefix = fdCacheKeys.roleToPropertyPermissions;
  57. }
  58.  
  59. for (const id of ids) {
  60. await addMapFromCache(rolePackageToPermissions, id, cacheKeyPrefix);
  61.  
  62. if (!rolePackageToPermissions.has(id)) {
  63. await saveRoleToPermissionsToCacheById(id);
  64. await addMapFromCache(rolePackageToPermissions, id, cacheKeyPrefix);
  65. }
  66. }
  67.  
  68. return rolePackageToPermissions;
  69. }
  70.  
  71. export async function getRoleToPermissionList() {
  72. return getQuery(roleToPermissionSchema);
  73. }
  74.  
  75. export async function getUserPermissionCacheKey(type: PermissionType, userId: string) {
  76. return getPermissionCacheKey(type.toString(), userId);
  77. }
  78.  
  79. export async function getUserResourcePermissionCacheKey(
  80. type: PermissionType,
  81. resourceName: string,
  82. userId: string,
  83. ) {
  84. return getPermissionCacheKey(await getPermissionCacheKey(type.toString(), resourceName), userId);
  85. }
  86.  
  87. export async function saveUserPermissionsToMemoryCache(
  88. userPermissionKey: string,
  89. type: PermissionType,
  90. userPermissions: Map<string, PermissionDto>,
  91. ) {
  92. const cacheKey = await getUserPermissionCacheKey(type, userPermissionKey);
  93. await saveToMemoryCache(cacheKey, userPermissions);
  94. }
  95.  
  96. export async function getUserRoleIdsToRolePermissionLevels(userId: string) {
  97. const roleIdsLevels = new Map<string, PermissionLevel>();
  98. const memoryCacheKey = await getPermissionCacheKey(fdCacheKeys.userRolePermissionLevels, userId);
  99.  
  100. const cachedUserRoleIdsLevels = tryGetObjectFromCoreCache<Map<string, PermissionLevel>>(memoryCacheKey);
  101.  
  102. if (cachedUserRoleIdsLevels) {
  103. return cachedUserRoleIdsLevels;
  104. } else {
  105. await saveUserRoleIdsToRolePermissionLevelsToCache();
  106. const rolesToLevels = tryGetObjectFromCoreCache<Map<string, PermissionLevel>>(memoryCacheKey);
  107. if (rolesToLevels) {
  108. return rolesToLevels;
  109. }
  110. }
  111.  
  112. return roleIdsLevels;
  113. }
  114.  
  115. export async function savePackageToPermissionsToCache(
  116. rolePackageToPermissions: Map<string, string[]>,
  117. ids: string[],
  118. type: PermissionType,
  119. ) {
  120. let cacheKeyPrefix;
  121.  
  122. switch (type) {
  123. case permissionType.resource:
  124. cacheKeyPrefix = fdCacheKeys.packagesToResourcePermissions;
  125. break;
  126. case permissionType.property:
  127. cacheKeyPrefix = fdCacheKeys.packagesToPropertyPermissions;
  128. break;
  129. default:
  130. cacheKeyPrefix = fdCacheKeys.packagesToDefaultPermissions;
  131. }
  132.  
  133. for (const id of ids) {
  134. await addMapFromCache(rolePackageToPermissions, id, cacheKeyPrefix);
  135. if (!rolePackageToPermissions.has(id)) {
  136. await privateSavePackageToPermissionsToCache(id);
  137.  
  138. await addMapFromCache(rolePackageToPermissions, id, cacheKeyPrefix);
  139. }
  140. }
  141.  
  142. return rolePackageToPermissions;
  143. }
  144.  
  145. export async function getPermission(id: string) {
  146. let permission = tryGetObjectFromCoreCache<Permission>(
  147. await getPermissionCacheKey(fdCacheKeys.permission, id),
  148. );
  149.  
  150. if (permission) {
  151. return createShallowPermission(permission);
  152. } else {
  153. await savePermissionsToCache();
  154. permission = tryGetObjectFromCoreCache(await getPermissionCacheKey(fdCacheKeys.permission, id));
  155.  
  156. return permission && createShallowPermission(permission);
  157. }
  158. }
  159.  
  160. export async function addPackageToPermissions(
  161. rolesToPermissions: Map<string, string[]>,
  162. packageToPermissionList: PermissionPackageToPermission[],
  163. type: PermissionType,
  164. ) {
  165. for (const packageToPermission of packageToPermissionList) {
  166. const permission = await getPermission(packageToPermission.permissionId);
  167. if (permission?.type === type) {
  168. addListValueToDictionary(
  169. rolesToPermissions,
  170. packageToPermission.permissionPackageId,
  171. packageToPermission.permissionId,
  172. );
  173. }
  174. }
  175. }
  176.  
  177. export async function savePermissionsToCache() {
  178. const query = getQuery(permissionTable, {
  179. ...getTableColumns(permissionTable),
  180. resource: getTableColumns(resourceSchema),
  181. });
  182.  
  183. const permissions = await query.leftJoin(
  184. resourceSchema,
  185. eq(permissionTable.resourceId, resourceSchema.id),
  186. );
  187.  
  188. const cachePromises = permissions.map(async (permission) => {
  189. const cacheKey = await getPermissionCacheKey(fdCacheKeys.permission, permission.id);
  190. const shallowPermission = createShallowPermission({
  191. id: permission.id,
  192. resourceId: permission.resourceId ?? undefined,
  193. resourcePropertyId: permission.resourcePropertyId ?? undefined,
  194. name: permission.name ?? undefined,
  195. action: permission.action ?? undefined,
  196. resource: permission.resource ?? undefined,
  197. type: permission.type,
  198. });
  199.  
  200. return saveToMemoryCache(cacheKey, shallowPermission);
  201. });
  202.  
  203. await Promise.all(cachePromises);
  204. }
  205.  
  206. export async function getRoleToPackages(ids: string[]) {
  207. const roleToPackages = new Map<string, string[]>();
  208.  
  209. for (const id of ids) {
  210. await addMapFromCache(roleToPackages, id, fdCacheKeys.roleToPackages);
  211. if (!roleToPackages.has(id)) {
  212. await saveRoleToPermissionPackagesToCache();
  213.  
  214. await addMapFromCache(roleToPackages, id, fdCacheKeys.roleToPackages);
  215. }
  216. }
  217.  
  218. return roleToPackages;
  219. }
  220.  
  221. async function addMapFromCache<T>(map: Map<string, T[]>, id: string, cacheKeyPrefix: string) {
  222. const memoryCacheKey = await getPermissionCacheKey(cacheKeyPrefix, id);
  223. const cachedValue = tryGetObjectFromCoreCache<T[]>(memoryCacheKey);
  224. if (cachedValue) {
  225. map.set(id, cachedValue);
  226. }
  227. }
  228.  
  229. async function saveRoleToPermissionsToCacheById(id: string) {
  230. const rolesToResourcePermissions: Map<string, string[]> = new Map();
  231. const rolesToDefaultPermissions: Map<string, string[]> = new Map();
  232. const rolesToPropertyPermissions: Map<string, string[]> = new Map();
  233.  
  234. const roleToPermissionList = await getRoleToPermissionList();
  235. let roleIds = [id, ...roleToPermissionList.map((x) => x.roleId)];
  236. roleIds = [...new Set(roleIds)];
  237.  
  238. await addRoleToPermissions(rolesToResourcePermissions, roleToPermissionList, permissionType.resource);
  239. await addRoleToPermissions(rolesToDefaultPermissions, roleToPermissionList, permissionType.default);
  240. await addRoleToPermissions(rolesToPropertyPermissions, roleToPermissionList, permissionType.property);
  241.  
  242. await saveToMemoryCacheByCacheKeyPrefix(
  243. rolesToResourcePermissions,
  244. fdCacheKeys.roleToResourcePermissions,
  245. );
  246. await saveToMemoryCacheByCacheKeyPrefix(rolesToDefaultPermissions, fdCacheKeys.roleToDefaultPermissions);
  247. await saveToMemoryCacheByCacheKeyPrefix(
  248. rolesToPropertyPermissions,
  249. fdCacheKeys.roleToPropertyPermissions,
  250. );
  251. }
  252.  
  253. async function addRoleToPermissions(
  254. rolesToPermissions: Map<string, string[]>,
  255. roleToPermissionList: RoleToPermission[],
  256. type: PermissionType,
  257. ) {
  258. for (const roleToPermissionItem of roleToPermissionList) {
  259. const permission = await getPermission(roleToPermissionItem.permissionId);
  260. if (permission?.type === type) {
  261. addListValueToDictionary(
  262. rolesToPermissions,
  263. roleToPermissionItem.roleId,
  264. roleToPermissionItem.permissionId,
  265. );
  266. }
  267. }
  268. }
  269.  
  270. async function applyPermissionsToPackages(
  271. permissionMap: Map<string, string[]>,
  272. permissionList: PermissionPackageToPermission[],
  273. permissionTypeParam: PermissionType,
  274. packageIds: string[],
  275. ) {
  276. await addPackageToPermissions(permissionMap, permissionList, permissionTypeParam);
  277.  
  278. if (permissionMap.size === 0) {
  279. for (const packId of packageIds) {
  280. permissionMap.set(packId, []);
  281. }
  282. }
  283. }
  284.  
  285. async function privateSavePackageToPermissionsToCache(id: string) {
  286. const packagesToResourcePermissions = new Map<string, string[]>();
  287. const packagesToDefaultPermissions = new Map<string, string[]>();
  288. const packagesToPropertyPermissions = new Map<string, string[]>();
  289.  
  290. const packageToPermissionList = await getPermissionPackageToPermissions();
  291.  
  292. let permissionPackageIds = [id];
  293.  
  294. permissionPackageIds = permissionPackageIds.concat(
  295. packageToPermissionList.map((x) => x.permissionPackageId),
  296. );
  297. permissionPackageIds = Array.from(new Set(permissionPackageIds));
  298.  
  299. await applyPermissionsToPackages(
  300. packagesToResourcePermissions,
  301. packageToPermissionList,
  302. permissionType.resource,
  303. permissionPackageIds,
  304. );
  305.  
  306. await applyPermissionsToPackages(
  307. packagesToDefaultPermissions,
  308. packageToPermissionList,
  309. permissionType.default,
  310. permissionPackageIds,
  311. );
  312.  
  313. await applyPermissionsToPackages(
  314. packagesToPropertyPermissions,
  315. packageToPermissionList,
  316. permissionType.property,
  317. permissionPackageIds,
  318. );
  319.  
  320. await saveToMemoryCacheByCacheKeyPrefix(
  321. packagesToResourcePermissions,
  322. fdCacheKeys.packagesToResourcePermissions,
  323. );
  324. await saveToMemoryCacheByCacheKeyPrefix(
  325. packagesToDefaultPermissions,
  326. fdCacheKeys.packagesToDefaultPermissions,
  327. );
  328. await saveToMemoryCacheByCacheKeyPrefix(
  329. packagesToPropertyPermissions,
  330. fdCacheKeys.packagesToPropertyPermissions,
  331. );
  332. }
  333.  
  334. async function saveRoleToPermissionPackagesToCache() {
  335. const rolesToPackages = new Map<string, string[]>();
  336.  
  337. const roleToPermissionPackageList = await getRoleToPermissionPackages();
  338.  
  339. for (const roleToPermissionPackage of roleToPermissionPackageList) {
  340. addListValueToDictionary(
  341. rolesToPackages,
  342. roleToPermissionPackage.roleId,
  343. roleToPermissionPackage.permissionPackageId,
  344. );
  345. }
  346.  
  347. await saveToMemoryCacheByCacheKeyPrefix(rolesToPackages, fdCacheKeys.roleToPackages);
  348. }
  349.  
  350. async function saveToMemoryCacheByCacheKeyPrefix(
  351. idsToPermissions: Map<string, string[]>,
  352. cacheKeyPrefix: string,
  353. ) {
  354. for (const [key, value] of idsToPermissions) {
  355. const newKey = await getPermissionCacheKey(cacheKeyPrefix, key);
  356. await saveToMemoryCache(newKey, value);
  357. }
  358. }
  359.  
  360. async function saveUserRoleIdsToRolePermissionLevelsToCache() {
  361. const userIdRoleIdsToRolePermissionLevels = await getUserRoleIdsToRoleLevels();
  362.  
  363. for (const [userId, rolePermissionLevels] of userIdRoleIdsToRolePermissionLevels.entries()) {
  364. const key = await getPermissionCacheKey(fdCacheKeys.userRolePermissionLevels, userId);
  365. await saveToMemoryCache(key, rolePermissionLevels);
  366. }
  367. }
  368.  
  369. async function saveToMemoryCache<T extends object>(key: string, value: T) {
  370. const fdMemoryCacheOptions: FdMemoryCacheOptions = {
  371. absoluteExpirationRelativeToNowSeconds: 24 * fdCacheKeys.secondsInAHour,
  372. };
  373.  
  374. setCoreCache(key, value, fdMemoryCacheOptions);
  375. }
  376.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement