fa97d0a642
* fix: perform load action on boot main app * feat: add dataType option in collection duplicator * chore: reset optional dumpable config * chore: dump command * chore: dump & restore command * chore: delay restore * fix: dump test * chore: restore command * chore: dump command action * chore: dumpable collection api * chore: client collection option * feat: backup& restore client * chore: content disposition header in dump response * chore: download backup field * feat: collection origin option * fix: test * chore: collection manager collection origin * chore: upload backup field * chore: upload restore file * chore: upload restore file * fix: test * chore: backup and restore support learn more * refactor: upload restore file * refactor: upload restore file * fix: test * fix: test * chore: dumpable collection with title * chore: pg only test * chore: test * fix: test * chore: test sleep * style: locale improve * refactor: download backup file * refactor: start restore * fix: restore key name * refactor: start restore * refactor: start restore * refactor: start restore * refactor: start restore * refactor: start restore * refactor: start restore * chore: unify duplicator option * fix: dump empty collection * chore: test * chore: test * style: style improve * refactor: locale improve * chore: dumpalbe collection orders * style: style improve * style: style improve * style: icon adjust * chore: nginx body size * chore: get file status * feat: run dump task * feat: download api * chore: backup files resourcer * feat: restore destroy api * chore: backup files resoucer * feat: list backup files action * chore: get collection meta from dumped file * fix: dump file name * fix: test * chore: backup and restore ui * chore: swagger api for backup & restore * chore: api doc * chore: api doc * chore: api doc * chore: backup and restore ui * chore: backup and restore ui * chore: backup and restore ui * chore: backup and restore ui * chore: backup and restore ui * fix: restore values * style: style improve * fix: download field respontype * fix: restore form local file * refactor: local improve * refactor: delete backup file * fix: in progress status * refactor: locale improve * refactor: locale improve * refactor: style improve * refactor: style improve * refactor: style improve * test: dump collection table attribute * chore: dump collection with table attributes * chore: test * chore: create new table in restore * fix: import error * chore: restore table from backup file * chore: sync collection after restore collections * fix: restore json data * style: style improve * chore: restore with fields * chore: test * fix: test * fix: test with underscored * style: style improve * fix: lock file state * chore: add test file * refactor: backup & restore plugin * fix: mysql test * chore: skip import view collection * chore: restore collection with inherits topo order * fix: import * style: style improve * fix: restore sequence fields * fix: themeConfig collection duplicator option * fix: restore with dialectOnly meta * fix: throw error * fix: restore * fix: import backup file created in postgres into mysql * fix: repeated items in inherits * chore: upgrade after restore * feat: check database env before restore * feat: handle autoincr val in postgres * chore: sqlite & mysql queryInterface * chore: test * fix: test * chore: test * fix: build * fix: pg test * fix: restore with date field * chore: theme-config collection * chore: chage import collections method to support collection origin * chore: fallback get autoincr value in mysql * fix: dataType normalize * chore: delay restore * chore: test * fix: build * feat: collectin onDump * feat: collection onDump interface * chore: dump with view collection * chore: sync in restore * refactor: locale improve * refactor: code improve * fix: test * fix: data sync * chore: rename backup & restore plugin * chore: skip test * style: style improve * style: style improve * style: style improve * style: style improve * chore: import version check * chore: backup file dir * chore: build * fix: bugs * fix: error * fix: pageSize * fix: import origin * fix: improve code * fix: remove namespace * chore: dump rules config * fix: dump custom collection * chore: version * fix: test * fix: test * fix: test * fix: test * chore: test * fix: load custom collection * fix: client * fix: translation * chore: code * fix: bug * fix: support shared option * fix: roles collection dumpRules * chore: test * fix: define collections * chore: collection group * fix: translation * fix: translation * fix: restore options * chore: restore command * chore: dump error * fix: too many open files --------- Co-authored-by: katherinehhh <katherine_15995@163.com> Co-authored-by: chenos <chenlinxh@gmail.com>
83 lines
2.0 KiB
TypeScript
83 lines
2.0 KiB
TypeScript
import { DataTypes, Field } from '@nocobase/database';
|
|
import lodash from 'lodash';
|
|
|
|
type WriterFunc = (val: any) => any;
|
|
|
|
const getMapFieldWriter = (field: Field) => {
|
|
return (val) => {
|
|
const mockObj = {
|
|
setDataValue: (name, newVal) => {
|
|
val = newVal;
|
|
},
|
|
};
|
|
|
|
field.options.set.call(mockObj, val);
|
|
return val;
|
|
};
|
|
};
|
|
|
|
export class FieldValueWriter {
|
|
static writers = new Map<string, WriterFunc>();
|
|
|
|
static write(field: Field, val) {
|
|
if (val === null) return val;
|
|
|
|
if (field.type == 'point' || field.type == 'lineString' || field.type == 'circle' || field.type === 'polygon') {
|
|
return getMapFieldWriter(field)(lodash.isString(val) ? JSON.parse(val) : val);
|
|
}
|
|
|
|
const fieldType = field.typeToString();
|
|
const writer = FieldValueWriter.writers[fieldType];
|
|
|
|
if (writer) {
|
|
val = writer(val);
|
|
}
|
|
|
|
return val;
|
|
}
|
|
|
|
static toDumpedValue(field: Field, val) {
|
|
if (val === null) return val;
|
|
|
|
if (field.type == 'point' || field.type == 'lineString' || field.type == 'circle' || field.type === 'polygon') {
|
|
const mockObj = {
|
|
getDataValue: () => val,
|
|
};
|
|
|
|
const newValue = field.options.get.call(mockObj);
|
|
return newValue;
|
|
}
|
|
|
|
return val;
|
|
}
|
|
|
|
static registerWriter(types: string | string[], writer: WriterFunc) {
|
|
for (const type of lodash.castArray(types)) {
|
|
FieldValueWriter.writers[type] = writer;
|
|
}
|
|
}
|
|
}
|
|
|
|
function isJSONObjectOrArrayString(str) {
|
|
try {
|
|
const parsed = JSON.parse(str);
|
|
return typeof parsed === 'object' && parsed !== null;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
FieldValueWriter.registerWriter([DataTypes.JSON.toString(), DataTypes.JSONB.toString()], (val) => {
|
|
try {
|
|
return isJSONObjectOrArrayString(val) ? JSON.parse(val) : val;
|
|
} catch (err) {
|
|
if (err instanceof SyntaxError && err.message.includes('Unexpected')) {
|
|
return val;
|
|
}
|
|
|
|
throw err;
|
|
}
|
|
});
|
|
|
|
FieldValueWriter.registerWriter(DataTypes.BOOLEAN.toString(), (val) => Boolean(val));
|