@7365admin1/core 3.32.2-staging.90 → 3.32.2-staging.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -284,6 +284,7 @@ declare function useRoleRepo(): {
284
284
  type?: string | undefined;
285
285
  org: string | ObjectId;
286
286
  }) => Promise<{}>;
287
+ getActiveByTypeOrg: (type: string, org: string | ObjectId) => Promise<TRole[]>;
287
288
  updateRole: (_id: string | ObjectId, value: TMiniRole, session?: ClientSession) => Promise<ObjectId>;
288
289
  updatePermissionsById: (_id: string | ObjectId, permissions: TRole["permissions"], session?: ClientSession) => Promise<string>;
289
290
  deleteRole: (_id: string | ObjectId, session?: ClientSession) => Promise<string>;
@@ -298,6 +299,8 @@ declare function useRoleController(): {
298
299
  updateRole: (req: Request, res: Response, next: NextFunction) => Promise<void>;
299
300
  updatePermissionsById: (req: Request, res: Response, next: NextFunction) => Promise<void>;
300
301
  deleteRole: (req: Request, res: Response, next: NextFunction) => Promise<void>;
302
+ getDeletionPreview: (req: Request, res: Response, next: NextFunction) => Promise<void>;
303
+ deleteWithReassignments: (req: Request, res: Response, next: NextFunction) => Promise<void>;
301
304
  };
302
305
 
