@starklabs/forge 1.3.23 → 1.3.24-beta.0
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/js/account/index.d.ts +1 -1
- package/dist/js/account/index.d.ts.map +1 -1
- package/dist/js/account/index.js +14 -7
- package/dist/js/account/index.js.map +1 -1
- package/dist/js/account/me.delete.d.ts +2 -2
- package/dist/js/account/me.delete.d.ts.map +1 -1
- package/dist/js/account/me.delete.js +15 -6
- package/dist/js/account/me.delete.js.map +1 -1
- package/dist/js/account/me.update.d.ts +3 -3
- package/dist/js/account/me.update.d.ts.map +1 -1
- package/dist/js/account/me.update.js +20 -7
- package/dist/js/account/me.update.js.map +1 -1
- package/dist/js/app.js +21 -8
- package/dist/js/app.js.map +1 -1
- package/dist/js/auth/builtin/auth.collection.js +11 -11
- package/dist/js/auth/builtin/auth.collection.js.map +1 -1
- package/dist/js/auth/forgotPassword.d.ts +4 -4
- package/dist/js/auth/forgotPassword.d.ts.map +1 -1
- package/dist/js/auth/forgotPassword.js +12 -6
- package/dist/js/auth/forgotPassword.js.map +1 -1
- package/dist/js/auth/index.d.ts +1 -1
- package/dist/js/auth/index.d.ts.map +1 -1
- package/dist/js/auth/index.js +16 -8
- package/dist/js/auth/index.js.map +1 -1
- package/dist/js/auth/login.d.ts +4 -4
- package/dist/js/auth/login.d.ts.map +1 -1
- package/dist/js/auth/login.js +8 -4
- package/dist/js/auth/login.js.map +1 -1
- package/dist/js/auth/logout.js +6 -1
- package/dist/js/auth/logout.js.map +1 -1
- package/dist/js/auth/refresh.js +9 -0
- package/dist/js/auth/refresh.js.map +1 -1
- package/dist/js/auth/resendOTP.d.ts +4 -4
- package/dist/js/auth/resendOTP.d.ts.map +1 -1
- package/dist/js/auth/resendOTP.js +14 -4
- package/dist/js/auth/resendOTP.js.map +1 -1
- package/dist/js/auth/resetPassword.d.ts +4 -4
- package/dist/js/auth/resetPassword.d.ts.map +1 -1
- package/dist/js/auth/resetPassword.js +14 -4
- package/dist/js/auth/resetPassword.js.map +1 -1
- package/dist/js/auth/signup.d.ts +4 -4
- package/dist/js/auth/signup.d.ts.map +1 -1
- package/dist/js/auth/signup.js +10 -5
- package/dist/js/auth/signup.js.map +1 -1
- package/dist/js/auth/utils/authenticateUser.d.ts +3 -3
- package/dist/js/auth/utils/authenticateUser.d.ts.map +1 -1
- package/dist/js/auth/utils/authenticateUser.js +13 -3
- package/dist/js/auth/utils/authenticateUser.js.map +1 -1
- package/dist/js/auth/utils/createOTPModel.d.ts +1 -1
- package/dist/js/auth/utils/createOTPModel.d.ts.map +1 -1
- package/dist/js/auth/utils/createOTPModel.js +8 -3
- package/dist/js/auth/utils/createOTPModel.js.map +1 -1
- package/dist/js/auth/utils/createOTPUser.d.ts +3 -3
- package/dist/js/auth/utils/createOTPUser.d.ts.map +1 -1
- package/dist/js/auth/utils/createOTPUser.js +11 -3
- package/dist/js/auth/utils/createOTPUser.js.map +1 -1
- package/dist/js/auth/utils/createUser.d.ts +3 -3
- package/dist/js/auth/utils/createUser.d.ts.map +1 -1
- package/dist/js/auth/utils/createUser.js +12 -2
- package/dist/js/auth/utils/createUser.js.map +1 -1
- package/dist/js/auth/utils/findRefreshToken.js +5 -1
- package/dist/js/auth/utils/findRefreshToken.js.map +1 -1
- package/dist/js/auth/utils/findRefreshTokenUser.js +1 -0
- package/dist/js/auth/utils/findRefreshTokenUser.js.map +1 -1
- package/dist/js/auth/utils/getOTPUser.js +3 -0
- package/dist/js/auth/utils/getOTPUser.js.map +1 -1
- package/dist/js/auth/utils/getUser.d.ts +3 -3
- package/dist/js/auth/utils/getUser.d.ts.map +1 -1
- package/dist/js/auth/utils/getUser.js +6 -2
- package/dist/js/auth/utils/getUser.js.map +1 -1
- package/dist/js/auth/utils/handleRefreshTokenValidation.js +7 -1
- package/dist/js/auth/utils/handleRefreshTokenValidation.js.map +1 -1
- package/dist/js/auth/utils/handleRotateRefreshToken.js +7 -1
- package/dist/js/auth/utils/handleRotateRefreshToken.js.map +1 -1
- package/dist/js/auth/utils/modeMap.d.ts +12 -12
- package/dist/js/auth/utils/otpVerifiedResponse.js +1 -0
- package/dist/js/auth/utils/otpVerifiedResponse.js.map +1 -1
- package/dist/js/auth/utils/sendCookie.js +10 -0
- package/dist/js/auth/utils/sendCookie.js.map +1 -1
- package/dist/js/auth/utils/verifyCredentials.d.ts +3 -3
- package/dist/js/auth/utils/verifyCredentials.d.ts.map +1 -1
- package/dist/js/auth/utils/verifyCredentials.js +8 -6
- package/dist/js/auth/utils/verifyCredentials.js.map +1 -1
- package/dist/js/auth/verifyOTP.d.ts +4 -4
- package/dist/js/auth/verifyOTP.d.ts.map +1 -1
- package/dist/js/auth/verifyOTP.js +18 -5
- package/dist/js/auth/verifyOTP.js.map +1 -1
- package/dist/js/config/cloudinary.js +1 -0
- package/dist/js/config/cloudinary.js.map +1 -1
- package/dist/js/config/duration.js +7 -0
- package/dist/js/config/duration.js.map +1 -1
- package/dist/js/config/envs.js +23 -3
- package/dist/js/config/envs.js.map +1 -1
- package/dist/js/config/handleReqType.d.ts +1 -1
- package/dist/js/config/handleReqType.d.ts.map +1 -1
- package/dist/js/config/handleReqType.js +4 -3
- package/dist/js/config/handleReqType.js.map +1 -1
- package/dist/js/config/handlerMap.js +4 -0
- package/dist/js/config/handlerMap.js.map +1 -1
- package/dist/js/config/refreshModel.js +1 -0
- package/dist/js/config/refreshModel.js.map +1 -1
- package/dist/js/config/sendEmail.js +1 -0
- package/dist/js/config/sendEmail.js.map +1 -1
- package/dist/js/crud/bunch.crud.js +2 -0
- package/dist/js/crud/bunch.crud.js.map +1 -1
- package/dist/js/crud/create.d.ts +4 -4
- package/dist/js/crud/create.d.ts.map +1 -1
- package/dist/js/crud/create.js +23 -8
- package/dist/js/crud/create.js.map +1 -1
- package/dist/js/crud/createBulk.d.ts +4 -4
- package/dist/js/crud/createBulk.d.ts.map +1 -1
- package/dist/js/crud/createBulk.js +8 -3
- package/dist/js/crud/createBulk.js.map +1 -1
- package/dist/js/crud/email/index.d.ts +2 -0
- package/dist/js/crud/email/index.d.ts.map +1 -0
- package/dist/js/crud/email/index.js +2 -0
- package/dist/js/crud/email/index.js.map +1 -0
- package/dist/js/crud/encryption/handleDecryption.js +8 -3
- package/dist/js/crud/encryption/handleDecryption.js.map +1 -1
- package/dist/js/crud/encryption/handleEncryption.js +7 -3
- package/dist/js/crud/encryption/handleEncryption.js.map +1 -1
- package/dist/js/crud/handleUploads/file.add.d.ts +4 -4
- package/dist/js/crud/handleUploads/file.add.d.ts.map +1 -1
- package/dist/js/crud/handleUploads/file.add.js +16 -9
- package/dist/js/crud/handleUploads/file.add.js.map +1 -1
- package/dist/js/crud/handleUploads/file.delete.d.ts +4 -4
- package/dist/js/crud/handleUploads/file.delete.d.ts.map +1 -1
- package/dist/js/crud/handleUploads/file.delete.js +14 -5
- package/dist/js/crud/handleUploads/file.delete.js.map +1 -1
- package/dist/js/crud/handleUploads/file.update.d.ts +4 -4
- package/dist/js/crud/handleUploads/file.update.d.ts.map +1 -1
- package/dist/js/crud/handleUploads/file.update.js +15 -5
- package/dist/js/crud/handleUploads/file.update.js.map +1 -1
- package/dist/js/crud/index.d.ts +1 -1
- package/dist/js/crud/index.d.ts.map +1 -1
- package/dist/js/crud/index.js +18 -11
- package/dist/js/crud/index.js.map +1 -1
- package/dist/js/crud/read.d.ts +4 -4
- package/dist/js/crud/read.d.ts.map +1 -1
- package/dist/js/crud/read.js +18 -9
- package/dist/js/crud/read.js.map +1 -1
- package/dist/js/crud/readAll.d.ts +3 -3
- package/dist/js/crud/readAll.d.ts.map +1 -1
- package/dist/js/crud/readAll.js +16 -8
- package/dist/js/crud/readAll.js.map +1 -1
- package/dist/js/crud/remove.d.ts +3 -3
- package/dist/js/crud/remove.d.ts.map +1 -1
- package/dist/js/crud/remove.js +19 -8
- package/dist/js/crud/remove.js.map +1 -1
- package/dist/js/crud/removeAll.d.ts +3 -3
- package/dist/js/crud/removeAll.d.ts.map +1 -1
- package/dist/js/crud/removeAll.js +13 -5
- package/dist/js/crud/removeAll.js.map +1 -1
- package/dist/js/crud/removeMultiple.d.ts +4 -4
- package/dist/js/crud/removeMultiple.d.ts.map +1 -1
- package/dist/js/crud/removeMultiple.js +18 -7
- package/dist/js/crud/removeMultiple.js.map +1 -1
- package/dist/js/crud/security/handleDecryption.js +8 -3
- package/dist/js/crud/security/handleDecryption.js.map +1 -1
- package/dist/js/crud/security/handleEncryption.js +7 -3
- package/dist/js/crud/security/handleEncryption.js.map +1 -1
- package/dist/js/crud/security/handleHashing.js +8 -3
- package/dist/js/crud/security/handleHashing.js.map +1 -1
- package/dist/js/crud/update.d.ts +4 -4
- package/dist/js/crud/update.d.ts.map +1 -1
- package/dist/js/crud/update.js +24 -9
- package/dist/js/crud/update.js.map +1 -1
- package/dist/js/crud/utils/authorizeAccess.d.ts +2 -2
- package/dist/js/crud/utils/authorizeAccess.d.ts.map +1 -1
- package/dist/js/crud/utils/authorizeAccess.js +19 -13
- package/dist/js/crud/utils/authorizeAccess.js.map +1 -1
- package/dist/js/crud/utils/getItem.d.ts +3 -3
- package/dist/js/crud/utils/getItem.d.ts.map +1 -1
- package/dist/js/crud/utils/getItem.js +18 -9
- package/dist/js/crud/utils/getItem.js.map +1 -1
- package/dist/js/health/health.collection.js +11 -11
- package/dist/js/health/health.collection.js.map +1 -1
- package/dist/js/health/index.d.ts +1 -1
- package/dist/js/health/index.d.ts.map +1 -1
- package/dist/js/health/index.js +2 -2
- package/dist/js/health/index.js.map +1 -1
- package/dist/js/lib/OAuthProviders.js +1 -1
- package/dist/js/lib/OAuthProviders.js.map +1 -1
- package/dist/js/lib/db.js +1 -0
- package/dist/js/lib/db.js.map +1 -1
- package/dist/js/lib/model.factory.d.ts +10 -1
- package/dist/js/lib/model.factory.d.ts.map +1 -1
- package/dist/js/lib/model.factory.js +18 -4
- package/dist/js/lib/model.factory.js.map +1 -1
- package/dist/js/lib/model.registry.js +1 -0
- package/dist/js/lib/model.registry.js.map +1 -1
- package/dist/js/lib/mongoose.fields.js +20 -0
- package/dist/js/lib/mongoose.fields.js.map +1 -1
- package/dist/js/lib/schema.builder.js +3 -0
- package/dist/js/lib/schema.builder.js.map +1 -1
- package/dist/js/lib/unified.fields.d.ts +5 -0
- package/dist/js/lib/unified.fields.d.ts.map +1 -1
- package/dist/js/lib/unified.fields.js +56 -0
- package/dist/js/lib/unified.fields.js.map +1 -1
- package/dist/js/lib/unified.types.d.ts +3 -0
- package/dist/js/lib/unified.types.d.ts.map +1 -1
- package/dist/js/lib/zod.factory.d.ts +13 -0
- package/dist/js/lib/zod.factory.d.ts.map +1 -1
- package/dist/js/lib/zod.factory.js +14 -0
- package/dist/js/lib/zod.factory.js.map +1 -1
- package/dist/js/lib/zod.fields.d.ts +55 -0
- package/dist/js/lib/zod.fields.d.ts.map +1 -1
- package/dist/js/lib/zod.fields.js +56 -0
- package/dist/js/lib/zod.fields.js.map +1 -1
- package/dist/js/middleware/error.middleware.js +1 -0
- package/dist/js/middleware/error.middleware.js.map +1 -1
- package/dist/js/middleware/multer.middleware.d.ts +1 -1
- package/dist/js/middleware/multer.middleware.d.ts.map +1 -1
- package/dist/js/middleware/multer.middleware.js +22 -7
- package/dist/js/middleware/multer.middleware.js.map +1 -1
- package/dist/js/terminal/appInfo.js +11 -11
- package/dist/js/terminal/appInfo.js.map +1 -1
- package/dist/js/terminal/logger.js +1 -1
- package/dist/js/terminal/logger.js.map +1 -1
- package/dist/js/types/ActionHandler.d.ts +86 -11
- package/dist/js/types/ActionHandler.d.ts.map +1 -1
- package/dist/js/types/Collection.d.ts +104 -15
- package/dist/js/types/Collection.d.ts.map +1 -1
- package/dist/js/types/Constructor.d.ts +1 -1
- package/dist/js/types/Constructor.d.ts.map +1 -1
- package/dist/js/types/Route.d.ts +131 -14
- package/dist/js/types/Route.d.ts.map +1 -1
- package/dist/js/types/Routepath.js +15 -0
- package/dist/js/types/Routepath.js.map +1 -1
- package/dist/js/types/email.js +13 -0
- package/dist/js/types/email.js.map +1 -1
- package/dist/js/types/upload.d.ts +57 -5
- package/dist/js/types/upload.d.ts.map +1 -1
- package/dist/js/upload/create.js +9 -6
- package/dist/js/upload/create.js.map +1 -1
- package/dist/js/upload/delete.js +21 -21
- package/dist/js/upload/delete.js.map +1 -1
- package/dist/js/upload/update.js +21 -21
- package/dist/js/upload/update.js.map +1 -1
- package/dist/js/utils/getErrorDetail.d.ts +2 -2
- package/dist/js/utils/getErrorDetail.d.ts.map +1 -1
- package/dist/js/utils/getErrorDetail.js +2 -2
- package/dist/js/utils/getErrorDetail.js.map +1 -1
- package/dist/js/utils/getModel.d.ts +3 -3
- package/dist/js/utils/getModel.d.ts.map +1 -1
- package/dist/js/utils/getModel.js +6 -6
- package/dist/js/utils/getModel.js.map +1 -1
- package/dist/js/utils/libsodium.js +6 -0
- package/dist/js/utils/libsodium.js.map +1 -1
- package/dist/js/utils/otpPurposes.js +38 -0
- package/dist/js/utils/otpPurposes.js.map +1 -1
- package/dist/js/utils/sanitize.js +23 -2
- package/dist/js/utils/sanitize.js.map +1 -1
- package/dist/js/utils/saveRefreshToken.js +2 -1
- package/dist/js/utils/saveRefreshToken.js.map +1 -1
- package/dist/js/utils/validate.js +5 -3
- package/dist/js/utils/validate.js.map +1 -1
- package/dist/js/utils/validationKeyError.d.ts +1 -1
- package/dist/js/utils/validationKeyError.d.ts.map +1 -1
- package/dist/js/utils/validationKeyError.js +13 -8
- package/dist/js/utils/validationKeyError.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +29 -29
package/dist/js/crud/remove.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Request, Response } from "express";
|
|
2
2
|
import type { Route } from "../types/Collection.ts";
|
|
3
|
-
declare const remove: ({
|
|
4
|
-
|
|
3
|
+
declare const remove: ({ model, route, routeObj, }: {
|
|
4
|
+
model: string;
|
|
5
5
|
routeObj: Route;
|
|
6
|
-
|
|
6
|
+
route: string;
|
|
7
7
|
}) => (req: Request, res: Response) => Promise<void>;
|
|
8
8
|
export default remove;
|
|
9
9
|
//# sourceMappingURL=remove.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/js/crud/remove.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAIpD,QAAA,MAAM,MAAM,GAAI,
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/js/crud/remove.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAIpD,QAAA,MAAM,MAAM,GAAI,6BAIb;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,MACe,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CA2DzD,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/js/crud/remove.js
CHANGED
|
@@ -5,38 +5,49 @@ import appResponse from "../utils/response.js";
|
|
|
5
5
|
import authorizeAccess from "./utils/authorizeAccess.js";
|
|
6
6
|
import { sanitizeOne } from "../utils/sanitize.js";
|
|
7
7
|
import runActions from "./utils/runActions.js";
|
|
8
|
-
const remove = ({
|
|
8
|
+
const remove = ({ model, route, routeObj, }) => {
|
|
9
9
|
return async (req, res) => {
|
|
10
|
+
// get /:parameter
|
|
10
11
|
const id = getParam({ req, routeObj });
|
|
12
|
+
// ensure item exists
|
|
11
13
|
const item = await getItem({
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
model,
|
|
15
|
+
route,
|
|
14
16
|
_id: id,
|
|
15
17
|
routeObj,
|
|
16
18
|
});
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
// authorize access
|
|
20
|
+
authorizeAccess({ routeObj, route, item, req });
|
|
21
|
+
// model
|
|
22
|
+
const Model = getModel({ model, route, routeObj });
|
|
23
|
+
// runActions object
|
|
19
24
|
const ActionObj = {
|
|
20
25
|
req,
|
|
21
26
|
user: req.user,
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
route,
|
|
28
|
+
model,
|
|
24
29
|
Model,
|
|
25
30
|
};
|
|
31
|
+
// before action
|
|
26
32
|
let modifiedResponse = await runActions(routeObj.actions?.before, {
|
|
27
33
|
operation: "remove",
|
|
28
34
|
...ActionObj,
|
|
29
35
|
});
|
|
36
|
+
// delete
|
|
30
37
|
const deletedItem = await Model.findByIdAndDelete(id);
|
|
38
|
+
// clean
|
|
31
39
|
const cleaned = sanitizeOne(deletedItem.toObject(), routeObj);
|
|
32
|
-
|
|
40
|
+
// if '_id' excluded
|
|
41
|
+
const idExcluded = routeObj.config?.hiddenFields?.includes("_id");
|
|
33
42
|
if (idExcluded)
|
|
34
43
|
delete cleaned["_id"];
|
|
44
|
+
// after action
|
|
35
45
|
modifiedResponse = await runActions(routeObj.actions?.after, {
|
|
36
46
|
...ActionObj,
|
|
37
47
|
operation: "remove",
|
|
38
48
|
item: cleaned,
|
|
39
49
|
});
|
|
50
|
+
// return response
|
|
40
51
|
appResponse({
|
|
41
52
|
res,
|
|
42
53
|
message: "Item deleted successfully!",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/js/crud/remove.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG,CAAC,EACd,
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/js/crud/remove.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG,CAAC,EACd,KAAK,EACL,KAAK,EACL,QAAQ,GAKT,EAAE,EAAE;IACH,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAC1D,kBAAkB;QAClB,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEvC,qBAAqB;QACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;YACzB,KAAK;YACL,KAAK;YACL,GAAG,EAAE,EAAY;YACjB,QAAQ;SACT,CAAC,CAAC;QAEH,mBAAmB;QACnB,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAEhD,QAAQ;QACR,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnD,oBAAoB;QACpB,MAAM,SAAS,GAAG;YAChB,GAAG;YACH,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK;YACL,KAAK;YACL,KAAK;SACN,CAAC;QAEF,gBAAgB;QAChB,IAAI,gBAAgB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;YAChE,SAAS,EAAE,QAAQ;YACnB,GAAG,SAAS;SACb,CAAC,CAAC;QAEH,SAAS;QACT,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAEtD,QAAQ;QACR,MAAM,OAAO,GAAG,WAAW,CAAC,WAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE/D,oBAAoB;QACpB,MAAM,UAAU,GACd,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,UAAU;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QAEtC,eAAe;QACf,gBAAgB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE;YAC3D,GAAG,SAAS;YACZ,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,kBAAkB;QAClB,WAAW,CAAC;YACV,GAAG;YACH,OAAO,EAAE,4BAA4B;YACrC,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,gBAAgB,IAAI,OAAO;SAClC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Request, Response } from "express";
|
|
2
2
|
import type { Route } from "../types/Collection.ts";
|
|
3
|
-
declare const removeAll: ({
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
declare const removeAll: ({ model, route, routeObj, }: {
|
|
4
|
+
model: string;
|
|
5
|
+
route: string;
|
|
6
6
|
routeObj: Route;
|
|
7
7
|
}) => (req: Request, res: Response) => Promise<void>;
|
|
8
8
|
export default removeAll;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeAll.d.ts","sourceRoot":"","sources":["../../../src/js/crud/removeAll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAU,MAAM,SAAS,CAAC;AAIzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAKpD,QAAA,MAAM,SAAS,GAAI,
|
|
1
|
+
{"version":3,"file":"removeAll.d.ts","sourceRoot":"","sources":["../../../src/js/crud/removeAll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAU,MAAM,SAAS,CAAC;AAIzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAKpD,QAAA,MAAM,SAAS,GAAI,6BAIhB;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;CACjB,MACe,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAsDzD,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -4,22 +4,28 @@ import authorizeAccess from "./utils/authorizeAccess.js";
|
|
|
4
4
|
import AppError from "../utils/AppError.js";
|
|
5
5
|
import getErrorDetail from "../utils/getErrorDetail.js";
|
|
6
6
|
import runActions from "./utils/runActions.js";
|
|
7
|
-
const removeAll = ({
|
|
7
|
+
const removeAll = ({ model, route, routeObj, }) => {
|
|
8
8
|
return async (req, res) => {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
// authorize access
|
|
10
|
+
authorizeAccess({ routeObj, route, req });
|
|
11
|
+
// model
|
|
12
|
+
const Model = getModel({ model, route, routeObj });
|
|
13
|
+
// runActions object
|
|
11
14
|
const ActionObj = {
|
|
12
15
|
req,
|
|
13
16
|
user: req.user,
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
route,
|
|
18
|
+
model,
|
|
16
19
|
Model,
|
|
17
20
|
};
|
|
21
|
+
// before action
|
|
18
22
|
let modifiedResponse = await runActions(routeObj.actions?.before, {
|
|
19
23
|
operation: "removeAll",
|
|
20
24
|
...ActionObj,
|
|
21
25
|
});
|
|
26
|
+
// delete all
|
|
22
27
|
const result = await Model.deleteMany({});
|
|
28
|
+
// if item(s) not found
|
|
23
29
|
const notFound = !result || result.deletedCount === 0;
|
|
24
30
|
if (notFound) {
|
|
25
31
|
throw new AppError({
|
|
@@ -29,11 +35,13 @@ const removeAll = ({ modelName, routeName, routeObj, }) => {
|
|
|
29
35
|
details: getErrorDetail(routeObj),
|
|
30
36
|
});
|
|
31
37
|
}
|
|
38
|
+
// after action
|
|
32
39
|
modifiedResponse = await runActions(routeObj.actions?.before, {
|
|
33
40
|
operation: "removeAll",
|
|
34
41
|
...ActionObj,
|
|
35
42
|
item: result,
|
|
36
43
|
});
|
|
44
|
+
// return response
|
|
37
45
|
appResponse({
|
|
38
46
|
res,
|
|
39
47
|
data: modifiedResponse ?? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeAll.js","sourceRoot":"","sources":["../../../src/js/crud/removeAll.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,MAAM,SAAS,GAAG,CAAC,EACjB,
|
|
1
|
+
{"version":3,"file":"removeAll.js","sourceRoot":"","sources":["../../../src/js/crud/removeAll.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,eAAe,MAAM,4BAA4B,CAAC;AAEzD,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,MAAM,SAAS,GAAG,CAAC,EACjB,KAAK,EACL,KAAK,EACL,QAAQ,GAKT,EAAE,EAAE;IACH,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAC1D,mBAAmB;QACnB,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1C,QAAQ;QACR,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnD,oBAAoB;QACpB,MAAM,SAAS,GAAG;YAChB,GAAG;YACH,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK;YACL,KAAK;YACL,KAAK;SACN,CAAC;QAEF,gBAAgB;QAChB,IAAI,gBAAgB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;YAChE,SAAS,EAAE,WAAW;YACtB,GAAG,SAAS;SACb,CAAC,CAAC;QAEH,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAE1C,uBAAuB;QACvB,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC;QAEtD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EAAE,0BAA0B;gBACnC,UAAU,EAAE,GAAG;gBACf,IAAI,EAAE,sCAAsC;gBAC5C,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;QAED,eAAe;QACf,gBAAgB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;YAC5D,SAAS,EAAE,WAAW;YACtB,GAAG,SAAS;YACZ,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,kBAAkB;QAClB,WAAW,CAAC;YACV,GAAG;YACH,IAAI,EAAE,gBAAgB,IAAI;gBACxB,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC;YACD,OAAO,EAAE,6BAA6B;YACtC,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Request, Response } from "express";
|
|
2
2
|
import type { Route, ValidationsObj } from "../types/Collection.ts";
|
|
3
|
-
declare const removeMultiple: ({
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
declare const removeMultiple: ({ model, route, routeObj, validations, }: {
|
|
4
|
+
model: string;
|
|
5
|
+
route: string;
|
|
6
6
|
routeObj: Route;
|
|
7
|
-
|
|
7
|
+
validations: ValidationsObj;
|
|
8
8
|
}) => (req: Request, res: Response) => Promise<void>;
|
|
9
9
|
export default removeMultiple;
|
|
10
10
|
//# sourceMappingURL=removeMultiple.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeMultiple.d.ts","sourceRoot":"","sources":["../../../src/js/crud/removeMultiple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAU,MAAM,SAAS,CAAC;AAGzD,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAOpE,QAAA,MAAM,cAAc,GAAI,
|
|
1
|
+
{"version":3,"file":"removeMultiple.d.ts","sourceRoot":"","sources":["../../../src/js/crud/removeMultiple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAU,MAAM,SAAS,CAAC;AAGzD,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAOpE,QAAA,MAAM,cAAc,GAAI,0CAKrB;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;IAChB,WAAW,EAAE,cAAc,CAAC;CAC7B,MACe,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAwEzD,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -5,34 +5,43 @@ import getValidationKey from "../utils/validationKeyError.js";
|
|
|
5
5
|
import getErrorDetail from "../utils/getErrorDetail.js";
|
|
6
6
|
import validate from "../utils/validate.js";
|
|
7
7
|
import runActions from "./utils/runActions.js";
|
|
8
|
-
const removeMultiple = ({
|
|
8
|
+
const removeMultiple = ({ model, route, routeObj, validations, }) => {
|
|
9
9
|
return async (req, res) => {
|
|
10
|
-
|
|
11
|
-
const
|
|
10
|
+
// validationObj
|
|
11
|
+
const validationObj = getValidationKey(routeObj, validations);
|
|
12
|
+
// authorize access
|
|
13
|
+
// model
|
|
14
|
+
const Model = getModel({ model, route, routeObj });
|
|
15
|
+
// runActions object
|
|
12
16
|
const ActionObj = {
|
|
13
17
|
req,
|
|
14
18
|
user: req.user,
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
route,
|
|
20
|
+
model,
|
|
17
21
|
Model,
|
|
18
22
|
};
|
|
23
|
+
// before action
|
|
19
24
|
let modifiedResponse = await runActions(routeObj.actions?.before, {
|
|
20
25
|
operation: "removeMultiple",
|
|
21
26
|
...ActionObj,
|
|
22
27
|
});
|
|
28
|
+
// body
|
|
23
29
|
const body = validate(validationObj, req.body, routeObj);
|
|
24
|
-
|
|
30
|
+
// ids - field name
|
|
31
|
+
const idsFieldName = routeObj.config?.targetField;
|
|
25
32
|
if (!idsFieldName)
|
|
26
33
|
throw new AppError({
|
|
27
34
|
details: getErrorDetail(routeObj),
|
|
28
|
-
hint: "Write the array name in routes -> route ->
|
|
35
|
+
hint: "Write the array name in routes -> route -> config -> targetField that has items' ids to delete",
|
|
29
36
|
message: "Ids field name missing",
|
|
30
37
|
statusCode: 409,
|
|
31
38
|
});
|
|
39
|
+
// delete all
|
|
32
40
|
const result = await Model.deleteMany({
|
|
33
41
|
_id: { $in: body[idsFieldName] },
|
|
34
42
|
owner: req.user._id,
|
|
35
43
|
});
|
|
44
|
+
// if item(s) not found
|
|
36
45
|
const notFound = !result || result.deletedCount === 0;
|
|
37
46
|
if (notFound) {
|
|
38
47
|
throw new AppError({
|
|
@@ -42,11 +51,13 @@ const removeMultiple = ({ modelName, routeName, routeObj, validationsObj, }) =>
|
|
|
42
51
|
details: getErrorDetail(routeObj),
|
|
43
52
|
});
|
|
44
53
|
}
|
|
54
|
+
// after action
|
|
45
55
|
modifiedResponse = await runActions(routeObj.actions?.before, {
|
|
46
56
|
operation: "removeMultiple",
|
|
47
57
|
...ActionObj,
|
|
48
58
|
item: result,
|
|
49
59
|
});
|
|
60
|
+
// return response
|
|
50
61
|
appResponse({
|
|
51
62
|
res,
|
|
52
63
|
data: modifiedResponse ?? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeMultiple.js","sourceRoot":"","sources":["../../../src/js/crud/removeMultiple.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAE/C,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,MAAM,cAAc,GAAG,CAAC,EACtB,
|
|
1
|
+
{"version":3,"file":"removeMultiple.js","sourceRoot":"","sources":["../../../src/js/crud/removeMultiple.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAE/C,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,MAAM,cAAc,GAAG,CAAC,EACtB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,GAMZ,EAAE,EAAE;IACH,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAC1D,gBAAgB;QAChB,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE9D,mBAAmB;QAEnB,QAAQ;QACR,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnD,oBAAoB;QACpB,MAAM,SAAS,GAAG;YAChB,GAAG;YACH,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK;YACL,KAAK;YACL,KAAK;SACN,CAAC;QAEF,gBAAgB;QAChB,IAAI,gBAAgB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;YAChE,SAAS,EAAE,gBAAgB;YAC3B,GAAG,SAAS;SACb,CAAC,CAAC;QAEH,OAAO;QACP,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEzD,mBAAmB;QACnB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;QAClD,IAAI,CAAC,YAAY;YACf,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;gBACjC,IAAI,EAAE,gGAAgG;gBACtG,OAAO,EAAE,wBAAwB;gBACjC,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QAEL,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YACpC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE;YAChC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG;SACpB,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC;QAEtD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EAAE,0BAA0B;gBACnC,UAAU,EAAE,GAAG;gBACf,IAAI,EAAE,kCAAkC,YAAY,qDAAqD;gBACzG,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;QAED,eAAe;QACf,gBAAgB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;YAC5D,SAAS,EAAE,gBAAgB;YAC3B,GAAG,SAAS;YACZ,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,kBAAkB;QAClB,WAAW,CAAC;YACV,GAAG;YACH,IAAI,EAAE,gBAAgB,IAAI;gBACxB,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC;YACD,OAAO,EAAE,6BAA6B;YACtC,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -2,29 +2,34 @@ import { unSeal } from "../../utils/libsodium.js";
|
|
|
2
2
|
import AppError from "../../utils/AppError.js";
|
|
3
3
|
import getErrorDetail from "../../utils/getErrorDetail.js";
|
|
4
4
|
const handleDecryption = async (item, routeObj) => {
|
|
5
|
-
const decArr = routeObj.
|
|
5
|
+
const decArr = routeObj.decryptedFields;
|
|
6
|
+
// If decryptedFields is not configured, skip decryption.
|
|
6
7
|
if (!decArr)
|
|
7
8
|
return;
|
|
9
|
+
// Validate configuration type.
|
|
8
10
|
if (!Array.isArray(decArr)) {
|
|
9
11
|
throw new AppError({
|
|
10
12
|
details: getErrorDetail(routeObj),
|
|
11
|
-
hint: "
|
|
13
|
+
hint: "decryptedFields must be an array of field names.",
|
|
12
14
|
message: "Decryption configuration is invalid.",
|
|
13
15
|
statusCode: 409,
|
|
14
16
|
});
|
|
15
17
|
}
|
|
18
|
+
// Validate configuration is not empty.
|
|
16
19
|
if (!decArr.length) {
|
|
17
20
|
throw new AppError({
|
|
18
21
|
details: getErrorDetail(routeObj),
|
|
19
|
-
hint: "Add at least one field name to
|
|
22
|
+
hint: "Add at least one field name to decryptedFields.",
|
|
20
23
|
message: "Decryption configuration is empty.",
|
|
21
24
|
statusCode: 409,
|
|
22
25
|
});
|
|
23
26
|
}
|
|
24
27
|
const decrypted = {};
|
|
25
28
|
for (let field of decArr) {
|
|
29
|
+
// clean the optional
|
|
26
30
|
const optional = field.endsWith("?");
|
|
27
31
|
field = optional ? field.slice(0, -1) : field;
|
|
32
|
+
// Validate that the field exists in the request body.
|
|
28
33
|
if (!Object.hasOwn(item, field))
|
|
29
34
|
if (optional) {
|
|
30
35
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleDecryption.js","sourceRoot":"","sources":["../../../../src/js/crud/security/handleDecryption.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAE3D,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAS,EAAE,QAAe,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"handleDecryption.js","sourceRoot":"","sources":["../../../../src/js/crud/security/handleDecryption.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAE3D,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAS,EAAE,QAAe,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC;IAExC,yDAAyD;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,+BAA+B;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,kDAAkD;YACxD,OAAO,EAAE,sCAAsC;YAC/C,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,iDAAiD;YACvD,OAAO,EAAE,oCAAoC;YAC7C,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAA2B,EAAE,CAAC;IAE7C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,qBAAqB;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE9C,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;YAC7B,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,QAAQ,CAAC;oBACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;oBACjC,IAAI,EAAE,cAAc,KAAK,2BAA2B,IAAI,CAAC,GAAG,SAAS,KAAK,yCAAyC,KAAK,GAAG;oBAC3H,OAAO,EAAE,uBAAuB,KAAK,6BAA6B;oBAClE,UAAU,EAAE,GAAG;iBAChB,CAAC,CAAC;YACL,CAAC;QAEH,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,iBAAiB;YACpD,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;gBACjC,IAAI,EAAE,oFAAoF;gBAC1F,OAAO,EAAE,mCAAmC;gBAC5C,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QAEL,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC;YAC9B,GAAG;YACH,KAAK;YACL,SAAS;YACT,iBAAiB;YACjB,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -2,21 +2,24 @@ import AppError from "../../utils/AppError.js";
|
|
|
2
2
|
import getErrorDetail from "../../utils/getErrorDetail.js";
|
|
3
3
|
import { seal } from "../../utils/libsodium.js";
|
|
4
4
|
const handleEncryption = async (body, routeObj) => {
|
|
5
|
-
const encArr = routeObj.
|
|
5
|
+
const encArr = routeObj.encryptedFields;
|
|
6
|
+
// If encryptedFields is not configured, skip encryption.
|
|
6
7
|
if (!encArr)
|
|
7
8
|
return;
|
|
9
|
+
// Validate configuration type.
|
|
8
10
|
if (!Array.isArray(encArr)) {
|
|
9
11
|
throw new AppError({
|
|
10
12
|
details: getErrorDetail(routeObj),
|
|
11
|
-
hint: "
|
|
13
|
+
hint: "encryptedFields must be an array of field names.",
|
|
12
14
|
message: "Encryption configuration is invalid.",
|
|
13
15
|
statusCode: 409,
|
|
14
16
|
});
|
|
15
17
|
}
|
|
18
|
+
// Validate configuration is not empty.
|
|
16
19
|
if (!encArr.length) {
|
|
17
20
|
throw new AppError({
|
|
18
21
|
details: getErrorDetail(routeObj),
|
|
19
|
-
hint: "Add at least one field name to
|
|
22
|
+
hint: "Add at least one field name to encryptedFields.",
|
|
20
23
|
message: "Encryption configuration is empty.",
|
|
21
24
|
statusCode: 409,
|
|
22
25
|
});
|
|
@@ -25,6 +28,7 @@ const handleEncryption = async (body, routeObj) => {
|
|
|
25
28
|
for (let field of encArr) {
|
|
26
29
|
const optional = field.endsWith("?");
|
|
27
30
|
field = optional ? field.slice(0, -1) : field;
|
|
31
|
+
// Validate that the field exists in the request body.
|
|
28
32
|
if (!Object.hasOwn(body, field))
|
|
29
33
|
if (optional) {
|
|
30
34
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleEncryption.js","sourceRoot":"","sources":["../../../../src/js/crud/security/handleEncryption.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGhD,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAS,EAAE,QAAe,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"handleEncryption.js","sourceRoot":"","sources":["../../../../src/js/crud/security/handleEncryption.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGhD,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAS,EAAE,QAAe,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC;IAExC,yDAAyD;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,+BAA+B;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,kDAAkD;YACxD,OAAO,EAAE,sCAAsC;YAC/C,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,iDAAiD;YACvD,OAAO,EAAE,oCAAoC;YAC7C,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAA+B,EAAE,CAAC;IAEjD,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE9C,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;YAC7B,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,QAAQ,CAAC;oBACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;oBACjC,IAAI,EAAE,cAAc,KAAK,oCAAoC;oBAC7D,OAAO,EAAE,uBAAuB,KAAK,0BAA0B;oBAC/D,UAAU,EAAE,GAAG;iBAChB,CAAC,CAAC;YACL,CAAC;QAEH,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -2,21 +2,24 @@ import AppError from "../../utils/AppError.js";
|
|
|
2
2
|
import getErrorDetail from "../../utils/getErrorDetail.js";
|
|
3
3
|
import { hash } from "../../utils/libsodium.js";
|
|
4
4
|
const handleHashing = async (body, routeObj) => {
|
|
5
|
-
const hashArr = routeObj.
|
|
5
|
+
const hashArr = routeObj.hashedFields;
|
|
6
|
+
// If hashedFields is not configured, skip hashing.
|
|
6
7
|
if (!hashArr)
|
|
7
8
|
return;
|
|
9
|
+
// Validate configuration type.
|
|
8
10
|
if (!Array.isArray(hashArr)) {
|
|
9
11
|
throw new AppError({
|
|
10
12
|
details: getErrorDetail(routeObj),
|
|
11
|
-
hint: "
|
|
13
|
+
hint: "hashedFields must be an array of field names.",
|
|
12
14
|
message: "Hashing configuration is invalid.",
|
|
13
15
|
statusCode: 409,
|
|
14
16
|
});
|
|
15
17
|
}
|
|
18
|
+
// Validate configuration is not empty.
|
|
16
19
|
if (!hashArr.length) {
|
|
17
20
|
throw new AppError({
|
|
18
21
|
details: getErrorDetail(routeObj),
|
|
19
|
-
hint: "Add at least one field name to
|
|
22
|
+
hint: "Add at least one field name to hashedFields.",
|
|
20
23
|
message: "Hashing configuration is empty.",
|
|
21
24
|
statusCode: 409,
|
|
22
25
|
});
|
|
@@ -25,6 +28,7 @@ const handleHashing = async (body, routeObj) => {
|
|
|
25
28
|
for (let field of hashArr) {
|
|
26
29
|
const optional = field.endsWith("?");
|
|
27
30
|
field = optional ? field.slice(0, -1) : field;
|
|
31
|
+
// Validate that the field exists in the request body.
|
|
28
32
|
if (!Object.hasOwn(body, field)) {
|
|
29
33
|
if (optional) {
|
|
30
34
|
continue;
|
|
@@ -36,6 +40,7 @@ const handleHashing = async (body, routeObj) => {
|
|
|
36
40
|
statusCode: 400,
|
|
37
41
|
});
|
|
38
42
|
}
|
|
43
|
+
// Only strings can be hashed.
|
|
39
44
|
if (typeof body[field] !== "string") {
|
|
40
45
|
throw new AppError({
|
|
41
46
|
details: getErrorDetail(routeObj),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleHashing.js","sourceRoot":"","sources":["../../../../src/js/crud/security/handleHashing.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,MAAM,aAAa,GAAG,KAAK,EAAE,IAAS,EAAE,QAAe,EAAE,EAAE;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"handleHashing.js","sourceRoot":"","sources":["../../../../src/js/crud/security/handleHashing.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,MAAM,aAAa,GAAG,KAAK,EAAE,IAAS,EAAE,QAAe,EAAE,EAAE;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC;IAEtC,mDAAmD;IACnD,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,+BAA+B;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,+CAA+C;YACrD,OAAO,EAAE,mCAAmC;YAC5C,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;YACjC,IAAI,EAAE,8CAA8C;YACpD,OAAO,EAAE,iCAAiC;YAC1C,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE9C,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;gBACjC,IAAI,EAAE,cAAc,KAAK,oCAAoC;gBAC7D,OAAO,EAAE,uBAAuB,KAAK,uBAAuB;gBAC5D,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CAAC;gBACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;gBACjC,IAAI,EAAE,cAAc,KAAK,gCAAgC;gBACzD,OAAO,EAAE,cAAc,KAAK,2DAA2D;gBACvF,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
package/dist/js/crud/update.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Request, Response } from "express";
|
|
2
2
|
import type { ValidationsObj, Route } from "../types/Collection.js";
|
|
3
|
-
declare const update: ({
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
declare const update: ({ model, route, routeObj, validations, }: {
|
|
4
|
+
model: string;
|
|
5
|
+
route: string;
|
|
6
6
|
routeObj: Route;
|
|
7
|
-
|
|
7
|
+
validations: ValidationsObj;
|
|
8
8
|
}) => (req: Request, res: Response) => Promise<void>;
|
|
9
9
|
export default update;
|
|
10
10
|
//# sourceMappingURL=update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/js/crud/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAapE,QAAA,MAAM,MAAM,GAAI,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/js/crud/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAapE,QAAA,MAAM,MAAM,GAAI,0CAKb;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;IAChB,WAAW,EAAE,cAAc,CAAC;CAC7B,MACe,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAiFzD,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/js/crud/update.js
CHANGED
|
@@ -9,26 +9,35 @@ import getValidationKey from "../utils/validationKeyError.js";
|
|
|
9
9
|
import handleEncryption from "./encryption/handleEncryption.js";
|
|
10
10
|
import handleHashing from "./security/handleHashing.js";
|
|
11
11
|
import runActions from "./utils/runActions.js";
|
|
12
|
-
const update = ({
|
|
12
|
+
const update = ({ model, route, routeObj, validations, }) => {
|
|
13
13
|
return async (req, res) => {
|
|
14
|
-
|
|
14
|
+
// validationObj
|
|
15
|
+
const validationObj = getValidationKey(routeObj, validations);
|
|
16
|
+
// get /:parameter
|
|
15
17
|
const id = getParam({ req, routeObj });
|
|
18
|
+
// validate
|
|
16
19
|
const body = validate(validationObj, req.body, routeObj);
|
|
20
|
+
// ensure item exists
|
|
17
21
|
const item = await getItem({
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
model,
|
|
23
|
+
route,
|
|
20
24
|
_id: id,
|
|
21
25
|
routeObj,
|
|
22
26
|
});
|
|
23
|
-
|
|
27
|
+
// authorize access
|
|
28
|
+
authorizeAccess({ item, req, routeObj, route });
|
|
29
|
+
// if encryptedFields
|
|
24
30
|
const encryptedFields = await handleEncryption(req.body, routeObj);
|
|
31
|
+
// if hashedFields
|
|
25
32
|
const hashedFields = await handleHashing(req.body, routeObj);
|
|
26
|
-
|
|
33
|
+
// model
|
|
34
|
+
const Model = getModel({ model, route, routeObj });
|
|
35
|
+
// runActions object
|
|
27
36
|
const ActionObj = {
|
|
28
37
|
req,
|
|
29
38
|
user: req.user,
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
route,
|
|
40
|
+
model,
|
|
32
41
|
Model,
|
|
33
42
|
data: {
|
|
34
43
|
body,
|
|
@@ -36,22 +45,28 @@ const update = ({ modelName, routeName, routeObj, validationsObj, }) => {
|
|
|
36
45
|
hashedFields,
|
|
37
46
|
},
|
|
38
47
|
};
|
|
48
|
+
// before action
|
|
39
49
|
let modifiedResponse = await runActions(routeObj.actions?.before, {
|
|
40
50
|
operation: "update",
|
|
41
51
|
...ActionObj,
|
|
42
52
|
});
|
|
53
|
+
// update
|
|
43
54
|
const updatedItem = await Model.findByIdAndUpdate(id, { ...body, ...encryptedFields, ...hashedFields }, {
|
|
44
55
|
returnDocument: "after",
|
|
45
56
|
});
|
|
57
|
+
// cleaned
|
|
46
58
|
const cleaned = sanitizeOne(updatedItem.toObject(), routeObj);
|
|
47
|
-
|
|
59
|
+
// if '_id' excluded
|
|
60
|
+
const idExcluded = routeObj.config?.hiddenFields?.includes("_id");
|
|
48
61
|
if (idExcluded)
|
|
49
62
|
delete cleaned["_id"];
|
|
63
|
+
// after action
|
|
50
64
|
modifiedResponse = await runActions(routeObj.actions?.after, {
|
|
51
65
|
...ActionObj,
|
|
52
66
|
operation: "update",
|
|
53
67
|
item: cleaned,
|
|
54
68
|
});
|
|
69
|
+
// return response
|
|
55
70
|
appResponse({
|
|
56
71
|
res,
|
|
57
72
|
data: modifiedResponse ?? cleaned,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/js/crud/update.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,eAAe,MAAM,4BAA4B,CAAC;AACzD,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,aAAa,MAAM,6BAA6B,CAAC;AACxD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG,CAAC,EACd,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/js/crud/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Request } from "express";
|
|
2
2
|
import type { Route } from "../../types/Collection.js";
|
|
3
|
-
declare const authorizeAccess: ({ routeObj,
|
|
3
|
+
declare const authorizeAccess: ({ routeObj, route, item, req, }: {
|
|
4
4
|
routeObj: Route;
|
|
5
|
-
|
|
5
|
+
route: string;
|
|
6
6
|
item?: any;
|
|
7
7
|
req: Request;
|
|
8
8
|
}) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorizeAccess.d.ts","sourceRoot":"","sources":["../../../../src/js/crud/utils/authorizeAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAIvD,QAAA,MAAM,eAAe,GAAI,
|
|
1
|
+
{"version":3,"file":"authorizeAccess.d.ts","sourceRoot":"","sources":["../../../../src/js/crud/utils/authorizeAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAIvD,QAAA,MAAM,eAAe,GAAI,iCAKtB;IACD,QAAQ,EAAE,KAAK,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,GAAG,EAAE,OAAO,CAAC;CACd,SAuDA,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1,43 +1,49 @@
|
|
|
1
1
|
import AppError from "../../utils/AppError.js";
|
|
2
2
|
import AppLog from "../../utils/AppLog.js";
|
|
3
3
|
import getErrorDetail from "../../utils/getErrorDetail.js";
|
|
4
|
-
const authorizeAccess = ({ routeObj,
|
|
5
|
-
if
|
|
4
|
+
const authorizeAccess = ({ routeObj, route, item, req, }) => {
|
|
5
|
+
// if auth !== admin or admin-or-owner
|
|
6
|
+
if (routeObj.auth !== "admin" && routeObj.auth !== "admin-or-owner")
|
|
6
7
|
throw new AppError({
|
|
7
|
-
message: "
|
|
8
|
+
message: "auth should only be 'admin' or 'admin-or-owner'",
|
|
8
9
|
statusCode: 409,
|
|
9
|
-
hint: "Make the
|
|
10
|
+
hint: "Make the auth admin or admin-or-owner based on your routeObj requirement. Checkout collection -> routes -> auth",
|
|
10
11
|
details: getErrorDetail(routeObj),
|
|
11
12
|
});
|
|
12
|
-
if
|
|
13
|
+
// if removeAll to not admin
|
|
14
|
+
if (routeObj.auth !== "admin" && routeObj.handler === "removeAll")
|
|
13
15
|
throw new AppError({
|
|
14
|
-
message: "
|
|
16
|
+
message: "auth should only be 'admin'",
|
|
15
17
|
statusCode: 409,
|
|
16
|
-
hint: "Make the
|
|
18
|
+
hint: "Make the auth admin. Checkout collection -> routes -> auth",
|
|
17
19
|
details: getErrorDetail(routeObj),
|
|
18
20
|
});
|
|
19
|
-
|
|
21
|
+
// vars
|
|
22
|
+
const ownerId = routeObj.ownership === "self" ? item._id : item?.owner?._id;
|
|
20
23
|
const isOwner = !!ownerId && !!req.user && ownerId.equals(req.user._id);
|
|
21
24
|
const isAdmin = req.user.role === "admin";
|
|
25
|
+
// if owner id in item not found
|
|
22
26
|
if (!ownerId) {
|
|
23
27
|
AppLog("x", "authorization", `owner not found in item.`);
|
|
24
|
-
AppLog("warn", "authorization", `If this route doesn't have owner, use
|
|
28
|
+
AppLog("warn", "authorization", `If this route doesn't have owner, use ownership: "self" in routes -> route. routeObj: '/${route}', method: '${routeObj.method}' and path: '${routeObj.path}'`);
|
|
25
29
|
}
|
|
26
|
-
|
|
30
|
+
// allow only admin
|
|
31
|
+
if (routeObj.auth === "admin") {
|
|
27
32
|
if (!isAdmin)
|
|
28
33
|
throw new AppError({
|
|
29
34
|
message: "Unauthorized",
|
|
30
35
|
statusCode: 403,
|
|
31
|
-
hint: "You are not the admin. If this route doesn\'t have owner, use
|
|
36
|
+
hint: "You are not the admin. If this route doesn\'t have owner, use ownership: 'self' in routes -> route.",
|
|
32
37
|
details: getErrorDetail(routeObj),
|
|
33
38
|
});
|
|
34
39
|
}
|
|
35
|
-
if
|
|
40
|
+
// if allow both admin or owner
|
|
41
|
+
if (routeObj.auth === "admin-or-owner") {
|
|
36
42
|
if (!isAdmin && !isOwner)
|
|
37
43
|
throw new AppError({
|
|
38
44
|
message: "Unauthorized",
|
|
39
45
|
statusCode: 403,
|
|
40
|
-
hint: "You are not the owner. If this route doesn\'t have owner, use
|
|
46
|
+
hint: "You are not the owner. If this route doesn\'t have owner, use ownership: 'self' in routes -> route.",
|
|
41
47
|
details: getErrorDetail(routeObj),
|
|
42
48
|
});
|
|
43
49
|
}
|