@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 +8 -0
- package/dist/index.js +172 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +955 -784
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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 {
|
|
17671
|
-
|
|
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
|
-
|
|
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 {
|
|
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, ""),
|