303
306
  type TMember = {
@@ -336,6 +339,7 @@ declare function useMemberRepo(): {
336
339
  getAllByUserId: (user: string | ObjectId) => Promise<TMember[]>;
337
340
  getByUserIdType: (user: string | ObjectId, type: string) => Promise<TMember>;
338
341
  getByRoleId: (role: string | ObjectId) => Promise<any>;
342
+ getAssignedByRoleId: (role: string | ObjectId) => Promise<TMember[]>;
339
343
  getAll: ({ search, page, limit, user, org, siteId, type, status, }: {
340
344
  search?: string | undefined;
341
345
  page?: number | undefined;
@@ -375,6 +379,10 @@ declare function useMemberRepo(): {
375
379
  countByOrg: (org: string | ObjectId) => Promise<number | TMember>;
376
380
  countUserMembershipById: (user: string | ObjectId) => Promise<number | TMember>;
377
381
  updateRoleById: (_id: string | ObjectId, role: string | ObjectId) => Promise<number>;
382
+ reassignRoles: (reassignments: Array<{
383
+ memberId: string;
384
+ roleId: string;
385
+ }>, session: ClientSession) => Promise<void>;
378
386
  getByRoles: (roles: string[] | ObjectId[], type: string) => Promise<TMember[]>;
379
387
  updateSiteById: (_id: string | ObjectId, siteId: string | ObjectId, siteName: string) => Promise<number>;
380
388
  getByUserIdTypeOrg: (user: string | ObjectId, type: string, org: string | ObjectId) => Promise<TMember>;
package/dist/index.js CHANGED
@@ -9722,6 +9722,52 @@ function useMemberRepo() {
9722
9722
  throw error;
9723
9723
  }
9724
9724
  }
9725
+ async function getAssignedByRoleId(role) {
9726
+ try {
9727
+ role = new import_mongodb12.ObjectId(role);
9728
+ } catch (error) {
9729
+ throw new import_node_server_utils12.BadRequestError("Invalid role ID format.");
9730
+ }
9731
+ try {
9732
+ return await collection.find({ role, status: { $ne: "deleted" } }).toArray();
9733
+ } catch (error) {
9734
+ throw new import_node_server_utils12.InternalServerError("Failed to retrieve role members.");
9735
+ }
9736
+ }
9737
+ async function reassignRoles(reassignments, session) {
9738
+ const operations = reassignments.map(({ memberId, roleId }) => {
9739
+ let _id;
9740
+ let role;
9741
+ try {
9742
+ _id = new import_mongodb12.ObjectId(memberId);
9743
+ role = new import_mongodb12.ObjectId(roleId);
9744
+ } catch (error) {
9745
+ throw new import_node_server_utils12.BadRequestError("Invalid member or role ID format.");
9746
+ }
9747
+ return {
9748
+ updateOne: {
9749
+ filter: { _id, status: { $ne: "deleted" } },
9750
+ update: {
9751
+ $set: {
9752
+ role,
9753
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
9754
+ }
9755
+ }
9756
+ }
9757
+ };
9758
+ });
9759
+ if (!operations.length)
9760
+ return;
9761
+ try {
9762
+ const result = await collection.bulkWrite(operations, { session });
9763
+ if (result.matchedCount !== operations.length) {
9764
+ throw new import_node_server_utils12.BadRequestError("One or more assigned members no longer exist.");
9765
+ }
9766
+ await delNamespace();
9767
+ } catch (error) {
9768
+ throw error;
9769
+ }
9770
+ }
9725
9771
  async function getAll({
9726
9772
  search = "",
9727
9773
  page = 1,
@@ -10351,6 +10397,7 @@ function useMemberRepo() {
10351
10397
  getAllByUserId,
10352
10398
  getByUserIdType,
10353
10399
  getByRoleId,
10400
+ getAssignedByRoleId,
10354
10401
  getAll,
10355
10402
  getOrgsByMembership,
10356
10403
  getOrgsByUserId,
@@ -10360,6 +10407,7 @@ function useMemberRepo() {
10360
10407
  countByOrg,
10361
10408
  countUserMembershipById,
10362
10409
  updateRoleById,
10410
+ reassignRoles,
10363
10411
  getByRoles,
10364
10412
  updateSiteById,
10365
10413
  getByUserIdTypeOrg,
@@ -15572,6 +15620,20 @@ function useRoleRepo() {
15572
15620
  throw error;
15573
15621
  }
15574
15622
  }
15623
+ async function getActiveByTypeOrg(type, org) {
15624
+ try {
15625
+ if (typeof org === "string" && org) {
15626
+ org = new import_mongodb30.ObjectId(org);
15627
+ }
15628
+ } catch (error) {
15629
+ throw new import_node_server_utils32.BadRequestError("Invalid organization ID format.");
15630
+ }
15631
+ try {
15632
+ return await collection.find({ status: "active", type, org }).sort({ name: 1 }).toArray();
15633
+ } catch (error) {
15634
+ throw new import_node_server_utils32.InternalServerError("Failed to retrieve replacement roles.");
15635
+ }
15636
+ }
15575
15637
  async function updateRole(_id, value, session) {
15576
15638
  if (!_id) {
15577
15639
  throw new import_node_server_utils32.BadRequestError("Role ID is required.");
@@ -15691,6 +15753,7 @@ function useRoleRepo() {
15691
15753
  getRoleById,
15692
15754
  getRoleByName,
15693
15755
  getRoles,
15756
+ getActiveByTypeOrg,
15694
15757
  updateRole,
15695
15758
  updatePermissionsById,
15696
15759
  deleteRole,
@@ -17667,8 +17730,12 @@ var import_node_server_utils40 = require("@7365admin1/node-server-utils");
17667
17730
  // src/services/role.service.ts
17668
17731
  var import_node_server_utils39 = require("@7365admin1/node-server-utils");
17669
17732
  function useRoleService() {
17670
- const { deleteRole: _deleteRole } = useRoleRepo();
17671
- const { getByRoleId } = useMemberRepo();
17733
+ const {
17734
+ deleteRole: _deleteRole,
17735
+ getActiveByTypeOrg,
17736
+ getRoleById
17737
+ } = useRoleRepo();
17738
+ const { getByRoleId, getAssignedByRoleId, reassignRoles } = useMemberRepo();
17672
17739
  async function deleteRole(_id) {
17673
17740
  try {
17674
17741
  const count = await getByRoleId(_id);
@@ -17682,7 +17749,49 @@ function useRoleService() {
17682
17749
  throw error;
17683
17750
  }
17684
17751
  }
17685
- return { deleteRole };
17752
+ async function getDeletionPreview(_id) {
17753
+ const role = await getRoleById(_id);
17754
+ if (!role) {
17755
+ throw new import_node_server_utils39.NotFoundError("Role not found.");
17756
+ }
17757
+ const members = await getAssignedByRoleId(_id);
17758
+ const replacementRoles = (await getActiveByTypeOrg(role.type ?? "", role.org ?? "")).filter((replacementRole) => replacementRole._id?.toString() !== _id);
17759
+ return { role, members, replacementRoles };
17760
+ }
17761
+ async function deleteWithReassignments(_id, reassignments) {
17762
+ const session = import_node_server_utils39.useAtlas.getClient()?.startSession();
17763
+ if (!session) {
17764
+ throw new import_node_server_utils39.InternalServerError("Unable to start role deletion transaction.");
17765
+ }
17766
+ try {
17767
+ session.startTransaction();
17768
+ const { members, replacementRoles } = await getDeletionPreview(_id);
17769
+ const memberIds = members.map((member) => member._id?.toString() ?? "");
17770
+ const reassignedMemberIds = reassignments.map(
17771
+ ({ memberId }) => memberId
17772
+ );
17773
+ const replacementRoleIds = new Set(
17774
+ replacementRoles.map((role) => role._id?.toString() ?? "")
17775
+ );
17776
+ const hasExactMemberCoverage = reassignedMemberIds.length === memberIds.length && new Set(reassignedMemberIds).size === reassignedMemberIds.length && memberIds.every((memberId) => reassignedMemberIds.includes(memberId));
17777
+ const hasEligibleReplacementRoles = reassignments.every(
17778
+ ({ roleId }) => replacementRoleIds.has(roleId)
17779
+ );
17780
+ if (!hasExactMemberCoverage || !hasEligibleReplacementRoles) {
17781
+ throw new import_node_server_utils39.BadRequestError("Invalid role reassignment request.");
17782
+ }
17783
+ await reassignRoles(reassignments, session);
17784
+ await _deleteRole(_id, session);
17785
+ await session.commitTransaction();
17786
+ return "Successfully reassigned members and deleted role permission.";
17787
+ } catch (error) {
17788
+ await session.abortTransaction();
17789
+ throw error;
17790
+ } finally {
17791
+ await session.endSession();
17792
+ }
17793
+ }
17794
+ return { deleteRole, getDeletionPreview, deleteWithReassignments };
17686
17795
  }
17687
17796
 
17688
17797
  // src/controllers/role.controller.ts
@@ -17695,7 +17804,11 @@ function useRoleController() {
17695
17804
  updateRole: _updateRole,
17696
17805
  updatePermissionsById: _updatePermissionsById
17697
17806
  } = useRoleRepo();
17698
- const { deleteRole: _deleteRole } = useRoleService();
17807
+ const {
17808
+ deleteRole: _deleteRole,
17809
+ getDeletionPreview: _getDeletionPreview,
17810
+ deleteWithReassignments: _deleteWithReassignments
17811
+ } = useRoleService();
17699
17812
  async function createRole(req, res, next) {
17700
17813
  const validation = import_joi19.default.object({
17701
17814
  name: import_joi19.default.string().required(),
@@ -17859,6 +17972,57 @@ function useRoleController() {
17859
17972
  return;
17860
17973
  }
17861
17974
  }
17975
+ async function getDeletionPreview(req, res, next) {
17976
+ const validation = import_joi19.default.string().hex().required();
17977
+ const _id = req.params.id;
17978
+ const { error } = validation.validate(_id);
17979
+ if (error) {
17980
+ import_node_server_utils40.logger.log({ level: "error", message: error.message });
17981
+ next(new import_node_server_utils40.BadRequestError(error.message));
17982
+ return;
17983
+ }
17984
+ try {
17985
+ const data = await _getDeletionPreview(_id);
17986
+ res.json({ data });
17987
+ return;
17988
+ } catch (error2) {
17989
+ import_node_server_utils40.logger.log({ level: "error", message: error2.message });
17990
+ next(error2);
17991
+ return;
17992
+ }
17993
+ }
17994
+ async function deleteWithReassignments(req, res, next) {
17995
+ const validation = import_joi19.default.object({
17996
+ id: import_joi19.default.string().hex().required(),
17997
+ reassignments: import_joi19.default.array().items(
17998
+ import_joi19.default.object({
17999
+ memberId: import_joi19.default.string().hex().required(),
18000
+ roleId: import_joi19.default.string().hex().required()
18001
+ })
18002
+ ).required()
18003
+ });
18004
+ const { error } = validation.validate({
18005
+ id: req.params.id,
18006
+ reassignments: req.body.reassignments
18007
+ });
18008
+ if (error) {
18009
+ import_node_server_utils40.logger.log({ level: "error", message: error.message });
18010
+ next(new import_node_server_utils40.BadRequestError(error.message));
18011
+ return;
18012
+ }
18013
+ try {
18014
+ const message = await _deleteWithReassignments(
18015
+ req.params.id,
18016
+ req.body.reassignments
18017
+ );
18018
+ res.json({ message });
18019
+ return;
18020
+ } catch (error2) {
18021
+ import_node_server_utils40.logger.log({ level: "error", message: error2.message });
18022
+ next(error2);
18023
+ return;
18024
+ }
18025
+ }
17862
18026
  return {
17863
18027
  createRole,
17864
18028
  getRoles,
@@ -17866,7 +18030,9 @@ function useRoleController() {
17866
18030
  getRoleById,
17867
18031
  updateRole,
17868
18032
  updatePermissionsById,
17869
- deleteRole
18033
+ deleteRole,
18034
+ getDeletionPreview,
18035
+ deleteWithReassignments
17870
18036
  };
17871
18037
  }
17872
18038
 
@@ -33619,7 +33785,7 @@ function useBuildingController() {
33619
33785
  const requiredFields = ["block", "name"];
33620
33786
  const rowSchema = import_joi52.default.object({
33621
33787
  block: import_joi52.default.number().integer().min(0).required(),
33622
- name: import_joi52.default.string().trim().required(),
33788
+ name: import_joi52.default.alternatives().try(import_joi52.default.string(), import_joi52.default.number()).custom((value) => String(value).trim()).required(),
33623
33789
  level: import_joi52.default.alternatives().try(import_joi52.default.string(), import_joi52.default.number()).custom((value) => String(value)).optional().allow(null, ""),
33624
33790
  unit: import_joi52.default.alternatives().try(import_joi52.default.string(), import_joi52.default.number()).custom((value) => String(value)).optional().allow(null, ""),
33625
33791
  category: import_joi52.default.string().trim().optional().allow(null, ""),