@opengis/fastify-table 2.3.5 → 2.4.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/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -9
- package/dist/server/plugins/access/funcs/getAdminAccess.d.ts +1 -4
- package/dist/server/plugins/access/funcs/getAdminAccess.d.ts.map +1 -1
- package/dist/server/plugins/access/funcs/getAdminAccess.js +3 -2
- package/dist/server/plugins/auth/funcs/getQuery.d.ts.map +1 -1
- package/dist/server/plugins/auth/funcs/getQuery.js +2 -1
- package/dist/server/plugins/auth/funcs/loginFile.d.ts +1 -4
- package/dist/server/plugins/auth/funcs/loginFile.d.ts.map +1 -1
- package/dist/server/plugins/auth/funcs/loginFile.js +10 -5
- package/dist/server/plugins/auth/funcs/loginUser.d.ts.map +1 -1
- package/dist/server/plugins/auth/funcs/loginUser.js +25 -18
- package/dist/server/plugins/auth/index.d.ts.map +1 -1
- package/dist/server/plugins/auth/index.js +3 -4
- package/dist/server/plugins/crud/funcs/dataInsert.js +1 -1
- package/dist/server/plugins/extra/extraData.d.ts.map +1 -1
- package/dist/server/plugins/extra/extraData.js +3 -2
- package/dist/server/plugins/extra/extraDataGet.d.ts +1 -4
- package/dist/server/plugins/extra/extraDataGet.d.ts.map +1 -1
- package/dist/server/plugins/extra/extraDataGet.js +4 -6
- package/dist/server/plugins/file/uploadMultiPart.js +1 -1
- package/dist/server/plugins/grpc/utils/html2doc.d.ts +0 -6
- package/dist/server/plugins/grpc/utils/html2doc.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/html2doc.js +3 -8
- package/dist/server/plugins/grpc/utils/html2img.d.ts +0 -6
- package/dist/server/plugins/grpc/utils/html2img.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/html2img.js +3 -8
- package/dist/server/plugins/grpc/utils/html2pdf.d.ts +0 -6
- package/dist/server/plugins/grpc/utils/html2pdf.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/html2pdf.js +7 -12
- package/dist/server/plugins/grpc/utils/mergePdf.d.ts +0 -7
- package/dist/server/plugins/grpc/utils/mergePdf.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/mergePdf.js +4 -9
- package/dist/server/plugins/logger/checkUserAccess.d.ts +1 -4
- package/dist/server/plugins/logger/checkUserAccess.d.ts.map +1 -1
- package/dist/server/plugins/logger/checkUserAccess.js +4 -6
- package/dist/server/plugins/logger/errorMessage.d.ts +1 -1
- package/dist/server/plugins/logger/errorMessage.d.ts.map +1 -1
- package/dist/server/plugins/logger/errorMessage.js +7 -8
- package/dist/server/plugins/logger/errorStatus.d.ts.map +1 -1
- package/dist/server/plugins/logger/errorStatus.js +6 -0
- package/dist/server/plugins/logger/index.d.ts +2 -2
- package/dist/server/plugins/logger/index.d.ts.map +1 -1
- package/dist/server/plugins/logger/index.js +16 -18
- package/dist/server/plugins/pg/funcs/getMeta.d.ts.map +1 -1
- package/dist/server/plugins/pg/funcs/getMeta.js +5 -3
- package/dist/server/plugins/policy/funcs/checkJWT.d.ts +0 -9
- package/dist/server/plugins/policy/funcs/checkJWT.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkJWT.js +6 -5
- package/dist/server/plugins/policy/funcs/checkPermissions.d.ts +1 -4
- package/dist/server/plugins/policy/funcs/checkPermissions.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkPermissions.js +2 -1
- package/dist/server/plugins/policy/funcs/checkPolicy.d.ts +1 -4
- package/dist/server/plugins/policy/funcs/checkPolicy.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkPolicy.js +8 -7
- package/dist/server/plugins/policy/index.d.ts.map +1 -1
- package/dist/server/plugins/policy/index.js +2 -11
- package/dist/server/plugins/table/funcs/getFilterSQL/index.d.ts +1 -15
- package/dist/server/plugins/table/funcs/getFilterSQL/index.d.ts.map +1 -1
- package/dist/server/plugins/table/funcs/getFilterSQL/index.js +6 -4
- package/dist/server/plugins/table/funcs/gisIRColumn.d.ts +0 -22
- package/dist/server/plugins/table/funcs/gisIRColumn.d.ts.map +1 -1
- package/dist/server/plugins/table/funcs/gisIRColumn.js +5 -3
- package/dist/server/plugins/upload/index.d.ts.map +1 -1
- package/dist/server/plugins/upload/index.js +7 -0
- package/dist/server/plugins/upload/s3.d.ts +7 -1
- package/dist/server/plugins/upload/s3.d.ts.map +1 -1
- package/dist/server/plugins/upload/s3.js +54 -10
- package/dist/server/plugins/upload/s3minio.d.ts +59 -0
- package/dist/server/plugins/upload/s3minio.d.ts.map +1 -0
- package/dist/server/plugins/upload/s3minio.js +199 -0
- package/dist/server/plugins/upload/startUpload.d.ts.map +1 -1
- package/dist/server/plugins/upload/startUpload.js +16 -8
- package/dist/server/plugins/upload/uploadChunk.d.ts.map +1 -1
- package/dist/server/plugins/upload/uploadChunk.js +14 -9
- package/dist/server/plugins/usercls/index.js +1 -1
- package/dist/server/routes/access/controllers/access.group.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.group.js +3 -5
- package/dist/server/routes/access/controllers/access.group.post.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.group.post.js +3 -5
- package/dist/server/routes/access/controllers/access.interface.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.interface.js +1 -4
- package/dist/server/routes/access/controllers/access.user.d.ts +5 -1
- package/dist/server/routes/access/controllers/access.user.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.user.js +4 -5
- package/dist/server/routes/access/controllers/access.user.post.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.user.post.js +4 -5
- package/dist/server/routes/access/index.d.ts.map +1 -1
- package/dist/server/routes/access/index.js +10 -6
- package/dist/server/routes/auth/controllers/2factor/providers/totp.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/providers/totp.js +4 -3
- package/dist/server/routes/auth/controllers/2factor/qrcode.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/qrcode.js +6 -10
- package/dist/server/routes/auth/controllers/2factor/recovery.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/recovery.js +14 -23
- package/dist/server/routes/auth/controllers/2factor/reset.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/reset.js +3 -5
- package/dist/server/routes/auth/controllers/2factor/verify.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/verify.js +30 -43
- package/dist/server/routes/auth/controllers/core/login.d.ts +1 -4
- package/dist/server/routes/auth/controllers/core/login.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/passwordRecovery.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/passwordRecovery.js +7 -8
- package/dist/server/routes/auth/controllers/core/registration.d.ts +1 -4
- package/dist/server/routes/auth/controllers/core/registration.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/registration.js +10 -24
- package/dist/server/routes/auth/controllers/core/updateUserInfo.d.ts +1 -2
- package/dist/server/routes/auth/controllers/core/updateUserInfo.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/updateUserInfo.js +3 -2
- package/dist/server/routes/auth/controllers/euSign/authByData.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/euSign/authByData.js +4 -7
- package/dist/server/routes/auth/controllers/jwt/authorize.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/jwt/authorize.js +6 -9
- package/dist/server/routes/auth/controllers/jwt/token.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/jwt/token.js +9 -12
- package/dist/server/routes/auth/controllers/page/login2faTemplate.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/page/login2faTemplate.js +3 -2
- package/dist/server/routes/auth/index.d.ts +1 -2
- package/dist/server/routes/auth/index.d.ts.map +1 -1
- package/dist/server/routes/auth/index.js +4 -3
- package/dist/server/routes/cron/controllers/cronApi.d.ts.map +1 -1
- package/dist/server/routes/cron/controllers/cronApi.js +3 -4
- package/dist/server/routes/cron/index.js +1 -1
- package/dist/server/routes/crud/controllers/deleteCrud.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/deleteCrud.js +11 -33
- package/dist/server/routes/crud/controllers/insert.d.ts +1 -1
- package/dist/server/routes/crud/controllers/insert.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/insert.js +17 -31
- package/dist/server/routes/crud/controllers/table.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/table.js +14 -18
- package/dist/server/routes/crud/controllers/update.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/update.js +16 -28
- package/dist/server/routes/crud/index.d.ts.map +1 -1
- package/dist/server/routes/crud/index.js +14 -4
- package/dist/server/routes/dblist/controllers/setItem.d.ts +0 -6
- package/dist/server/routes/dblist/controllers/setItem.d.ts.map +1 -1
- package/dist/server/routes/dblist/controllers/setItem.js +3 -2
- package/dist/server/routes/dblist/index.d.ts.map +1 -1
- package/dist/server/routes/dblist/index.js +5 -3
- package/dist/server/routes/file/controllers/delete.d.ts +4 -1
- package/dist/server/routes/file/controllers/delete.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/delete.js +8 -8
- package/dist/server/routes/file/controllers/download.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/download.js +5 -8
- package/dist/server/routes/file/controllers/export.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/export.js +8 -8
- package/dist/server/routes/file/controllers/files.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/files.js +6 -8
- package/dist/server/routes/file/controllers/resize.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/resize.js +4 -12
- package/dist/server/routes/file/index.d.ts.map +1 -1
- package/dist/server/routes/file/index.js +10 -7
- package/dist/server/routes/grpc/controllers/file2geojson.d.ts.map +1 -1
- package/dist/server/routes/grpc/controllers/file2geojson.js +7 -7
- package/dist/server/routes/grpc/controllers/filePreview.d.ts.map +1 -1
- package/dist/server/routes/grpc/controllers/filePreview.js +5 -4
- package/dist/server/routes/grpc/index.d.ts.map +1 -1
- package/dist/server/routes/grpc/index.js +3 -2
- package/dist/server/routes/logger/controllers/logger.file.d.ts +1 -1
- package/dist/server/routes/logger/controllers/logger.file.d.ts.map +1 -1
- package/dist/server/routes/logger/controllers/logger.file.js +4 -5
- package/dist/server/routes/logger/controllers/logger.metrics.d.ts.map +1 -1
- package/dist/server/routes/logger/controllers/logger.metrics.js +1 -4
- package/dist/server/routes/logger/index.d.ts.map +1 -1
- package/dist/server/routes/logger/index.js +4 -2
- package/dist/server/routes/menu/controllers/getMenu.d.ts.map +1 -1
- package/dist/server/routes/menu/controllers/getMenu.js +2 -1
- package/dist/server/routes/menu/index.d.ts.map +1 -1
- package/dist/server/routes/menu/index.js +9 -2
- package/dist/server/routes/notifications/controllers/addUserNotification.d.ts +1 -2
- package/dist/server/routes/notifications/controllers/addUserNotification.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/addUserNotification.js +5 -6
- package/dist/server/routes/notifications/controllers/deleteUserNotification.d.ts +1 -2
- package/dist/server/routes/notifications/controllers/deleteUserNotification.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/deleteUserNotification.js +5 -6
- package/dist/server/routes/notifications/controllers/editUserNotification.d.ts +1 -2
- package/dist/server/routes/notifications/controllers/editUserNotification.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/editUserNotification.js +6 -9
- package/dist/server/routes/notifications/controllers/readNotifications.d.ts +4 -2
- package/dist/server/routes/notifications/controllers/readNotifications.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/readNotifications.js +4 -3
- package/dist/server/routes/notifications/controllers/userNotifications.d.ts +5 -2
- package/dist/server/routes/notifications/controllers/userNotifications.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/userNotifications.js +4 -5
- package/dist/server/routes/notifications/index.d.ts +1 -2
- package/dist/server/routes/notifications/index.d.ts.map +1 -1
- package/dist/server/routes/notifications/index.js +3 -1
- package/dist/server/routes/properties/controllers/properties.get.d.ts +5 -2
- package/dist/server/routes/properties/controllers/properties.get.d.ts.map +1 -1
- package/dist/server/routes/properties/controllers/properties.get.js +6 -5
- package/dist/server/routes/properties/controllers/properties.post.d.ts +1 -1
- package/dist/server/routes/properties/controllers/properties.post.d.ts.map +1 -1
- package/dist/server/routes/properties/controllers/properties.post.js +7 -6
- package/dist/server/routes/properties/index.d.ts.map +1 -1
- package/dist/server/routes/properties/index.js +4 -7
- package/dist/server/routes/table/controllers/card.d.ts +1 -1
- package/dist/server/routes/table/controllers/card.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/card.js +9 -7
- package/dist/server/routes/table/controllers/cardData.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/cardData.js +4 -6
- package/dist/server/routes/table/controllers/cardTabData.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/cardTabData.js +3 -2
- package/dist/server/routes/table/controllers/dataInfo.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/dataInfo.js +4 -3
- package/dist/server/routes/table/controllers/filter.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/filter.js +3 -2
- package/dist/server/routes/table/controllers/form.d.ts +1 -1
- package/dist/server/routes/table/controllers/form.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/form.js +7 -5
- package/dist/server/routes/table/controllers/getFormByTable.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/getFormByTable.js +12 -12
- package/dist/server/routes/table/controllers/suggest.d.ts +1 -1
- package/dist/server/routes/table/controllers/suggest.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/suggest.js +14 -29
- package/dist/server/routes/table/controllers/tableInfo.d.ts +1 -2
- package/dist/server/routes/table/controllers/tableInfo.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/tableInfo.js +9 -8
- package/dist/server/routes/table/controllers/tokenInfo.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/tokenInfo.js +2 -1
- package/dist/server/routes/table/functions/getData.d.ts.map +1 -1
- package/dist/server/routes/table/functions/getData.js +19 -25
- package/dist/server/routes/table/index.d.ts.map +1 -1
- package/dist/server/routes/table/index.js +15 -13
- package/dist/server/routes/templates/controllers/getTemplate.d.ts.map +1 -1
- package/dist/server/routes/templates/controllers/getTemplate.js +9 -5
- package/dist/server/routes/templates/index.d.ts.map +1 -1
- package/dist/server/routes/templates/index.js +2 -1
- package/dist/server/routes/upload/index.d.ts.map +1 -1
- package/dist/server/routes/upload/index.js +31 -20
- package/dist/server/routes/usercls/controllers/addUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/addUserCls.js +2 -1
- package/dist/server/routes/usercls/controllers/deleteUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/deleteUserCls.js +2 -1
- package/dist/server/routes/usercls/controllers/editUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/editUserCls.js +2 -1
- package/dist/server/routes/usercls/controllers/getUserCls.d.ts +1 -1
- package/dist/server/routes/usercls/controllers/getUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/getUserCls.js +4 -3
- package/dist/server/routes/usercls/index.d.ts.map +1 -1
- package/dist/server/routes/usercls/index.js +12 -5
- package/dist/server/routes/util/controllers/api.list.d.ts +19 -0
- package/dist/server/routes/util/controllers/api.list.d.ts.map +1 -0
- package/dist/server/routes/util/controllers/api.list.js +58 -0
- package/dist/server/routes/util/controllers/code.generator.d.ts.map +1 -1
- package/dist/server/routes/util/controllers/code.generator.js +7 -6
- package/dist/server/routes/util/controllers/user.tokens.d.ts +1 -2
- package/dist/server/routes/util/controllers/user.tokens.d.ts.map +1 -1
- package/dist/server/routes/util/controllers/user.tokens.js +6 -5
- package/dist/server/routes/util/index.d.ts.map +1 -1
- package/dist/server/routes/util/index.js +8 -7
- package/dist/server/routes/widget/controllers/file.edit.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/file.edit.js +5 -4
- package/dist/server/routes/widget/controllers/widget.del.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/widget.del.js +6 -7
- package/dist/server/routes/widget/controllers/widget.get.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/widget.get.js +4 -3
- package/dist/server/routes/widget/controllers/widget.set.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/widget.set.js +5 -4
- package/dist/server/routes/widget/index.d.ts.map +1 -1
- package/dist/server/routes/widget/index.js +3 -2
- package/package.json +3 -1
- package/dist/module/core/cls/constraint_type.json +0 -14
- package/dist/module/core/cls/constraint_type_table.json +0 -18
- package/dist/server/migrations/oauth.sql.sql +0 -77
- package/dist/server/plugins/auth/funcs/getUserPermissions.d.ts +0 -2
- package/dist/server/plugins/auth/funcs/getUserPermissions.d.ts.map +0 -1
- package/dist/server/plugins/auth/funcs/getUserPermissions.js +0 -24
- package/dist/server/plugins/auth/onRequest.d.ts +0 -4
- package/dist/server/plugins/auth/onRequest.d.ts.map +0 -1
- package/dist/server/plugins/auth/onRequest.js +0 -104
- package/dist/server/plugins/migration/index.d.ts +0 -3
- package/dist/server/plugins/migration/index.d.ts.map +0 -1
- package/dist/server/plugins/migration/index.js +0 -5
- package/dist/server/plugins/policy/funcs/checkAuth.d.ts +0 -4
- package/dist/server/plugins/policy/funcs/checkAuth.d.ts.map +0 -1
- package/dist/server/plugins/policy/funcs/checkAuth.js +0 -104
- package/dist/server/routes/access/controllers/access.resources.d.ts +0 -6
- package/dist/server/routes/access/controllers/access.resources.d.ts.map +0 -1
- package/dist/server/routes/access/controllers/access.resources.js +0 -14
- package/dist/server/routes/access/controllers/resources.d.ts +0 -11
- package/dist/server/routes/access/controllers/resources.d.ts.map +0 -1
- package/dist/server/routes/access/controllers/resources.js +0 -14
- package/dist/server/routes/access/functions/resources.d.ts +0 -6
- package/dist/server/routes/access/functions/resources.d.ts.map +0 -1
- package/dist/server/routes/access/functions/resources.js +0 -11
- package/dist/server/types/errors.d.ts +0 -14
- package/dist/server/types/errors.d.ts.map +0 -1
- package/dist/server/types/errors.js +0 -4
|
@@ -1,43 +1,54 @@
|
|
|
1
1
|
import config from "../../../config.js";
|
|
2
|
-
const { chunkSize =
|
|
2
|
+
const { chunkSize = 5242880 } = config;
|
|
3
3
|
import { prefix } from "../../plugins/upload/index.js";
|
|
4
4
|
import startUpload from "../../plugins/upload/startUpload.js";
|
|
5
5
|
import uploadChunk from "../../plugins/upload/uploadChunk.js";
|
|
6
6
|
import getUploadStatus from "../../plugins/upload/getUploadStatus.js";
|
|
7
|
+
import { BadRequestError, LengthRequiredError } from "../../../errors.js";
|
|
7
8
|
const policy = "L0"; // public
|
|
9
|
+
const tags = ["core", "upload"];
|
|
8
10
|
export default function plugin(app) {
|
|
9
11
|
// provide server with metadata for chunked upload
|
|
10
|
-
app.post(`/${prefix}/start`, {
|
|
12
|
+
app.post(`/${prefix}/start`, {
|
|
13
|
+
config: { tags, description: "Init chunked upload", policy },
|
|
14
|
+
}, async (req, reply) => {
|
|
11
15
|
const { fileName, size, subdir, id } = req.body || {};
|
|
12
16
|
if (!fileName || !size) {
|
|
13
|
-
|
|
14
|
-
.code(400)
|
|
15
|
-
.send({ error: "fileName and size required", code: 400 });
|
|
17
|
+
throw BadRequestError("fileName and size are required");
|
|
16
18
|
}
|
|
17
19
|
const result = await startUpload({ fileName, size, subdir, id });
|
|
18
|
-
if (result.
|
|
19
|
-
|
|
20
|
-
.status(result.code)
|
|
21
|
-
.send({ error: result.error, code: result.code });
|
|
20
|
+
if (result.error) {
|
|
21
|
+
throw new Error(result.error);
|
|
22
22
|
}
|
|
23
23
|
return result;
|
|
24
24
|
});
|
|
25
25
|
// disable default parser for PATCH /upload/:id
|
|
26
26
|
// allows accept all content types (req.body = raw buffer)
|
|
27
27
|
// limit body size to 50MB by default, depends on upload chunk size
|
|
28
|
-
app.addContentTypeParser("*", { parseAs: "buffer", bodyLimit: chunkSize *
|
|
28
|
+
app.addContentTypeParser("*", { parseAs: "buffer", bodyLimit: chunkSize * 10 }, (req, body, done) => {
|
|
29
29
|
done(null, body);
|
|
30
30
|
});
|
|
31
31
|
// upload chunks
|
|
32
|
-
app.patch(`/${prefix}/:id`, {
|
|
32
|
+
app.patch(`/${prefix}/:id`, {
|
|
33
|
+
config: {
|
|
34
|
+
tags,
|
|
35
|
+
description: "Upload chunk of data",
|
|
36
|
+
policy: config.uploadChunkPolicy || policy,
|
|
37
|
+
rateLimit: config.rateLimit
|
|
38
|
+
? {
|
|
39
|
+
max: +(config.rateLimit?.uploadChunk?.max || 1000),
|
|
40
|
+
timeWindow: config.rateLimit?.uploadChunk?.timeWindow || "1 minute",
|
|
41
|
+
keyGenerator: (req) => `${req.user?.uid || req.ip}-${req.routeOptions.url}`,
|
|
42
|
+
}
|
|
43
|
+
: undefined,
|
|
44
|
+
},
|
|
45
|
+
}, async (req, reply) => {
|
|
33
46
|
if (!req.headers["content-range"]) {
|
|
34
|
-
|
|
35
|
-
.status(411)
|
|
36
|
-
.send({ error: "Content-Range required", code: 411 });
|
|
47
|
+
throw LengthRequiredError("Content-Range required");
|
|
37
48
|
}
|
|
38
49
|
const match = req.headers["content-range"].match(/bytes (\d+)-(\d+)\/(\d+)/);
|
|
39
50
|
if (!match) {
|
|
40
|
-
|
|
51
|
+
throw BadRequestError("Invalid Content-Range");
|
|
41
52
|
}
|
|
42
53
|
const offset = parseInt(match[1], 10);
|
|
43
54
|
const end = parseInt(match[2], 10);
|
|
@@ -49,15 +60,15 @@ export default function plugin(app) {
|
|
|
49
60
|
end,
|
|
50
61
|
size,
|
|
51
62
|
});
|
|
52
|
-
if (result.
|
|
53
|
-
|
|
54
|
-
.status(result.code)
|
|
55
|
-
.send({ error: result.error, code: result.code });
|
|
63
|
+
if (result.error) {
|
|
64
|
+
throw new Error(result.error);
|
|
56
65
|
}
|
|
57
66
|
return result;
|
|
58
67
|
});
|
|
59
68
|
// check upload status
|
|
60
|
-
app.get(`/${prefix}/:id`, {
|
|
69
|
+
app.get(`/${prefix}/:id`, {
|
|
70
|
+
config: { tags, description: "Check chunked upload status", policy },
|
|
71
|
+
}, async (req) => {
|
|
61
72
|
const { id } = req.params;
|
|
62
73
|
const status = await getUploadStatus({ id });
|
|
63
74
|
return status;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/addUserCls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/addUserCls.ts"],"names":[],"mappings":"AAWA,wBAA8B,aAAa,CACzC,EAAE,EAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAC1C,KAAK,EAAE,GAAG,gBAqCX"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UnauthorizedError } from "../../../../errors.js";
|
|
1
2
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
2
3
|
import getSelectMeta from "../../../plugins/table/funcs/getSelectMeta.js";
|
|
3
4
|
import { addUserCls, addCustomCls, editUserCls, getUserCls, } from "../../../plugins/usercls/index.js";
|
|
@@ -5,7 +6,7 @@ export default async function addUserClsApi({ pg = pgClients.client, body, user
|
|
|
5
6
|
const { name, description, alias, data, table } = body;
|
|
6
7
|
const t1 = Date.now();
|
|
7
8
|
if (!user?.uid) {
|
|
8
|
-
|
|
9
|
+
throw UnauthorizedError("unauthorized");
|
|
9
10
|
}
|
|
10
11
|
if (table) {
|
|
11
12
|
await addCustomCls({ name, description, alias, table, uid: user.uid, data }, pg);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/deleteUserCls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deleteUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/deleteUserCls.ts"],"names":[],"mappings":"AAKA,wBAA8B,gBAAgB,CAC5C,EAAE,EAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAC5C,KAAK,EAAE,GAAG,gBAkBX"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UnauthorizedError } from "../../../../errors.js";
|
|
1
2
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
2
3
|
import getSelectMeta from "../../../plugins/table/funcs/getSelectMeta.js";
|
|
3
4
|
import { deleteUserCls } from "../../../plugins/usercls/index.js";
|
|
@@ -5,7 +6,7 @@ export default async function deleteUserClsApi({ pg = pgClients.client, params,
|
|
|
5
6
|
const { name, code } = params;
|
|
6
7
|
const t1 = Date.now();
|
|
7
8
|
if (!user?.uid) {
|
|
8
|
-
|
|
9
|
+
throw UnauthorizedError("unauthorized");
|
|
9
10
|
}
|
|
10
11
|
await getSelectMeta({
|
|
11
12
|
pg,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/editUserCls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"editUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/editUserCls.ts"],"names":[],"mappings":"AAWA,wBAA8B,cAAc,CAC1C,EAAE,EAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAClD,KAAK,EAAE,GAAG,gBAsCX"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UnauthorizedError } from "../../../../errors.js";
|
|
1
2
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
2
3
|
import getSelectMeta from "../../../plugins/table/funcs/getSelectMeta.js";
|
|
3
4
|
import { addUserCls, addCustomCls, editUserCls, getUserCls, } from "../../../plugins/usercls/index.js";
|
|
@@ -6,7 +7,7 @@ export default async function editUserClsApi({ pg = pgClients.client, body, para
|
|
|
6
7
|
const { data, table, description, alias } = body;
|
|
7
8
|
const t1 = Date.now();
|
|
8
9
|
if (!user?.uid) {
|
|
9
|
-
|
|
10
|
+
throw UnauthorizedError("unauthorized");
|
|
10
11
|
}
|
|
11
12
|
if (table) {
|
|
12
13
|
await addCustomCls({ name, data, description, alias, table, uid: user.uid }, pg);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export default function getUserClsListApi({ query, user, pg }: any
|
|
1
|
+
export default function getUserClsListApi({ query, user, pg, }: any): Promise<any>;
|
|
2
2
|
//# sourceMappingURL=getUserCls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/getUserCls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/getUserCls.ts"],"names":[],"mappings":"AASA,wBAA8B,iBAAiB,CAAC,EAC9C,KAAK,EACL,IAAI,EACJ,EAAqB,GACtB,EAAE,GAAG,gBAyBL"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import config from "../../../../config.js";
|
|
2
|
+
import { UnauthorizedError } from "../../../../errors.js";
|
|
2
3
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
3
4
|
import { getUserClsList } from "../../../plugins/usercls/index.js";
|
|
4
5
|
// query.name = cls1,cls2,cls3
|
|
5
6
|
// query.search = substring of cls name
|
|
6
7
|
// data[idx].count - should not depend on either query.name or query.search
|
|
7
|
-
export default async function getUserClsListApi({ query, user, pg = pgClients.client }
|
|
8
|
+
export default async function getUserClsListApi({ query, user, pg = pgClients.client, }) {
|
|
8
9
|
if (!user?.uid && !config.local) {
|
|
9
|
-
|
|
10
|
+
throw UnauthorizedError("unauthorized");
|
|
10
11
|
}
|
|
11
12
|
if (!pg) {
|
|
12
|
-
|
|
13
|
+
throw Error("empty pg");
|
|
13
14
|
}
|
|
14
15
|
const t1 = Date.now();
|
|
15
16
|
const result = await getUserClsList({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/routes/usercls/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/routes/usercls/index.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,GAAG,EAAE,GAAG,QAkDtC"}
|
|
@@ -27,19 +27,20 @@ import getUserCls from "./controllers/getUserCls.js";
|
|
|
27
27
|
import addUserCls from "./controllers/addUserCls.js";
|
|
28
28
|
import editUserCls from "./controllers/editUserCls.js";
|
|
29
29
|
import deleteUserCls from "./controllers/deleteUserCls.js";
|
|
30
|
+
const tags = ["core", "usercls"];
|
|
30
31
|
export default function plugin(app) {
|
|
31
32
|
if (!app.hasRoute({ method: "GET", url: "/api/user-cls" })) {
|
|
32
|
-
app.get("/user-cls", { config: { policy: "L1" } }, getUserCls);
|
|
33
|
+
app.get("/user-cls", { config: { tags, policy: "L1" } }, getUserCls);
|
|
33
34
|
}
|
|
34
35
|
if (!app.hasRoute({ method: "POST", url: "/api/user-cls" })) {
|
|
35
36
|
app.post("/user-cls", {
|
|
36
|
-
config: { policy: "L1" },
|
|
37
|
+
config: { tags, policy: "L1" },
|
|
37
38
|
schema: { body: addUserClsBodySchema },
|
|
38
39
|
}, addUserCls);
|
|
39
40
|
}
|
|
40
41
|
if (!app.hasRoute({ method: "PUT", url: "/api/user-cls/:name" })) {
|
|
41
42
|
app.put("/user-cls/:name", {
|
|
42
|
-
config: { policy: "L1" },
|
|
43
|
+
config: { tags, policy: "L1" },
|
|
43
44
|
schema: {
|
|
44
45
|
params: userClsParamsSchema,
|
|
45
46
|
body: editUserClsBodySchema,
|
|
@@ -47,9 +48,15 @@ export default function plugin(app) {
|
|
|
47
48
|
}, editUserCls);
|
|
48
49
|
}
|
|
49
50
|
if (!app.hasRoute({ method: "DELETE", url: "/api/user-cls/:name" })) {
|
|
50
|
-
app.delete("/user-cls/:name", {
|
|
51
|
+
app.delete("/user-cls/:name", {
|
|
52
|
+
config: { tags, policy: "L1" },
|
|
53
|
+
schema: { params: userClsParamsSchema },
|
|
54
|
+
}, deleteUserCls);
|
|
51
55
|
}
|
|
52
56
|
if (!app.hasRoute({ method: "DELETE", url: "/api/user-cls/:name/:code" })) {
|
|
53
|
-
app.delete("/user-cls/:name/:code", {
|
|
57
|
+
app.delete("/user-cls/:name/:code", {
|
|
58
|
+
config: { tags, policy: "L1" },
|
|
59
|
+
schema: { params: userClsParamsSchema },
|
|
60
|
+
}, deleteUserCls);
|
|
54
61
|
}
|
|
55
62
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export default function apiListService({ includeTags: queryIncludeTags, excludeTags: queryExcludeTags, packageName, subdir, md, routes, }: {
|
|
2
|
+
includeTags?: any;
|
|
3
|
+
excludeTags?: any;
|
|
4
|
+
packageName?: string;
|
|
5
|
+
subdir?: string;
|
|
6
|
+
md?: string;
|
|
7
|
+
routes: any[];
|
|
8
|
+
}): {
|
|
9
|
+
headers: {
|
|
10
|
+
"Content-Type": string;
|
|
11
|
+
};
|
|
12
|
+
data: string;
|
|
13
|
+
rows?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
rows: any[];
|
|
16
|
+
headers?: undefined;
|
|
17
|
+
data?: undefined;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=api.list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.list.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/api.list.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,WAAW,EAAE,gBAAgB,EAC7B,WAAW,EAAE,gBAAgB,EAC7B,WAAW,EACX,MAAM,EACN,EAAE,EACF,MAAM,GACP,EAAE;IACD,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,GAAG,EAAE,CAAC;CACf;;;;;;;;;;EA2CA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import config from "../../../../config.js";
|
|
2
|
+
const columns = config.apiListMDColumns || "method|endpoint|description|tags";
|
|
3
|
+
function toMarkdownTable(data, columns) {
|
|
4
|
+
if (!Array.isArray(data) || !data.length)
|
|
5
|
+
return "";
|
|
6
|
+
// auto-detect columns if not provided
|
|
7
|
+
const cols = columns || [...new Set(data.flatMap((row) => Object.keys(row)))];
|
|
8
|
+
const escape = (value) => String(value ?? "")
|
|
9
|
+
.replace(/\|/g, "\\|")
|
|
10
|
+
.replace(/\n/g, " ");
|
|
11
|
+
const header = `| ${cols.join(" | ")} |`;
|
|
12
|
+
const separator = `| ${cols.map(() => "---").join(" | ")} |`;
|
|
13
|
+
const rows = data.map((row) => {
|
|
14
|
+
return `| ${cols
|
|
15
|
+
.map((col) => {
|
|
16
|
+
const value = row[col];
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
return escape(value.join(", "));
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === "object" && value !== null) {
|
|
21
|
+
return escape(JSON.stringify(value));
|
|
22
|
+
}
|
|
23
|
+
return escape(value);
|
|
24
|
+
})
|
|
25
|
+
.join(" | ")} |`;
|
|
26
|
+
});
|
|
27
|
+
return [header, separator, ...rows].join("\n");
|
|
28
|
+
}
|
|
29
|
+
export default function apiListService({ includeTags: queryIncludeTags, excludeTags: queryExcludeTags, packageName, subdir, md, routes, }) {
|
|
30
|
+
const includeTags = queryIncludeTags
|
|
31
|
+
? new Set(queryIncludeTags?.split("|"))
|
|
32
|
+
: undefined;
|
|
33
|
+
const excludeTags = queryExcludeTags
|
|
34
|
+
? new Set(queryExcludeTags?.split("|"))
|
|
35
|
+
: undefined;
|
|
36
|
+
const filteredRoutes = excludeTags
|
|
37
|
+
? routes.filter((r) => !r.tags || !r.tags.find((tag) => excludeTags.has(tag)))
|
|
38
|
+
: routes;
|
|
39
|
+
const filteredRoutes1 = includeTags
|
|
40
|
+
? filteredRoutes.filter((r) => r.tags && r.tags.find((tag) => includeTags.has(tag)))
|
|
41
|
+
: filteredRoutes;
|
|
42
|
+
const filteredRoutes2 = subdir
|
|
43
|
+
? filteredRoutes1.filter((r) => r.subdir === subdir)
|
|
44
|
+
: filteredRoutes1;
|
|
45
|
+
const filteredRoutes3 = packageName
|
|
46
|
+
? filteredRoutes2.filter((r) => r.package === packageName)
|
|
47
|
+
: filteredRoutes2;
|
|
48
|
+
if (md) {
|
|
49
|
+
const markdownStr = toMarkdownTable(filteredRoutes3, Array.isArray(columns) ? columns : columns.split("|"));
|
|
50
|
+
return {
|
|
51
|
+
headers: {
|
|
52
|
+
"Content-Type": "text/markdown",
|
|
53
|
+
},
|
|
54
|
+
data: markdownStr,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return { rows: filteredRoutes3 };
|
|
58
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.generator.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/code.generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"code.generator.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/code.generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAgFzD,wBAA8B,aAAa,CACzC,EACE,EAAqB,EACrB,MAAW,EACX,IAAS,EACT,KAAU,GACX,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;CAC7B,EACD,KAAK,EAAE,YAAY,kBA+GpB"}
|
|
@@ -2,6 +2,7 @@ import getTemplate from "../../../plugins/table/funcs/getTemplate.js";
|
|
|
2
2
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
3
3
|
import getToken from "../../../plugins/crud/funcs/getToken.js";
|
|
4
4
|
import { handlebarsSync } from "../../../../utils.js";
|
|
5
|
+
import { BadRequestError, ForbiddenError, NotFoundError, UnauthorizedError, } from "../../../../errors.js";
|
|
5
6
|
function dayOfTheYear(date) {
|
|
6
7
|
const start = new Date(date.getFullYear(), 0, 0);
|
|
7
8
|
const diff = date -
|
|
@@ -63,10 +64,10 @@ export default async function codeGenerator({ pg = pgClients.client, params = {}
|
|
|
63
64
|
const { token, column } = params;
|
|
64
65
|
const data = query.data?.split?.(";") || [];
|
|
65
66
|
if (!token || !column) {
|
|
66
|
-
|
|
67
|
+
throw BadRequestError("not enough params: token / column");
|
|
67
68
|
}
|
|
68
69
|
if (!user?.uid) {
|
|
69
|
-
|
|
70
|
+
throw UnauthorizedError("unauthorized");
|
|
70
71
|
}
|
|
71
72
|
const tokenData = (await getToken({ token, uid: user?.uid, json: 1 })) || {};
|
|
72
73
|
const currentYear = new Date().getFullYear();
|
|
@@ -94,15 +95,15 @@ export default async function codeGenerator({ pg = pgClients.client, params = {}
|
|
|
94
95
|
return reply.status(200).send(result);
|
|
95
96
|
}
|
|
96
97
|
if (!tokenData?.form || !tokenData?.table) {
|
|
97
|
-
|
|
98
|
+
throw new ForbiddenError("token not allow");
|
|
98
99
|
}
|
|
99
100
|
const loadTemplate = await getTemplate("form", tokenData.form);
|
|
100
101
|
const schema = loadTemplate?.schema || loadTemplate;
|
|
101
102
|
if (!schema) {
|
|
102
|
-
|
|
103
|
+
throw NotFoundError("form not found");
|
|
103
104
|
}
|
|
104
105
|
if (!schema?.[column]?.template) {
|
|
105
|
-
|
|
106
|
+
throw BadRequestError("template not specified");
|
|
106
107
|
}
|
|
107
108
|
const columnValue = data
|
|
108
109
|
.find((el) => el.startsWith(column))
|
|
@@ -111,7 +112,7 @@ export default async function codeGenerator({ pg = pgClients.client, params = {}
|
|
|
111
112
|
const loadTable = await getTemplate("table", tokenData.table);
|
|
112
113
|
const table = loadTable?.table || tokenData.table;
|
|
113
114
|
if (!pg.pk?.[table]) {
|
|
114
|
-
|
|
115
|
+
throw NotFoundError("table pk not found");
|
|
115
116
|
}
|
|
116
117
|
const count = pg
|
|
117
118
|
? await pg
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { FastifyReply } from "fastify";
|
|
2
1
|
export default function userTokensAPI({ params, user, }: {
|
|
3
2
|
params: {
|
|
4
3
|
token: string;
|
|
5
4
|
};
|
|
6
5
|
user?: Record<string, any>;
|
|
7
|
-
}
|
|
6
|
+
}): Promise<any>;
|
|
8
7
|
//# sourceMappingURL=user.tokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.tokens.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/user.tokens.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user.tokens.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/user.tokens.ts"],"names":[],"mappings":"AAeA,wBAA8B,aAAa,CAAC,EAC1C,MAAM,EACN,IAAS,GACV,EAAE;IACD,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B,gBA2CA"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { customTokens, userTokens, handlebarsSync, setOpt, getOpt, config, } from "../../../../utils.js";
|
|
2
|
-
|
|
2
|
+
import { BadRequestError, NotFoundError, UnauthorizedError, } from "../../../../errors.js";
|
|
3
|
+
export default async function userTokensAPI({ params, user = {}, }) {
|
|
3
4
|
if (!user?.uid) {
|
|
4
|
-
|
|
5
|
+
throw UnauthorizedError("unauthorized");
|
|
5
6
|
}
|
|
6
7
|
if (!params?.token) {
|
|
7
|
-
|
|
8
|
+
throw BadRequestError("not enough params: token");
|
|
8
9
|
}
|
|
9
10
|
if (!config.redis) {
|
|
10
|
-
|
|
11
|
+
throw new Error("empty redis");
|
|
11
12
|
}
|
|
12
13
|
if (!customTokens[params.token]) {
|
|
13
|
-
|
|
14
|
+
throw NotFoundError("token not found");
|
|
14
15
|
}
|
|
15
16
|
// return from cache
|
|
16
17
|
if (userTokens[user.uid]?.[params.token]) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/routes/util/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/routes/util/index.ts"],"names":[],"mappings":"AAWA,iBAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,GAAE,GAAQ,QAmCtC;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -4,16 +4,17 @@ import statusMonitor from "./controllers/status.monitor.js";
|
|
|
4
4
|
import userTokens from "./controllers/user.tokens.js";
|
|
5
5
|
import codeGenerator from "./controllers/code.generator.js";
|
|
6
6
|
import dependencies from "./controllers/dependencies.js";
|
|
7
|
+
const tags = ["core", "util"];
|
|
7
8
|
function plugin(app, opt = {}) {
|
|
8
|
-
app.get("/next-id", { config: { policy: "L0" } }, nextId);
|
|
9
|
-
app.get("/status-monitor", { config: { role: "admin" } }, statusMonitor);
|
|
10
|
-
app.get("/user-tokens/:token", { config: { role: "admin|regular" } }, userTokens);
|
|
11
|
-
app.get("/code-gen/:token/:column/:id?", { config: { role: "admin|regular" } }, codeGenerator);
|
|
12
|
-
app.get("/test-proxy", { config: { policy: "L0" } }, (req) => ({
|
|
9
|
+
app.get("/next-id", { config: { tags, policy: "L0" } }, nextId);
|
|
10
|
+
app.get("/status-monitor", { config: { tags, role: "admin" } }, statusMonitor);
|
|
11
|
+
app.get("/user-tokens/:token", { config: { tags, role: "admin|regular" } }, userTokens);
|
|
12
|
+
app.get("/code-gen/:token/:column/:id?", { config: { tags, role: "admin|regular" } }, codeGenerator);
|
|
13
|
+
app.get("/test-proxy", { config: { tags, policy: "L0" } }, (req) => ({
|
|
13
14
|
...(req.headers || {}),
|
|
14
15
|
sessionId: req.session?.sessionId,
|
|
15
16
|
}));
|
|
16
|
-
app.get("/config", { config: { policy: "L0" /*role: "admin"*/ } }, apiConfig);
|
|
17
|
-
app.get("/dependencies", { config: { policy: "L1", role: "admin" } }, dependencies);
|
|
17
|
+
app.get("/config", { config: { tags, policy: "L0" /*role: "admin"*/ } }, apiConfig);
|
|
18
|
+
app.get("/dependencies", { config: { tags, policy: "L1", role: "admin" } }, dependencies);
|
|
18
19
|
}
|
|
19
20
|
export default plugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.edit.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/file.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"file.edit.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/file.edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAS5C,wBAA8B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAsDpE"}
|
|
@@ -2,16 +2,17 @@ import path from "node:path";
|
|
|
2
2
|
import dataUpdate from "../../../plugins/crud/funcs/dataUpdate.js";
|
|
3
3
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
4
4
|
import uploadMultiPart from "../../../plugins/file/uploadMultiPart.js";
|
|
5
|
+
import { BadRequestError, NotFoundError } from "../../../../errors.js";
|
|
5
6
|
export default async function widgetSet(req, reply) {
|
|
6
7
|
const { pg = pgClients.client, headers = {}, user = {}, params = {} } = req;
|
|
7
8
|
if (!params?.id) {
|
|
8
|
-
|
|
9
|
+
throw BadRequestError("not enough params: id");
|
|
9
10
|
}
|
|
10
11
|
if (!pg.pk?.["crm.files"]) {
|
|
11
|
-
|
|
12
|
+
throw NotFoundError("table not found");
|
|
12
13
|
}
|
|
13
14
|
if (headers["content-type"]?.split?.(";")?.shift?.() !== "multipart/form-data") {
|
|
14
|
-
|
|
15
|
+
throw BadRequestError("invalid payload content type");
|
|
15
16
|
}
|
|
16
17
|
const file = await uploadMultiPart(req);
|
|
17
18
|
const extName = path
|
|
@@ -36,7 +37,7 @@ export default async function widgetSet(req, reply) {
|
|
|
36
37
|
uid: user?.uid,
|
|
37
38
|
});
|
|
38
39
|
if (!result?.file_id) {
|
|
39
|
-
|
|
40
|
+
throw NotFoundError("file not found");
|
|
40
41
|
}
|
|
41
42
|
return reply.status(200).send({
|
|
42
43
|
rowCount: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.del.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.del.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"widget.del.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.del.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAwB5C;;;;;;;;;;;;;;;;;GAiBG;AAEH,wBAA8B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBA+EpE"}
|
|
@@ -2,6 +2,7 @@ import config from "../../../../config.js";
|
|
|
2
2
|
import isFileExists from "../../../plugins/file/isFileExists.js";
|
|
3
3
|
import logChanges from "../../../plugins/crud/funcs/utils/logChanges.js";
|
|
4
4
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
5
|
+
import { BadRequestError, ForbiddenError, UnauthorizedError, } from "../../../../errors.js";
|
|
5
6
|
const isAdmin = (req) => process.env.NODE_ENV === "admin" ||
|
|
6
7
|
config.admin ||
|
|
7
8
|
req?.hostname?.split?.(":")?.shift?.() === config.adminDomain ||
|
|
@@ -33,23 +34,21 @@ async function checkAccess(pg, objectid, id) {
|
|
|
33
34
|
export default async function widgetDel(req, reply) {
|
|
34
35
|
const { pg = pgClients.client, params, user = {}, } = req;
|
|
35
36
|
if (!user?.uid) {
|
|
36
|
-
|
|
37
|
+
throw UnauthorizedError("unauthorized");
|
|
37
38
|
}
|
|
38
39
|
const { type, objectid, id } = params || {};
|
|
39
40
|
if (!objectid) {
|
|
40
|
-
|
|
41
|
+
throw BadRequestError("not enough params: object id");
|
|
41
42
|
}
|
|
42
43
|
if (!id && type !== "reaction") {
|
|
43
|
-
|
|
44
|
+
throw BadRequestError("not enough params: id");
|
|
44
45
|
}
|
|
45
46
|
// force delete db entry if file not exists
|
|
46
47
|
const { exists, uid } = ["file", "gallery"].includes(type)
|
|
47
48
|
? await checkAccess(pg, objectid, id)
|
|
48
49
|
: {};
|
|
49
50
|
if (exists && !isAdmin(req) && uid && user?.uid !== uid) {
|
|
50
|
-
|
|
51
|
-
.status(403)
|
|
52
|
-
.send("access restricted: file exists, not an author");
|
|
51
|
+
throw ForbiddenError("access restricted: file exists, not an author");
|
|
53
52
|
}
|
|
54
53
|
const sqls = {
|
|
55
54
|
comment: `delete from crm.communications where entity_id=$1 and ${isAdmin(req) ? "$2=$2" : "uid=$2"} and communication_id=$3`,
|
|
@@ -67,7 +66,7 @@ export default async function widgetDel(req, reply) {
|
|
|
67
66
|
reaction: "crm.reactions",
|
|
68
67
|
}[type];
|
|
69
68
|
if (!sql || !table) {
|
|
70
|
-
|
|
69
|
+
throw BadRequestError("invalid widget type");
|
|
71
70
|
}
|
|
72
71
|
const { rows = [] } = await pg.query(sql, [objectid, user.uid, id || ""]);
|
|
73
72
|
await logChanges({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.get.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"widget.get.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.get.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AAEH,wBAA8B,SAAS,CACrC,EAAE,EAAqB,EAAE,IAAS,EAAE,MAAW,EAAE,KAAU,EAAE,EAAE,GAAG,EAClE,KAAK,EAAE,GAAG,gBAyLX"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import getMeta from "../../../plugins/pg/funcs/getMeta.js";
|
|
2
2
|
import getToken from "../../../plugins/crud/funcs/getToken.js";
|
|
3
3
|
import pgClients from "../../../plugins/pg/pgClients.js";
|
|
4
|
+
import { BadRequestError, NotFoundError } from "../../../../errors.js";
|
|
4
5
|
const galleryExtList = [
|
|
5
6
|
"png",
|
|
6
7
|
"svg",
|
|
@@ -34,7 +35,7 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
|
|
|
34
35
|
: null;
|
|
35
36
|
const objectid = param ? JSON.parse(param)?.id : params.objectid;
|
|
36
37
|
if (!objectid) {
|
|
37
|
-
|
|
38
|
+
throw BadRequestError("not enough params: id");
|
|
38
39
|
}
|
|
39
40
|
const sqls = {
|
|
40
41
|
comment: pg.pk["admin.users"]
|
|
@@ -86,7 +87,7 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
|
|
|
86
87
|
};
|
|
87
88
|
const q = sqls[params.type];
|
|
88
89
|
if (!q) {
|
|
89
|
-
|
|
90
|
+
throw BadRequestError("invalid widget type");
|
|
90
91
|
}
|
|
91
92
|
/* rows */
|
|
92
93
|
const rows = await pg
|
|
@@ -122,7 +123,7 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
|
|
|
122
123
|
params.type === "history" &&
|
|
123
124
|
process.env.NODE_ENV !== "test" &&
|
|
124
125
|
!process.env.VITEST) {
|
|
125
|
-
|
|
126
|
+
throw NotFoundError("log table not found");
|
|
126
127
|
}
|
|
127
128
|
const cdateColumn = columns.find((col) => ["cdate", "created_at"].includes(col.name))?.name;
|
|
128
129
|
const editorDateColumn = columns.find((col) => ["editor_date", "updated_at"].includes(col.name))?.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.set.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.set.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"widget.set.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.set.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAqC5C,wBAA8B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY;;;;;;GAqHpE"}
|
|
@@ -4,6 +4,7 @@ import dataInsert from "../../../plugins/crud/funcs/dataInsert.js";
|
|
|
4
4
|
import dataUpdate from "../../../plugins/crud/funcs/dataUpdate.js";
|
|
5
5
|
import { applyHook } from "../../../../utils.js";
|
|
6
6
|
import uploadMultiPart from "../../../plugins/file/uploadMultiPart.js";
|
|
7
|
+
import { BadRequestError, NotFoundError } from "../../../../errors.js";
|
|
7
8
|
const tableList = {
|
|
8
9
|
comment: "crm.communications",
|
|
9
10
|
gallery: "crm.files",
|
|
@@ -32,10 +33,10 @@ export default async function widgetSet(req, reply) {
|
|
|
32
33
|
const { pg, params, headers = {}, body = {}, user = {}, } = req;
|
|
33
34
|
const { type, id, objectid } = params || {};
|
|
34
35
|
if (!pkList[type] || !tableList[type]) {
|
|
35
|
-
|
|
36
|
+
throw BadRequestError("param type not valid");
|
|
36
37
|
}
|
|
37
38
|
if (!objectid) {
|
|
38
|
-
|
|
39
|
+
throw BadRequestError("not enough params: id");
|
|
39
40
|
}
|
|
40
41
|
const table = tableList[type];
|
|
41
42
|
// dsadasdad
|
|
@@ -58,7 +59,7 @@ export default async function widgetSet(req, reply) {
|
|
|
58
59
|
entity_id: objectid,
|
|
59
60
|
};
|
|
60
61
|
if (type === "gallery" && !galleryExtList.includes(extName.toLowerCase())) {
|
|
61
|
-
|
|
62
|
+
throw BadRequestError("invalid file extension");
|
|
62
63
|
}
|
|
63
64
|
const { rows = [] } = await dataInsert({
|
|
64
65
|
pg,
|
|
@@ -82,7 +83,7 @@ export default async function widgetSet(req, reply) {
|
|
|
82
83
|
}
|
|
83
84
|
const { pk } = await getMeta({ pg, table });
|
|
84
85
|
if (!pk) {
|
|
85
|
-
|
|
86
|
+
throw NotFoundError("table not found");
|
|
86
87
|
}
|
|
87
88
|
const data = { ...body, uid: user?.uid, entity_id: objectid };
|
|
88
89
|
await applyHook("onWidgetSet", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/routes/widget/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/routes/widget/index.ts"],"names":[],"mappings":"AA2CA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,GAAE,GAAQ,QAKpD"}
|