adminforth 2.17.0-next.4 → 2.17.0-next.40
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/commands/createApp/templates/adminuser.ts.hbs +2 -1
- package/commands/createApp/templates/index.ts.hbs +3 -2
- package/commands/createCustomComponent/main.js +0 -3
- package/commands/createCustomComponent/templates/customCrud/afterBreadcrumbs.vue.hbs +4 -2
- package/commands/createCustomComponent/templates/customCrud/beforeActionButtons.vue.hbs +3 -2
- package/commands/createCustomComponent/templates/customCrud/beforeBreadcrumbs.vue.hbs +4 -2
- package/commands/createCustomComponent/templates/customCrud/bottom.vue.hbs +4 -2
- package/commands/createCustomComponent/templates/customCrud/threeDotsDropdownItems.vue.hbs +4 -2
- package/commands/createPlugin/templates/index.ts.hbs +4 -0
- package/dist/auth.d.ts +2 -2
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +17 -10
- package/dist/auth.js.map +1 -1
- package/dist/basePlugin.d.ts +1 -0
- package/dist/basePlugin.d.ts.map +1 -1
- package/dist/basePlugin.js +6 -2
- package/dist/basePlugin.js.map +1 -1
- package/dist/dataConnectors/baseConnector.d.ts +1 -0
- package/dist/dataConnectors/baseConnector.d.ts.map +1 -1
- package/dist/dataConnectors/baseConnector.js +100 -14
- package/dist/dataConnectors/baseConnector.js.map +1 -1
- package/dist/dataConnectors/clickhouse.d.ts +2 -0
- package/dist/dataConnectors/clickhouse.d.ts.map +1 -1
- package/dist/dataConnectors/clickhouse.js +15 -4
- package/dist/dataConnectors/clickhouse.js.map +1 -1
- package/dist/dataConnectors/mongo.d.ts +8 -1
- package/dist/dataConnectors/mongo.d.ts.map +1 -1
- package/dist/dataConnectors/mongo.js +72 -28
- package/dist/dataConnectors/mongo.js.map +1 -1
- package/dist/dataConnectors/mysql.d.ts +2 -0
- package/dist/dataConnectors/mysql.d.ts.map +1 -1
- package/dist/dataConnectors/mysql.js +22 -23
- package/dist/dataConnectors/mysql.js.map +1 -1
- package/dist/dataConnectors/postgres.d.ts +2 -0
- package/dist/dataConnectors/postgres.d.ts.map +1 -1
- package/dist/dataConnectors/postgres.js +23 -26
- package/dist/dataConnectors/postgres.js.map +1 -1
- package/dist/dataConnectors/sqlite.d.ts +2 -0
- package/dist/dataConnectors/sqlite.d.ts.map +1 -1
- package/dist/dataConnectors/sqlite.js +19 -19
- package/dist/dataConnectors/sqlite.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -54
- package/dist/index.js.map +1 -1
- package/dist/modules/codeInjector.d.ts.map +1 -1
- package/dist/modules/codeInjector.js +45 -63
- package/dist/modules/codeInjector.js.map +1 -1
- package/dist/modules/configValidator.d.ts.map +1 -1
- package/dist/modules/configValidator.js +14 -9
- package/dist/modules/configValidator.js.map +1 -1
- package/dist/modules/logger.d.ts +5 -0
- package/dist/modules/logger.d.ts.map +1 -0
- package/dist/modules/logger.js +16 -0
- package/dist/modules/logger.js.map +1 -0
- package/dist/modules/restApi.d.ts.map +1 -1
- package/dist/modules/restApi.js +21 -23
- package/dist/modules/restApi.js.map +1 -1
- package/dist/modules/socketBroker.d.ts.map +1 -1
- package/dist/modules/socketBroker.js +6 -5
- package/dist/modules/socketBroker.js.map +1 -1
- package/dist/modules/styles.js +1 -1
- package/dist/servers/express.d.ts.map +1 -1
- package/dist/servers/express.js +11 -11
- package/dist/servers/express.js.map +1 -1
- package/dist/spa/src/App.vue +6 -3
- package/dist/spa/src/adminforth.ts +60 -1
- package/dist/spa/src/afcl/DatePicker.vue +0 -1
- package/dist/spa/src/afcl/Dropzone.vue +6 -4
- package/dist/spa/src/afcl/Tooltip.vue +38 -4
- package/dist/spa/src/components/ColumnValueInput.vue +14 -1
- package/dist/spa/src/components/CustomDateRangePicker.vue +0 -2
- package/dist/spa/src/components/CustomRangePicker.vue +9 -6
- package/dist/spa/src/components/Filters.vue +4 -4
- package/dist/spa/src/components/ListActionsThreeDots.vue +235 -0
- package/dist/spa/src/components/ResourceForm.vue +4 -4
- package/dist/spa/src/components/ResourceListTable.vue +30 -16
- package/dist/spa/src/components/ResourceListTableVirtual.vue +34 -18
- package/dist/spa/src/components/Sidebar.vue +4 -2
- package/dist/spa/src/components/ThreeDotsMenu.vue +6 -6
- package/dist/spa/src/composables/useFrontendApi.ts +8 -4
- package/dist/spa/src/renderers/CompactField.vue +3 -2
- package/dist/spa/src/renderers/CompactUUID.vue +3 -2
- package/dist/spa/src/renderers/RichText.vue +15 -0
- package/dist/spa/src/stores/core.ts +3 -2
- package/dist/spa/src/stores/filters.ts +1 -1
- package/dist/spa/src/types/Back.ts +34 -11
- package/dist/spa/src/types/Common.ts +7 -14
- package/dist/spa/src/types/FrontendAPI.ts +25 -10
- package/dist/spa/src/utils.ts +4 -3
- package/dist/spa/src/views/CreateView.vue +23 -31
- package/dist/spa/src/views/EditView.vue +27 -31
- package/dist/spa/src/views/ListView.vue +20 -10
- package/dist/spa/src/views/SettingsView.vue +3 -2
- package/dist/spa/src/views/ShowView.vue +7 -6
- package/dist/types/Back.d.ts +27 -5
- package/dist/types/Back.d.ts.map +1 -1
- package/dist/types/Back.js +6 -0
- package/dist/types/Back.js.map +1 -1
- package/dist/types/Common.d.ts +8 -15
- package/dist/types/Common.d.ts.map +1 -1
- package/dist/types/Common.js +2 -0
- package/dist/types/Common.js.map +1 -1
- package/dist/types/FrontendAPI.d.ts +32 -10
- package/dist/types/FrontendAPI.d.ts.map +1 -1
- package/dist/types/FrontendAPI.js.map +1 -1
- package/package.json +4 -1
- package/commands/createCustomComponent/templates/customCrud/saveButton.vue.hbs +0 -28
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AdminForth, { AdminForthDataTypes } from 'adminforth';
|
|
2
2
|
import type { AdminForthResourceInput, AdminForthResource, AdminUser } from 'adminforth';
|
|
3
3
|
import { randomUUID } from 'crypto';
|
|
4
|
+
import { logger } from 'adminforth';
|
|
4
5
|
|
|
5
6
|
async function allowedForSuperAdmin({ adminUser }: { adminUser: AdminUser }): Promise<boolean> {
|
|
6
7
|
return adminUser.dbUser.role === 'superadmin';
|
|
@@ -94,7 +95,7 @@ export default {
|
|
|
94
95
|
},
|
|
95
96
|
edit: {
|
|
96
97
|
beforeSave: async ({ oldRecord, updates, adminUser, resource }: { oldRecord: any, updates: any, adminUser: AdminUser, resource: AdminForthResource }) => {
|
|
97
|
-
|
|
98
|
+
logger.info(`Updating user, ${updates}`);
|
|
98
99
|
if (oldRecord.id === adminUser.dbUser.id && updates.role) {
|
|
99
100
|
return { ok: false, error: 'You cannot change your own role' };
|
|
100
101
|
}
|
|
@@ -5,6 +5,7 @@ import { fileURLToPath } from 'url';
|
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import { Filters } from 'adminforth';
|
|
7
7
|
import { initApi } from './api.js';
|
|
8
|
+
import { logger } from 'adminforth';
|
|
8
9
|
|
|
9
10
|
const ADMIN_BASE_URL = '';
|
|
10
11
|
|
|
@@ -75,7 +76,7 @@ if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
|
|
|
75
76
|
const port = 3500;
|
|
76
77
|
|
|
77
78
|
admin.bundleNow({ hotReload: process.env.NODE_ENV === 'development' }).then(() => {
|
|
78
|
-
|
|
79
|
+
logger.info('Bundling AdminForth SPA done.');
|
|
79
80
|
});
|
|
80
81
|
|
|
81
82
|
admin.express.serve(app);
|
|
@@ -91,6 +92,6 @@ if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
|
|
|
91
92
|
});
|
|
92
93
|
|
|
93
94
|
admin.express.listen(port, () => {
|
|
94
|
-
|
|
95
|
+
logger.info(`\x1b[38;5;249m ⚡ AdminForth is available at\x1b[1m\x1b[38;5;46m http://localhost:${port}${ADMIN_BASE_URL}\n`);
|
|
95
96
|
});
|
|
96
97
|
}
|
|
@@ -188,9 +188,6 @@ async function handleCrudPageInjectionCreation(config, resources) {
|
|
|
188
188
|
const injectionPosition = await select({
|
|
189
189
|
message: 'Where exactly do you want to inject the component?',
|
|
190
190
|
choices: [
|
|
191
|
-
...(crudType === 'create' || crudType === 'edit'
|
|
192
|
-
? [{ name: '💾 Save button on create/edit page', value: 'saveButton' }, new Separator()]
|
|
193
|
-
: []),
|
|
194
191
|
{ name: '⬆️ Before Breadcrumbs', value: 'beforeBreadcrumbs' },
|
|
195
192
|
{ name: '➡️ Before Action Buttons', value: 'beforeActionButtons' },
|
|
196
193
|
{ name: '⬇️ After Breadcrumbs', value: 'afterBreadcrumbs' },
|
|
@@ -13,11 +13,13 @@
|
|
|
13
13
|
<script setup lang="ts">
|
|
14
14
|
import { onMounted } from 'vue';
|
|
15
15
|
import { useI18n } from 'vue-i18n';
|
|
16
|
-
import
|
|
16
|
+
import { useAdminforth } from '@/adminforth';
|
|
17
17
|
import { AdminForthResourceCommon, AdminUser } from "@/types/Common";
|
|
18
18
|
|
|
19
19
|
const { t } = useI18n();
|
|
20
20
|
|
|
21
|
+
const { alert } = useAdminforth();
|
|
22
|
+
|
|
21
23
|
const props = defineProps<{
|
|
22
24
|
record: any
|
|
23
25
|
resource: AdminForthResourceCommon
|
|
@@ -30,7 +32,7 @@ onMounted(() => {
|
|
|
30
32
|
});
|
|
31
33
|
|
|
32
34
|
function handleClick() {
|
|
33
|
-
|
|
35
|
+
alert({
|
|
34
36
|
message: t('Confirmed'),
|
|
35
37
|
variant: 'success',
|
|
36
38
|
});
|
|
@@ -13,9 +13,10 @@
|
|
|
13
13
|
<script setup lang="ts">
|
|
14
14
|
import { onMounted } from 'vue';
|
|
15
15
|
import { useI18n } from 'vue-i18n';
|
|
16
|
-
import
|
|
16
|
+
import { useAdminforth } from '@/adminforth';
|
|
17
17
|
import { AdminForthResourceCommon, AdminUser } from "@/types/Common";
|
|
18
18
|
|
|
19
|
+
const { alert } = useAdminforth();
|
|
19
20
|
const { t } = useI18n();
|
|
20
21
|
|
|
21
22
|
const props = defineProps<{
|
|
@@ -30,7 +31,7 @@ onMounted(() => {
|
|
|
30
31
|
});
|
|
31
32
|
|
|
32
33
|
function handleClick() {
|
|
33
|
-
|
|
34
|
+
alert({
|
|
34
35
|
message: t('Confirmed'),
|
|
35
36
|
variant: 'success',
|
|
36
37
|
});
|
|
@@ -13,11 +13,13 @@
|
|
|
13
13
|
<script setup lang="ts">
|
|
14
14
|
import { onMounted } from 'vue';
|
|
15
15
|
import { useI18n } from 'vue-i18n';
|
|
16
|
-
import
|
|
16
|
+
import { useAdminforth } from '@/adminforth';
|
|
17
17
|
import { AdminForthResourceCommon, AdminUser } from "@/types/Common";
|
|
18
18
|
|
|
19
19
|
const { t } = useI18n();
|
|
20
20
|
|
|
21
|
+
const { alert } = useAdminforth();
|
|
22
|
+
|
|
21
23
|
const props = defineProps<{
|
|
22
24
|
record: any
|
|
23
25
|
resource: AdminForthResourceCommon
|
|
@@ -30,7 +32,7 @@ onMounted(() => {
|
|
|
30
32
|
});
|
|
31
33
|
|
|
32
34
|
function handleClick() {
|
|
33
|
-
|
|
35
|
+
alert({
|
|
34
36
|
message: t('Confirmed'),
|
|
35
37
|
variant: 'success',
|
|
36
38
|
});
|
|
@@ -13,11 +13,13 @@
|
|
|
13
13
|
<script setup lang="ts">
|
|
14
14
|
import { onMounted } from 'vue';
|
|
15
15
|
import { useI18n } from 'vue-i18n';
|
|
16
|
-
import
|
|
16
|
+
import { useAdminforth } from '@/adminforth';
|
|
17
17
|
import { AdminForthResourceCommon, AdminUser } from "@/types/Common";
|
|
18
18
|
|
|
19
19
|
const { t } = useI18n();
|
|
20
20
|
|
|
21
|
+
const { alert } = useAdminforth();
|
|
22
|
+
|
|
21
23
|
const props = defineProps<{
|
|
22
24
|
record: any
|
|
23
25
|
resource: AdminForthResourceCommon
|
|
@@ -30,7 +32,7 @@ onMounted(() => {
|
|
|
30
32
|
});
|
|
31
33
|
|
|
32
34
|
function handleClick() {
|
|
33
|
-
|
|
35
|
+
alert({
|
|
34
36
|
message: t('Confirmed'),
|
|
35
37
|
variant: 'success',
|
|
36
38
|
});
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
|
|
13
13
|
<script setup lang="ts">
|
|
14
14
|
import { useI18n } from 'vue-i18n';
|
|
15
|
-
import
|
|
15
|
+
import { useAdminforth} from '@/adminforth';
|
|
16
16
|
import { onMounted } from 'vue';
|
|
17
17
|
import { AdminForthResourceCommon, AdminUser } from "@/types/Common";
|
|
18
18
|
|
|
19
19
|
const { t } = useI18n();
|
|
20
20
|
|
|
21
|
+
const { alert } = useAdminforth();
|
|
22
|
+
|
|
21
23
|
const props = defineProps<{
|
|
22
24
|
record: any
|
|
23
25
|
resource: AdminForthResourceCommon
|
|
@@ -29,7 +31,7 @@ const menuItems = [
|
|
|
29
31
|
{
|
|
30
32
|
label: 'Show Success Alert',
|
|
31
33
|
action: () => {
|
|
32
|
-
|
|
34
|
+
alert({
|
|
33
35
|
message: t('Success Alert'),
|
|
34
36
|
variant: 'success',
|
|
35
37
|
});
|
package/dist/auth.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { IAdminForthAuth } from './types/Back.js';
|
|
|
3
3
|
declare class AdminForthAuth implements IAdminForthAuth {
|
|
4
4
|
adminforth: AdminForth;
|
|
5
5
|
constructor(adminforth: any);
|
|
6
|
-
getClientIp(headers: object):
|
|
6
|
+
getClientIp(headers: object): string;
|
|
7
7
|
removeAuthCookie(response: any): void;
|
|
8
8
|
setAuthCookie({ expireInDuration, response, username, pk }: {
|
|
9
9
|
expireInDuration?: string;
|
|
@@ -20,7 +20,7 @@ declare class AdminForthAuth implements IAdminForthAuth {
|
|
|
20
20
|
payload: {
|
|
21
21
|
name: string;
|
|
22
22
|
value: string;
|
|
23
|
-
expiry
|
|
23
|
+
expiry?: number | undefined;
|
|
24
24
|
expirySeconds: number | undefined;
|
|
25
25
|
httpOnly: boolean;
|
|
26
26
|
};
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"AAGA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAoClD,cAAM,cAAe,YAAW,eAAe;IAC7C,UAAU,EAAE,UAAU,CAAC;gBAEX,UAAU,KAAA;IAIxB,WAAW,CAAC,OAAO,EAAE,MAAM;IAkCzB,gBAAgB,CAAC,QAAQ,KAAA;IAKzB,aAAa,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAC,EAAE;QACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAClB;IAWD,kBAAkB,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAC;;;KAAA;IAKnC,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QACrC,QAAQ,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAA;KAC3I;IAiBD,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACjC,OAAO,EAAE;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KACtD,GAAG,MAAM,GAAG,IAAI;IAKjB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,GAAG,MAAc,GAAG,MAAM;IAW7E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;WAsChG,oBAAoB,CAAC,QAAQ,KAAA;WAM7B,cAAc,CAAC,QAAQ,KAAA,EAAE,cAAc,KAAA;CAOrD;AAED,eAAe,cAAc,CAAC"}
|
package/dist/auth.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import jwt from 'jsonwebtoken';
|
|
2
2
|
import crypto from 'crypto';
|
|
3
|
+
import { afLogger } from './modules/logger.js';
|
|
4
|
+
import is_ip_private from 'private-ip';
|
|
3
5
|
// Function to generate a password hash using PBKDF2
|
|
4
6
|
function calcPasswordHash(password, salt, iterations = 100000, keyLength = 64, digest = 'sha512') {
|
|
5
7
|
return new Promise((resolve, reject) => {
|
|
@@ -41,14 +43,15 @@ class AdminForthAuth {
|
|
|
41
43
|
acc[key.toLowerCase()] = headers[key];
|
|
42
44
|
return acc;
|
|
43
45
|
}, {});
|
|
46
|
+
let ip = null;
|
|
44
47
|
if (clientIpHeader) {
|
|
45
|
-
|
|
48
|
+
ip = headersLower[clientIpHeader.toLowerCase()];
|
|
46
49
|
}
|
|
47
50
|
else {
|
|
48
51
|
// first try common headers which can't bee spoofed, in other words
|
|
49
52
|
// most common to nginx/traefik/apache
|
|
50
53
|
// then fallback to less secure headers
|
|
51
|
-
|
|
54
|
+
ip = ((_a = headersLower['x-forwarded-for']) === null || _a === void 0 ? void 0 : _a.split(',').shift().trim()) ||
|
|
52
55
|
headersLower['x-real-ip'] ||
|
|
53
56
|
headersLower['x-client-ip'] ||
|
|
54
57
|
headersLower['x-cluster-client-ip'] ||
|
|
@@ -58,9 +61,13 @@ class AdminForthAuth {
|
|
|
58
61
|
headersLower['client-address'] ||
|
|
59
62
|
headersLower['client'] ||
|
|
60
63
|
headersLower['x-host'] ||
|
|
61
|
-
|
|
62
|
-
'unknown';
|
|
64
|
+
null;
|
|
63
65
|
}
|
|
66
|
+
const isIpPrivate = is_ip_private(ip);
|
|
67
|
+
if (isIpPrivate) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return ip;
|
|
64
71
|
}
|
|
65
72
|
removeAuthCookie(response) {
|
|
66
73
|
const brandSlug = this.adminforth.config.customization.brandNameSlug;
|
|
@@ -86,7 +93,7 @@ class AdminForthAuth {
|
|
|
86
93
|
expiryMs = expirySeconds * 1000;
|
|
87
94
|
}
|
|
88
95
|
else if (expiry !== undefined) {
|
|
89
|
-
|
|
96
|
+
afLogger.warn(`setCustomCookie: expiry(in ms) is deprecated, use expirySeconds instead (seconds), traceback: ${new Error().stack}`);
|
|
90
97
|
expiryMs = expiry;
|
|
91
98
|
}
|
|
92
99
|
const brandSlug = this.adminforth.config.customization.brandNameSlug;
|
|
@@ -119,25 +126,25 @@ class AdminForthAuth {
|
|
|
119
126
|
}
|
|
120
127
|
catch (err) {
|
|
121
128
|
if (err.name === 'TokenExpiredError') {
|
|
122
|
-
|
|
129
|
+
afLogger.error(`Token expired: ${err.message}`);
|
|
123
130
|
}
|
|
124
131
|
else if (err.name === 'JsonWebTokenError') {
|
|
125
|
-
|
|
132
|
+
afLogger.error(`Token error: ${err.message}`);
|
|
126
133
|
}
|
|
127
134
|
else {
|
|
128
|
-
|
|
135
|
+
afLogger.error(`Failed to verify JWT token: ${err}`);
|
|
129
136
|
}
|
|
130
137
|
return null;
|
|
131
138
|
}
|
|
132
139
|
const { pk, t } = decoded;
|
|
133
140
|
if (t !== mustHaveType) {
|
|
134
|
-
|
|
141
|
+
afLogger.error(`Invalid token type during verification: ${t}, must be ${mustHaveType}`);
|
|
135
142
|
return null;
|
|
136
143
|
}
|
|
137
144
|
if (decodeUser !== false) {
|
|
138
145
|
const dbUser = await this.adminforth.getUserByPk(pk);
|
|
139
146
|
if (!dbUser) {
|
|
140
|
-
|
|
147
|
+
afLogger.error(`User with pk ${pk} not found in database`);
|
|
141
148
|
// will logout user which was deleted
|
|
142
149
|
return null;
|
|
143
150
|
}
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../auth.ts"],"names":[],"mappings":"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"}
|
package/dist/basePlugin.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export default class AdminForthPlugin implements IAdminForthPlugin {
|
|
|
12
12
|
constructor(pluginOptions: any, metaUrl: string);
|
|
13
13
|
setupEndpoints(server: any): void;
|
|
14
14
|
instanceUniqueRepresentation(pluginOptions: any): string;
|
|
15
|
+
shouldHaveSingleInstancePerWholeApp(): boolean;
|
|
15
16
|
modifyResourceConfig(adminforth: IAdminForth, resourceConfig: AdminForthResource, allPluginInstances?: {
|
|
16
17
|
pi: AdminForthPlugin;
|
|
17
18
|
resource: AdminForthResource;
|
package/dist/basePlugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basePlugin.d.ts","sourceRoot":"","sources":["../basePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"basePlugin.d.ts","sourceRoot":"","sources":["../basePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAWrF,MAAM,CAAC,OAAO,OAAO,gBAAiB,YAAW,iBAAiB;IAEhE,UAAU,EAAE,WAAW,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAY;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,GAAG,CAAC;IACnB,cAAc,EAAE,kBAAkB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAK;gBAEhB,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;IAS/C,cAAc,CAAC,MAAM,EAAE,GAAG;IAI1B,4BAA4B,CAAC,aAAa,EAAE,GAAG,GAAI,MAAM;IAIzD,mCAAmC,IAAI,OAAO;IAI9C,oBAAoB,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE;QAAC,EAAE,EAAE,gBAAgB,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAC,EAAE;IAU7J;;;;QAII;IACJ,aAAa,CAAC,aAAa,EAAE,MAAM;CAmBpC"}
|
package/dist/basePlugin.js
CHANGED
|
@@ -2,6 +2,7 @@ import { getComponentNameFromPath, md5hash } from './modules/utils.js';
|
|
|
2
2
|
import { currentFileDir } from './modules/utils.js';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import fs from 'fs';
|
|
5
|
+
import { afLogger } from './modules/logger.js';
|
|
5
6
|
export default class AdminForthPlugin {
|
|
6
7
|
constructor(pluginOptions, metaUrl) {
|
|
7
8
|
this.customFolderName = 'custom';
|
|
@@ -10,7 +11,7 @@ export default class AdminForthPlugin {
|
|
|
10
11
|
this.pluginDir = currentFileDir(metaUrl);
|
|
11
12
|
this.customFolderPath = path.join(this.pluginDir, this.customFolderName);
|
|
12
13
|
this.pluginOptions = pluginOptions;
|
|
13
|
-
|
|
14
|
+
afLogger.trace(`🪲 🪲 AdminForthPlugin.constructor ${this.constructor.name}`);
|
|
14
15
|
this.className = this.constructor.name;
|
|
15
16
|
}
|
|
16
17
|
setupEndpoints(server) {
|
|
@@ -18,12 +19,15 @@ export default class AdminForthPlugin {
|
|
|
18
19
|
instanceUniqueRepresentation(pluginOptions) {
|
|
19
20
|
return 'non-uniquely-identified';
|
|
20
21
|
}
|
|
22
|
+
shouldHaveSingleInstancePerWholeApp() {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
21
25
|
modifyResourceConfig(adminforth, resourceConfig, allPluginInstances) {
|
|
22
26
|
this.resourceConfig = resourceConfig;
|
|
23
27
|
const uniqueness = this.instanceUniqueRepresentation(this.pluginOptions);
|
|
24
28
|
const seed = `af_pl_${this.constructor.name}_${resourceConfig.resourceId}_${uniqueness}`;
|
|
25
29
|
this.pluginInstanceId = md5hash(seed);
|
|
26
|
-
|
|
30
|
+
afLogger.trace(`🪲 AdminForthPlugin.modifyResourceConfig, ${seed}, 'id', ${this.pluginInstanceId}`);
|
|
27
31
|
this.adminforth = adminforth;
|
|
28
32
|
}
|
|
29
33
|
/**
|
package/dist/basePlugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basePlugin.js","sourceRoot":"","sources":["../basePlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"basePlugin.js","sourceRoot":"","sources":["../basePlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAYnC,YAAY,aAAkB,EAAE,OAAe;QAR/C,qBAAgB,GAAW,QAAQ,CAAC;QAMpC,oBAAe,GAAW,CAAC,CAAC;QAG1B,qBAAqB;QACrB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,QAAQ,CAAC,KAAK,CAAC,uCAAuC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,cAAc,CAAC,MAAW;IAE1B,CAAC;IAED,4BAA4B,CAAC,aAAkB;QAC7C,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,mCAAmC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB,CAAC,UAAuB,EAAE,cAAkC,EAAE,kBAA2E;QAC3J,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzE,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,cAAc,CAAC,UAAU,IAAI,UAAU,EAAE,CAAC;QACzF,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,QAAQ,CAAC,KAAK,CAAC,6CAA6C,IAAI,WAAW,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpG,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;;QAII;IACJ,aAAa,CAAC,aAAqB;QACjC,MAAM,GAAG,GAAG,cAAc,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC;QACnE,MAAM,aAAa,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1E,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,aAAa,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;QAC/G,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,6DAA6D,UAAU,GAAG,CAAC,CAAC;YAC9H,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;QACtE,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CAEF"}
|
|
@@ -27,6 +27,7 @@ export default class AdminForthBaseConnector implements IAdminForthDataSourceCon
|
|
|
27
27
|
}>;
|
|
28
28
|
getFieldValue(field: AdminForthResourceColumn, value: any): void;
|
|
29
29
|
setFieldValue(field: AdminForthResourceColumn, value: any): void;
|
|
30
|
+
validateAndSetFieldValue(field: AdminForthResourceColumn, value: any): any;
|
|
30
31
|
getMinMaxForColumnsWithOriginalTypes({ resource, columns }: {
|
|
31
32
|
resource: AdminForthResource;
|
|
32
33
|
columns: AdminForthResourceColumn[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseConnector.d.ts","sourceRoot":"","sources":["../../dataConnectors/baseConnector.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAAE,kCAAkC,EACtD,wBAAwB,EACxB,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EACjE,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAkD,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"baseConnector.d.ts","sourceRoot":"","sources":["../../dataConnectors/baseConnector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { suggestIfTypo } from "../modules/utils.js";
|
|
2
2
|
import { AdminForthDataTypes, AdminForthFilterOperators } from "../types/Common.js";
|
|
3
3
|
import { randomUUID } from "crypto";
|
|
4
|
+
import dayjs from "dayjs";
|
|
5
|
+
import { afLogger } from '../modules/logger.js';
|
|
4
6
|
export default class AdminForthBaseConnector {
|
|
5
7
|
get db() {
|
|
6
|
-
|
|
8
|
+
afLogger.warn('.db is deprecated, use .client instead');
|
|
7
9
|
return this.client;
|
|
8
10
|
}
|
|
9
11
|
setupClient(url) {
|
|
@@ -60,7 +62,6 @@ export default class AdminForthBaseConnector {
|
|
|
60
62
|
// in case column isArray and enumerator/foreign resource - IN filter must be transformed into OR filter
|
|
61
63
|
if (filterValidation.ok && f.operator == AdminForthFilterOperators.IN) {
|
|
62
64
|
const column = resource.dataSourceColumns.find((col) => col.name == f.field);
|
|
63
|
-
// console.log(`\n~~~ column: ${JSON.stringify(column, null, 2)}\n~~~ resource.columns: ${JSON.stringify(resource.dataSourceColumns, null, 2)}\n~~~ filter: ${JSON.stringify(f, null, 2)}\n`);
|
|
64
65
|
if (((_a = column.isArray) === null || _a === void 0 ? void 0 : _a.enabled) && (column.enum || column.foreignResource)) {
|
|
65
66
|
filters[fIndex] = {
|
|
66
67
|
operator: AdminForthFilterOperators.OR,
|
|
@@ -81,7 +82,8 @@ export default class AdminForthBaseConnector {
|
|
|
81
82
|
}
|
|
82
83
|
// Either compare with value or with rightField (field-to-field). If rightField is set, value must be undefined.
|
|
83
84
|
const comparingWithRightField = filtersAsSingle.rightField !== undefined && filtersAsSingle.rightField !== null;
|
|
84
|
-
|
|
85
|
+
const isEmptyOperator = filters.operator === AdminForthFilterOperators.IS_EMPTY || filters.operator === AdminForthFilterOperators.IS_NOT_EMPTY;
|
|
86
|
+
if (!comparingWithRightField && !isEmptyOperator && filtersAsSingle.value === undefined) {
|
|
85
87
|
return { ok: false, error: `Field "value" not specified in filter object: ${JSON.stringify(filters)}` };
|
|
86
88
|
}
|
|
87
89
|
if (comparingWithRightField && filtersAsSingle.value !== undefined) {
|
|
@@ -96,7 +98,7 @@ export default class AdminForthBaseConnector {
|
|
|
96
98
|
if (![AdminForthFilterOperators.EQ, AdminForthFilterOperators.NE, AdminForthFilterOperators.GT,
|
|
97
99
|
AdminForthFilterOperators.LT, AdminForthFilterOperators.GTE, AdminForthFilterOperators.LTE,
|
|
98
100
|
AdminForthFilterOperators.LIKE, AdminForthFilterOperators.ILIKE, AdminForthFilterOperators.IN,
|
|
99
|
-
AdminForthFilterOperators.NIN].includes(filters.operator)) {
|
|
101
|
+
AdminForthFilterOperators.NIN, AdminForthFilterOperators.IS_EMPTY, AdminForthFilterOperators.IS_NOT_EMPTY].includes(filters.operator)) {
|
|
100
102
|
return { ok: false, error: `Field "operator" has wrong value in filter object: ${JSON.stringify(filters)}` };
|
|
101
103
|
}
|
|
102
104
|
const fieldObj = resource.dataSourceColumns.find((col) => col.name == filtersAsSingle.field);
|
|
@@ -110,7 +112,7 @@ export default class AdminForthBaseConnector {
|
|
|
110
112
|
}));
|
|
111
113
|
}
|
|
112
114
|
if (isPolymorphicTarget) {
|
|
113
|
-
|
|
115
|
+
afLogger.trace(`⚠️ Field '${filtersAsSingle.field}' not found in polymorphic target resource '${resource.resourceId}', allowing query to proceed.`);
|
|
114
116
|
return { ok: true, error: '' };
|
|
115
117
|
}
|
|
116
118
|
else {
|
|
@@ -127,6 +129,13 @@ export default class AdminForthBaseConnector {
|
|
|
127
129
|
}
|
|
128
130
|
// No value conversion needed for field-to-field comparison here
|
|
129
131
|
}
|
|
132
|
+
else if (isEmptyOperator) {
|
|
133
|
+
// IS_EMPTY and IS_NOT_EMPTY don't need value normalization
|
|
134
|
+
// Set value to null if not already set
|
|
135
|
+
if (filtersAsSingle.value === undefined) {
|
|
136
|
+
filtersAsSingle.value = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
130
139
|
else if (filters.operator == AdminForthFilterOperators.IN || filters.operator == AdminForthFilterOperators.NIN) {
|
|
131
140
|
if (!Array.isArray(filters.value)) {
|
|
132
141
|
return { ok: false, error: `Value for operator '${filters.operator}' should be an array, in filter object: ${JSON.stringify(filters)}` };
|
|
@@ -142,10 +151,10 @@ export default class AdminForthBaseConnector {
|
|
|
142
151
|
return { ok: false, error: `Value for operator '${filters.operator}' should not be empty array, in filter object: ${JSON.stringify(filters)}` };
|
|
143
152
|
}
|
|
144
153
|
}
|
|
145
|
-
filters.value = filters.value.map((val) => this.
|
|
154
|
+
filters.value = filters.value.map((val) => this.validateAndSetFieldValue(fieldObj, val));
|
|
146
155
|
}
|
|
147
156
|
else {
|
|
148
|
-
filtersAsSingle.value = this.
|
|
157
|
+
filtersAsSingle.value = this.validateAndSetFieldValue(fieldObj, filtersAsSingle.value);
|
|
149
158
|
}
|
|
150
159
|
}
|
|
151
160
|
else if (filtersAsSingle.insecureRawSQL || filtersAsSingle.insecureRawNoSQL) {
|
|
@@ -187,6 +196,83 @@ export default class AdminForthBaseConnector {
|
|
|
187
196
|
setFieldValue(field, value) {
|
|
188
197
|
throw new Error('Method not implemented.');
|
|
189
198
|
}
|
|
199
|
+
validateAndSetFieldValue(field, value) {
|
|
200
|
+
// Int
|
|
201
|
+
if (field.type === AdminForthDataTypes.INTEGER) {
|
|
202
|
+
if (value === "" || value === null) {
|
|
203
|
+
return this.setFieldValue(field, null);
|
|
204
|
+
}
|
|
205
|
+
if (!Number.isFinite(value)) {
|
|
206
|
+
throw new Error(`Value is not an integer. Field ${field.name} with type is ${field.type}, but got value: ${value} with type ${typeof value}`);
|
|
207
|
+
}
|
|
208
|
+
return this.setFieldValue(field, value);
|
|
209
|
+
}
|
|
210
|
+
// Float
|
|
211
|
+
if (field.type === AdminForthDataTypes.FLOAT) {
|
|
212
|
+
if (value === "" || value === null) {
|
|
213
|
+
return this.setFieldValue(field, null);
|
|
214
|
+
}
|
|
215
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
216
|
+
throw new Error(`Value is not a float. Field ${field.name} with type is ${field.type}, but got value: ${String(value)} with type ${typeof value}`);
|
|
217
|
+
}
|
|
218
|
+
return this.setFieldValue(field, value);
|
|
219
|
+
}
|
|
220
|
+
// Decimal
|
|
221
|
+
if (field.type === AdminForthDataTypes.DECIMAL) {
|
|
222
|
+
if (value === "" || value === null) {
|
|
223
|
+
return this.setFieldValue(field, null);
|
|
224
|
+
}
|
|
225
|
+
// Accept string
|
|
226
|
+
if (typeof value === "string") {
|
|
227
|
+
const string = value.trim();
|
|
228
|
+
if (!string) {
|
|
229
|
+
return this.setFieldValue(field, null);
|
|
230
|
+
}
|
|
231
|
+
if (Number.isFinite(Number(string))) {
|
|
232
|
+
return this.setFieldValue(field, string);
|
|
233
|
+
}
|
|
234
|
+
throw new Error(`Value is not a decimal. Field ${field.name} with type is ${field.type}, but got value: ${value} with type ${typeof value}`);
|
|
235
|
+
}
|
|
236
|
+
// Accept Decimal-like objects (e.g., decimal.js) by using toString()
|
|
237
|
+
if (value && typeof value === "object" && typeof value.toString === "function") {
|
|
238
|
+
const s = value.toString();
|
|
239
|
+
if (typeof s === "string" && s.trim() !== "" && Number.isFinite(Number(s))) {
|
|
240
|
+
return this.setFieldValue(field, s);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
throw new Error(`Value is not a decimal. Field ${field.name} with type is ${field.type}, but got value: ${String(value)} with type ${typeof value}`);
|
|
244
|
+
}
|
|
245
|
+
// Date
|
|
246
|
+
// DateTime
|
|
247
|
+
if (field.type === AdminForthDataTypes.DATETIME) {
|
|
248
|
+
if (value === "" || value === null) {
|
|
249
|
+
return this.setFieldValue(field, null);
|
|
250
|
+
}
|
|
251
|
+
if (!dayjs(value).isValid()) {
|
|
252
|
+
throw new Error(`Value is not a valid datetime. Field ${field.name} with type is ${field.type}, but got value: ${value} with type ${typeof value}`);
|
|
253
|
+
}
|
|
254
|
+
return this.setFieldValue(field, value);
|
|
255
|
+
}
|
|
256
|
+
// Time
|
|
257
|
+
// Boolean
|
|
258
|
+
if (field.type === AdminForthDataTypes.BOOLEAN) {
|
|
259
|
+
if (value === "" || value === null) {
|
|
260
|
+
return this.setFieldValue(field, null);
|
|
261
|
+
}
|
|
262
|
+
if (typeof value !== 'boolean') {
|
|
263
|
+
throw new Error(`Value is not a boolean. Field ${field.name} with type is ${field.type}, but got value: ${value} with type ${typeof value}`);
|
|
264
|
+
}
|
|
265
|
+
return this.setFieldValue(field, value);
|
|
266
|
+
}
|
|
267
|
+
// JSON
|
|
268
|
+
// String
|
|
269
|
+
if (field.type === AdminForthDataTypes.STRING) {
|
|
270
|
+
if (value === "" || value === null) {
|
|
271
|
+
return this.setFieldValue(field, null);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return this.setFieldValue(field, value);
|
|
275
|
+
}
|
|
190
276
|
getMinMaxForColumnsWithOriginalTypes({ resource, columns }) {
|
|
191
277
|
throw new Error('Method not implemented.');
|
|
192
278
|
}
|
|
@@ -194,7 +280,7 @@ export default class AdminForthBaseConnector {
|
|
|
194
280
|
throw new Error('Method not implemented.');
|
|
195
281
|
}
|
|
196
282
|
async checkUnique(resource, column, value, record) {
|
|
197
|
-
|
|
283
|
+
afLogger.trace(`☝️🪲🪲🪲🪲 checkUnique||| ${column.name}, ${value}`);
|
|
198
284
|
const primaryKeyField = this.getPrimaryKey(resource);
|
|
199
285
|
const existingRecord = await this.getData({
|
|
200
286
|
resource,
|
|
@@ -227,7 +313,7 @@ export default class AdminForthBaseConnector {
|
|
|
227
313
|
}
|
|
228
314
|
if (filledRecord[col.name] !== undefined) {
|
|
229
315
|
// no sense to set value if it is not defined
|
|
230
|
-
recordWithOriginalValues[col.name] = this.
|
|
316
|
+
recordWithOriginalValues[col.name] = this.validateAndSetFieldValue(col, filledRecord[col.name]);
|
|
231
317
|
}
|
|
232
318
|
}
|
|
233
319
|
let error = null;
|
|
@@ -240,10 +326,10 @@ export default class AdminForthBaseConnector {
|
|
|
240
326
|
}
|
|
241
327
|
}));
|
|
242
328
|
if (error) {
|
|
243
|
-
|
|
329
|
+
afLogger.trace(`🪲🆕 check unique error, ${error}`);
|
|
244
330
|
return { error, ok: false };
|
|
245
331
|
}
|
|
246
|
-
|
|
332
|
+
afLogger.trace(`🪲🆕 creating record, ${JSON.stringify(recordWithOriginalValues)}`);
|
|
247
333
|
let pkValue = await this.createRecordOriginalValues({ resource, record: recordWithOriginalValues });
|
|
248
334
|
if (recordWithOriginalValues[this.getPrimaryKey(resource)] !== undefined) {
|
|
249
335
|
// some data sources always return some value for pk, even if it is was not auto generated
|
|
@@ -275,7 +361,7 @@ export default class AdminForthBaseConnector {
|
|
|
275
361
|
Update record received field '${field}' (with value ${newValues[field]}), but such column not found in resource '${resource.resourceId}'. ${similar ? `Did you mean '${similar}'?` : ''}
|
|
276
362
|
`);
|
|
277
363
|
}
|
|
278
|
-
recordWithOriginalValues[col.name] = this.
|
|
364
|
+
recordWithOriginalValues[col.name] = this.validateAndSetFieldValue(col, newValues[col.name]);
|
|
279
365
|
}
|
|
280
366
|
const record = await this.getRecordByPrimaryKey(resource, recordId);
|
|
281
367
|
let error = null;
|
|
@@ -288,10 +374,10 @@ export default class AdminForthBaseConnector {
|
|
|
288
374
|
}
|
|
289
375
|
}));
|
|
290
376
|
if (error) {
|
|
291
|
-
|
|
377
|
+
afLogger.trace(`🪲🆕 check unique error, ${error}`);
|
|
292
378
|
return { error, ok: false };
|
|
293
379
|
}
|
|
294
|
-
|
|
380
|
+
afLogger.trace(`🪲✏️ updating record id:${recordId}, values: ${JSON.stringify(recordWithOriginalValues)}`);
|
|
295
381
|
await this.updateRecordOriginalValues({ resource, recordId, newValues: recordWithOriginalValues });
|
|
296
382
|
return { ok: true };
|
|
297
383
|
}
|