tachybase_todo/packages/plugins/duplicator/src/server/field-value-writer.ts
ChengLei Shao 6b0ed79f51
feat: duplicator plugin (#1265)
* chore: dump plugin

* chore: rename plugin

* chore: add duplicator into preset

* chore: tmp commit

* feat: restore & dump action

* feat: collection dump & restore

* feat: collection dump & restore

* fix: dump with json type

* fix: dump uischema

* chore: tmp commit

* chore: tmp commit

* feat: restore custom collections

* chore: code

* fix: build

* chore: tmp commit

* fix: pm.generateClientFile

* feat: dump with user plugins

* feat: restore ignore collection

* feat: ignore user with rolesUsers

* chore: client plugins

* refactor: restore insert sql

* chore: code format

* feat: restore with sequelize insert query

* fix: restore json field

* fix: json restore

* refactor: dumper

* refactor: restorer

* chore: dump file name

* chore: dump file name

* chore: dump message

* fix: restore with jsonb fields

* feat: field data writer

* chore: code

* feat: collection group manager

* feat: duplicator client

* feat: duplicator panel

* chore: disable duplicator ui

* feat: dump with inquirer

* chore: dumper

* chore: collection group manager

* feat: restore with inquirer

* chore: comment

* chore: inquirer page size

* feat: warning before restore

* feat: sync postgres sequence id after import collection

* chore: restore checked

* feat: dump with through table

* feat: restore with through table

* feat: restore with sequence field

* chore: graph collection manager collection group

* fix: dump with no column tables

* fix: dump empty table

* fix: force remove workdir

* chore: disable throw error when sync empty table

* feat: support map field restore

* fix: restore from pg dumped file

* fix: dump with logic field

* chore: console.log

* chore: collection group

* chore: handle import collection error

* fix: dump migrations table

* feat: display custom collection title

* fix: restore collection title display

* fix: dump iframe html

* fix: dump with postgres inhertitance

* fix: dump sql

* chore: export snapshot field

* fix: import with sequences

* fix: import sequences

* fix: storage

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-01-08 12:45:02 +08:00

74 lines
1.8 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;
}
}
}
FieldValueWriter.registerWriter([DataTypes.JSON.toString(), DataTypes.JSONB.toString()], (val) => {
try {
return lodash.isString(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));