2022-02-11 14:34:33 +08:00
|
|
|
import merge from 'deepmerge';
|
2021-09-27 15:28:32 +08:00
|
|
|
import { EventEmitter } from 'events';
|
2023-07-17 23:23:44 +08:00
|
|
|
import { default as _, default as lodash } from 'lodash';
|
2022-07-01 09:33:05 +08:00
|
|
|
import {
|
|
|
|
ModelOptions,
|
2023-01-18 16:55:03 +08:00
|
|
|
ModelStatic,
|
2022-07-01 09:33:05 +08:00
|
|
|
QueryInterfaceDropTableOptions,
|
|
|
|
SyncOptions,
|
|
|
|
Transactionable,
|
2023-03-19 23:40:42 +08:00
|
|
|
Utils,
|
2022-07-01 09:33:05 +08:00
|
|
|
} from 'sequelize';
|
2021-09-18 00:23:21 +08:00
|
|
|
import { Database } from './database';
|
2023-03-17 09:20:56 +08:00
|
|
|
import { BelongsToField, Field, FieldOptions, HasManyField } from './fields';
|
2022-02-23 18:18:38 +08:00
|
|
|
import { Model } from './model';
|
2023-07-14 14:49:12 +08:00
|
|
|
import { AdjacencyListRepository } from './repositories/tree-repository/adjacency-list-repository';
|
2021-09-25 23:56:26 +08:00
|
|
|
import { Repository } from './repository';
|
2023-02-13 21:38:47 +08:00
|
|
|
import { checkIdentifier, md5, snakeCase } from './utils';
|
2022-02-11 14:34:33 +08:00
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
export type RepositoryType = typeof Repository;
|
2021-09-18 00:23:21 +08:00
|
|
|
|
2022-02-11 14:34:33 +08:00
|
|
|
export type CollectionSortable = string | boolean | { name?: string; scopeKey?: string };
|
|
|
|
|
2023-03-10 19:16:00 +08:00
|
|
|
type dumpable = 'required' | 'optional' | 'skip';
|
|
|
|
|
2023-09-27 22:03:04 +08:00
|
|
|
function EnsureAtomicity(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
|
|
|
const originalMethod = descriptor.value;
|
|
|
|
|
|
|
|
descriptor.value = function (...args: any[]) {
|
|
|
|
const model = this.model;
|
|
|
|
const beforeAssociationKeys = Object.keys(model.associations);
|
|
|
|
const beforeRawAttributes = Object.keys(model.rawAttributes);
|
|
|
|
|
|
|
|
try {
|
|
|
|
return originalMethod.apply(this, args);
|
|
|
|
} catch (error) {
|
|
|
|
// remove associations created in this method
|
|
|
|
const afterAssociationKeys = Object.keys(model.associations);
|
|
|
|
const createdAssociationKeys = lodash.difference(afterAssociationKeys, beforeAssociationKeys);
|
|
|
|
for (const key of createdAssociationKeys) {
|
|
|
|
delete this.model.associations[key];
|
|
|
|
}
|
|
|
|
|
|
|
|
const afterRawAttributes = Object.keys(model.rawAttributes);
|
|
|
|
const createdRawAttributes = lodash.difference(afterRawAttributes, beforeRawAttributes);
|
|
|
|
for (const key of createdRawAttributes) {
|
|
|
|
delete this.model.rawAttributes[key];
|
|
|
|
}
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return descriptor;
|
|
|
|
}
|
|
|
|
|
2022-02-11 14:52:04 +08:00
|
|
|
export interface CollectionOptions extends Omit<ModelOptions, 'name' | 'hooks'> {
|
2021-09-27 15:28:32 +08:00
|
|
|
name: string;
|
2023-10-07 15:49:09 +08:00
|
|
|
title?: string;
|
2023-03-10 19:16:00 +08:00
|
|
|
namespace?: string;
|
2023-04-23 18:29:48 +08:00
|
|
|
/**
|
|
|
|
* Used for @nocobase/plugin-duplicator
|
|
|
|
* @see packages/core/database/src/collection-group-manager.tss
|
|
|
|
*
|
|
|
|
* @prop {'required' | 'optional' | 'skip'} dumpable - Determine whether the collection is dumped
|
|
|
|
* @prop {string[] | string} [with] - Collections dumped with this collection
|
|
|
|
* @prop {any} [delayRestore] - A function to execute after all collections are restored
|
|
|
|
*/
|
2023-03-10 19:16:00 +08:00
|
|
|
duplicator?:
|
|
|
|
| dumpable
|
|
|
|
| {
|
|
|
|
dumpable: dumpable;
|
|
|
|
with?: string[] | string;
|
|
|
|
delayRestore?: any;
|
|
|
|
};
|
|
|
|
|
2021-09-27 15:28:32 +08:00
|
|
|
tableName?: string;
|
2022-11-16 12:53:58 +08:00
|
|
|
inherits?: string[] | string;
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
viewName?: string;
|
2023-07-14 14:49:12 +08:00
|
|
|
writableView?: boolean;
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
|
2022-01-07 20:08:01 +08:00
|
|
|
filterTargetKey?: string;
|
2021-12-06 21:12:54 +08:00
|
|
|
fields?: FieldOptions[];
|
2022-12-24 16:30:01 +08:00
|
|
|
model?: string | ModelStatic<Model>;
|
2021-12-06 21:12:54 +08:00
|
|
|
repository?: string | RepositoryType;
|
2022-02-11 14:34:33 +08:00
|
|
|
sortable?: CollectionSortable;
|
2022-01-07 22:06:31 +08:00
|
|
|
/**
|
|
|
|
* @default true
|
|
|
|
*/
|
2021-12-16 10:58:51 +08:00
|
|
|
autoGenId?: boolean;
|
2022-01-07 22:06:31 +08:00
|
|
|
/**
|
|
|
|
* @default 'options'
|
|
|
|
*/
|
|
|
|
magicAttribute?: string;
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2023-03-17 09:20:56 +08:00
|
|
|
tree?: string;
|
2023-03-19 23:40:42 +08:00
|
|
|
|
2023-10-07 15:49:09 +08:00
|
|
|
template?: string;
|
|
|
|
|
2021-12-06 21:23:34 +08:00
|
|
|
[key: string]: any;
|
2021-09-18 00:23:21 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface CollectionContext {
|
|
|
|
database: Database;
|
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
export class Collection<
|
|
|
|
TModelAttributes extends {} = any,
|
2023-10-13 15:16:50 +08:00
|
|
|
TCreationAttributes extends {} = TModelAttributes,
|
2021-12-06 21:12:54 +08:00
|
|
|
> extends EventEmitter {
|
2021-09-18 00:23:21 +08:00
|
|
|
options: CollectionOptions;
|
|
|
|
context: CollectionContext;
|
2021-12-06 21:12:54 +08:00
|
|
|
isThrough?: boolean;
|
|
|
|
fields: Map<string, any> = new Map<string, any>();
|
2022-12-24 16:30:01 +08:00
|
|
|
model: ModelStatic<Model>;
|
2021-12-06 21:12:54 +08:00
|
|
|
repository: Repository<TModelAttributes, TCreationAttributes>;
|
2021-09-18 00:23:21 +08:00
|
|
|
|
2023-05-25 21:46:58 +08:00
|
|
|
constructor(options: CollectionOptions, context: CollectionContext) {
|
|
|
|
super();
|
|
|
|
this.context = context;
|
|
|
|
this.options = options;
|
|
|
|
|
|
|
|
this.checkOptions(options);
|
|
|
|
|
|
|
|
this.bindFieldEventListener();
|
|
|
|
this.modelInit();
|
|
|
|
|
|
|
|
this.db.modelCollection.set(this.model, this);
|
|
|
|
|
|
|
|
// set tableName to collection map
|
|
|
|
// the form of key is `${schema}.${tableName}` if schema exists
|
|
|
|
// otherwise is `${tableName}`
|
|
|
|
this.db.tableNameCollectionMap.set(this.getTableNameWithSchemaAsString(), this);
|
|
|
|
|
|
|
|
if (!options.inherits) {
|
|
|
|
this.setFields(options.fields);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.setRepository(options.repository);
|
|
|
|
this.setSortable(options.sortable);
|
|
|
|
}
|
|
|
|
|
2022-01-07 20:08:01 +08:00
|
|
|
get filterTargetKey() {
|
2023-04-25 13:12:14 +08:00
|
|
|
const targetKey = lodash.get(this.options, 'filterTargetKey', this.model.primaryKeyAttribute);
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
if (!targetKey && this.model.rawAttributes['id']) {
|
|
|
|
return 'id';
|
|
|
|
}
|
|
|
|
|
|
|
|
return targetKey;
|
2022-01-07 20:08:01 +08:00
|
|
|
}
|
|
|
|
|
2021-09-18 00:23:21 +08:00
|
|
|
get name() {
|
|
|
|
return this.options.name;
|
|
|
|
}
|
|
|
|
|
2023-01-18 16:55:03 +08:00
|
|
|
get titleField() {
|
|
|
|
return (this.options.titleField as string) || this.model.primaryKeyAttribute;
|
|
|
|
}
|
|
|
|
|
2022-06-18 00:18:12 +08:00
|
|
|
get db() {
|
|
|
|
return this.context.database;
|
|
|
|
}
|
|
|
|
|
2023-03-17 09:20:56 +08:00
|
|
|
get treeParentField(): BelongsToField | null {
|
|
|
|
for (const [_, field] of this.fields) {
|
|
|
|
if (field.options.treeParent) {
|
|
|
|
return field;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
get treeChildrenField(): HasManyField | null {
|
|
|
|
for (const [_, field] of this.fields) {
|
|
|
|
if (field.options.treeChildren) {
|
|
|
|
return field;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-13 21:38:47 +08:00
|
|
|
tableName() {
|
2021-12-06 21:12:54 +08:00
|
|
|
const { name, tableName } = this.options;
|
2023-02-13 21:38:47 +08:00
|
|
|
const tName = tableName || name;
|
2023-04-02 11:27:04 +08:00
|
|
|
return this.options.underscored ? snakeCase(tName) : tName;
|
2023-02-13 21:38:47 +08:00
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
/**
|
|
|
|
* TODO
|
|
|
|
*/
|
|
|
|
modelInit() {
|
|
|
|
if (this.model) {
|
|
|
|
return;
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2021-12-16 10:58:51 +08:00
|
|
|
const { name, model, autoGenId = true } = this.options;
|
2022-12-24 16:30:01 +08:00
|
|
|
let M: ModelStatic<Model> = Model;
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
if (this.context.database.sequelize.isDefined(name)) {
|
|
|
|
const m = this.context.database.sequelize.model(name);
|
|
|
|
if ((m as any).isThrough) {
|
2022-02-23 18:18:38 +08:00
|
|
|
// @ts-ignore
|
2021-12-06 21:12:54 +08:00
|
|
|
this.model = m;
|
2022-02-23 18:18:38 +08:00
|
|
|
// @ts-ignore
|
|
|
|
this.model.database = this.context.database;
|
|
|
|
// @ts-ignore
|
|
|
|
this.model.collection = this;
|
2021-12-06 21:12:54 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
if (typeof model === 'string') {
|
|
|
|
M = this.context.database.models.get(model) || Model;
|
|
|
|
} else if (model) {
|
|
|
|
M = model;
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-02-23 18:18:38 +08:00
|
|
|
// @ts-ignore
|
2021-12-06 21:12:54 +08:00
|
|
|
this.model = class extends M {};
|
|
|
|
this.model.init(null, this.sequelizeModelOptions());
|
2021-12-16 10:58:51 +08:00
|
|
|
|
|
|
|
if (!autoGenId) {
|
|
|
|
this.model.removeAttribute('id');
|
|
|
|
}
|
|
|
|
|
2022-02-23 18:18:38 +08:00
|
|
|
// @ts-ignore
|
|
|
|
this.model.database = this.context.database;
|
|
|
|
// @ts-ignore
|
|
|
|
this.model.collection = this;
|
2021-12-06 21:12:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
setRepository(repository?: RepositoryType | string) {
|
|
|
|
let repo = Repository;
|
|
|
|
if (typeof repository === 'string') {
|
|
|
|
repo = this.context.database.repositories.get(repository) || Repository;
|
|
|
|
}
|
2023-05-05 10:33:44 +08:00
|
|
|
|
|
|
|
if (this.options.tree == 'adjacency-list' || this.options.tree == 'adjacencyList') {
|
|
|
|
repo = AdjacencyListRepository;
|
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
this.repository = new repo(this);
|
|
|
|
}
|
|
|
|
|
2021-09-27 15:28:32 +08:00
|
|
|
forEachField(callback: (field: Field) => void) {
|
|
|
|
return [...this.fields.values()].forEach(callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
findField(callback: (field: Field) => boolean) {
|
|
|
|
return [...this.fields.values()].find(callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
hasField(name: string) {
|
|
|
|
return this.fields.has(name);
|
|
|
|
}
|
|
|
|
|
2021-12-06 21:23:34 +08:00
|
|
|
getField<F extends Field>(name: string): F {
|
2021-09-27 15:28:32 +08:00
|
|
|
return this.fields.get(name);
|
|
|
|
}
|
|
|
|
|
2021-12-06 21:23:34 +08:00
|
|
|
addField(name: string, options: FieldOptions): Field {
|
2021-12-06 21:12:54 +08:00
|
|
|
return this.setField(name, options);
|
|
|
|
}
|
|
|
|
|
2023-02-13 21:38:47 +08:00
|
|
|
checkFieldType(name: string, options: FieldOptions) {
|
2023-04-02 11:27:04 +08:00
|
|
|
if (!this.options.underscored) {
|
2023-02-13 21:38:47 +08:00
|
|
|
return;
|
|
|
|
}
|
2023-04-02 11:27:04 +08:00
|
|
|
|
2023-02-13 21:38:47 +08:00
|
|
|
const fieldName = options.field || snakeCase(name);
|
2023-04-02 11:27:04 +08:00
|
|
|
|
2023-02-13 21:38:47 +08:00
|
|
|
const field = this.findField((f) => {
|
|
|
|
if (f.name === name) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (f.field) {
|
|
|
|
return f.field === fieldName;
|
|
|
|
}
|
|
|
|
return snakeCase(f.name) === fieldName;
|
|
|
|
});
|
2023-04-02 11:27:04 +08:00
|
|
|
|
2023-02-13 21:38:47 +08:00
|
|
|
if (!field) {
|
|
|
|
return;
|
|
|
|
}
|
2023-04-02 11:27:04 +08:00
|
|
|
|
2023-02-13 21:38:47 +08:00
|
|
|
if (options.type !== field.type) {
|
|
|
|
throw new Error(`fields with same column must be of the same type ${JSON.stringify(options)}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-09-27 22:03:04 +08:00
|
|
|
@EnsureAtomicity
|
2021-12-06 21:23:34 +08:00
|
|
|
setField(name: string, options: FieldOptions): Field {
|
2022-10-14 14:51:19 +08:00
|
|
|
checkIdentifier(name);
|
2023-02-13 21:38:47 +08:00
|
|
|
this.checkFieldType(name, options);
|
2022-10-14 14:51:19 +08:00
|
|
|
|
2021-09-27 15:28:32 +08:00
|
|
|
const { database } = this.context;
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
|
|
|
|
if (options.source) {
|
|
|
|
const [sourceCollectionName, sourceFieldName] = options.source.split('.');
|
|
|
|
const sourceCollection = this.db.collections.get(sourceCollectionName);
|
|
|
|
if (!sourceCollection) {
|
2023-05-25 21:46:58 +08:00
|
|
|
this.db.logger.warn(
|
2023-04-19 17:59:49 +08:00
|
|
|
`source collection "${sourceCollectionName}" not found for field "${name}" at collection "${this.name}"`,
|
|
|
|
);
|
2023-05-25 21:46:58 +08:00
|
|
|
} else {
|
2023-12-06 09:45:32 +08:00
|
|
|
const sourceField = sourceCollection.fields.get(sourceFieldName);
|
|
|
|
|
|
|
|
if (!sourceField) {
|
|
|
|
this.db.logger.warn(
|
|
|
|
`source field "${sourceFieldName}" not found for field "${name}" at collection "${this.name}"`,
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
options = { ...lodash.omit(sourceField.options, ['name', 'primaryKey']), ...options };
|
|
|
|
}
|
2023-05-25 21:46:58 +08:00
|
|
|
}
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
}
|
|
|
|
|
2023-03-17 09:20:56 +08:00
|
|
|
this.emit('field.beforeAdd', name, options, { collection: this });
|
2021-12-06 21:12:54 +08:00
|
|
|
|
|
|
|
const field = database.buildField(
|
|
|
|
{ name, ...options },
|
|
|
|
{
|
|
|
|
...this.context,
|
|
|
|
collection: this,
|
|
|
|
},
|
|
|
|
);
|
2022-10-14 14:51:19 +08:00
|
|
|
|
2022-11-16 12:53:58 +08:00
|
|
|
const oldField = this.fields.get(name);
|
|
|
|
|
2022-11-26 09:24:53 +08:00
|
|
|
if (oldField && oldField.options.inherit && field.typeToString() != oldField.typeToString()) {
|
2022-11-16 12:53:58 +08:00
|
|
|
throw new Error(
|
2022-11-16 16:40:51 +08:00
|
|
|
`Field type conflict: cannot set "${name}" on "${this.name}" to ${options.type}, parent "${name}" type is ${oldField.options.type}`,
|
2022-11-16 12:53:58 +08:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-12-01 10:00:46 +08:00
|
|
|
if (this.options.autoGenId !== false && options.primaryKey) {
|
|
|
|
this.model.removeAttribute('id');
|
|
|
|
}
|
|
|
|
|
2022-03-02 18:35:49 +08:00
|
|
|
this.removeField(name);
|
2021-09-27 15:28:32 +08:00
|
|
|
this.fields.set(name, field);
|
|
|
|
this.emit('field.afterAdd', field);
|
2022-11-16 12:53:58 +08:00
|
|
|
|
2022-11-26 09:24:53 +08:00
|
|
|
// refresh children models
|
2022-11-16 12:53:58 +08:00
|
|
|
if (this.isParent()) {
|
|
|
|
for (const child of this.context.database.inheritanceMap.getChildren(this.name, {
|
|
|
|
deep: false,
|
|
|
|
})) {
|
|
|
|
const childCollection = this.db.getCollection(child);
|
|
|
|
const existField = childCollection.getField(name);
|
|
|
|
|
|
|
|
if (!existField || existField.options.inherit) {
|
|
|
|
childCollection.setField(name, {
|
|
|
|
...options,
|
|
|
|
inherit: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
return field;
|
2021-09-27 15:28:32 +08:00
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
setFields(fields: FieldOptions[], resetFields = true) {
|
|
|
|
if (!Array.isArray(fields)) {
|
|
|
|
return;
|
2021-09-27 15:28:32 +08:00
|
|
|
}
|
2021-12-06 21:12:54 +08:00
|
|
|
|
|
|
|
if (resetFields) {
|
|
|
|
this.resetFields();
|
2021-09-27 15:28:32 +08:00
|
|
|
}
|
2021-12-06 21:12:54 +08:00
|
|
|
|
|
|
|
for (const { name, ...options } of fields) {
|
|
|
|
this.addField(name, options);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
resetFields() {
|
|
|
|
const fieldNames = this.fields.keys();
|
|
|
|
for (const fieldName of fieldNames) {
|
|
|
|
this.removeField(fieldName);
|
2021-09-27 15:28:32 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-11 20:46:30 +08:00
|
|
|
remove() {
|
2023-11-06 11:50:37 +08:00
|
|
|
return this.context.database.removeCollection(this.name);
|
2022-06-11 20:46:30 +08:00
|
|
|
}
|
|
|
|
|
2022-06-18 00:18:12 +08:00
|
|
|
async removeFromDb(options?: QueryInterfaceDropTableOptions) {
|
|
|
|
if (
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
!this.isView() &&
|
|
|
|
(await this.existsInDb({
|
2022-06-18 00:18:12 +08:00
|
|
|
transaction: options?.transaction,
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
}))
|
2022-06-18 00:18:12 +08:00
|
|
|
) {
|
|
|
|
const queryInterface = this.db.sequelize.getQueryInterface();
|
2023-03-10 19:16:00 +08:00
|
|
|
await queryInterface.dropTable(this.getTableNameWithSchema(), options);
|
2022-06-18 00:18:12 +08:00
|
|
|
}
|
2023-11-06 11:50:37 +08:00
|
|
|
|
|
|
|
return this.remove();
|
2022-06-18 00:18:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async existsInDb(options?: Transactionable) {
|
2023-03-05 14:45:56 +08:00
|
|
|
return this.db.queryInterface.collectionTableExists(this, options);
|
2022-06-18 00:18:12 +08:00
|
|
|
}
|
|
|
|
|
2022-09-11 21:58:49 +08:00
|
|
|
removeField(name: string): void | Field {
|
2022-03-02 18:35:49 +08:00
|
|
|
if (!this.fields.has(name)) {
|
|
|
|
return;
|
|
|
|
}
|
2022-11-22 16:19:48 +08:00
|
|
|
|
2021-09-27 15:28:32 +08:00
|
|
|
const field = this.fields.get(name);
|
2022-11-22 16:19:48 +08:00
|
|
|
|
2021-09-27 15:28:32 +08:00
|
|
|
const bool = this.fields.delete(name);
|
2022-11-26 09:24:53 +08:00
|
|
|
|
2021-09-27 15:28:32 +08:00
|
|
|
if (bool) {
|
2022-12-18 15:45:34 +08:00
|
|
|
if (this.isParent()) {
|
|
|
|
for (const child of this.db.inheritanceMap.getChildren(this.name, {
|
|
|
|
deep: false,
|
|
|
|
})) {
|
|
|
|
const childCollection = this.db.getCollection(child);
|
|
|
|
const existField = childCollection.getField(name);
|
|
|
|
if (existField && existField.options.inherit) {
|
|
|
|
childCollection.removeField(name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-27 15:28:32 +08:00
|
|
|
this.emit('field.afterRemove', field);
|
|
|
|
}
|
2022-11-26 09:24:53 +08:00
|
|
|
|
2022-06-18 00:18:12 +08:00
|
|
|
return field as Field;
|
2021-09-27 15:28:32 +08:00
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
/**
|
|
|
|
* TODO
|
|
|
|
*/
|
|
|
|
updateOptions(options: CollectionOptions, mergeOptions?: any) {
|
|
|
|
let newOptions = lodash.cloneDeep(options);
|
|
|
|
newOptions = merge(this.options, newOptions, mergeOptions);
|
2023-02-26 08:04:29 +08:00
|
|
|
this.context.database.emit('beforeUpdateCollection', this, newOptions);
|
2023-02-23 14:13:32 +08:00
|
|
|
this.options = newOptions;
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
this.setFields(options.fields, false);
|
2023-03-19 23:40:42 +08:00
|
|
|
if (options.repository) {
|
|
|
|
this.setRepository(options.repository);
|
|
|
|
}
|
2021-12-06 21:12:54 +08:00
|
|
|
|
|
|
|
this.context.database.emit('afterUpdateCollection', this);
|
2022-01-19 10:02:52 +08:00
|
|
|
return this;
|
2021-12-06 21:12:54 +08:00
|
|
|
}
|
|
|
|
|
2022-02-11 14:34:33 +08:00
|
|
|
setSortable(sortable) {
|
|
|
|
if (!sortable) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (sortable === true) {
|
|
|
|
this.setField('sort', {
|
|
|
|
type: 'sort',
|
|
|
|
hidden: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (typeof sortable === 'string') {
|
|
|
|
this.setField(sortable, {
|
|
|
|
type: 'sort',
|
|
|
|
hidden: true,
|
|
|
|
});
|
|
|
|
} else if (typeof sortable === 'object') {
|
|
|
|
const { name, ...opts } = sortable;
|
|
|
|
this.setField(name || 'sort', { type: 'sort', hidden: true, ...opts });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
/**
|
|
|
|
* TODO
|
|
|
|
*
|
|
|
|
* @param name
|
|
|
|
* @param options
|
|
|
|
*/
|
|
|
|
updateField(name: string, options: FieldOptions) {
|
|
|
|
if (!this.hasField(name)) {
|
|
|
|
throw new Error(`field ${name} not exists`);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (options.name && options.name !== name) {
|
|
|
|
this.removeField(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.setField(options.name || name, options);
|
|
|
|
}
|
|
|
|
|
2022-10-10 22:35:21 +08:00
|
|
|
addIndex(index: string | string[] | { fields: string[]; unique?: boolean; [key: string]: any }) {
|
2022-07-01 09:33:05 +08:00
|
|
|
if (!index) {
|
|
|
|
return;
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
|
|
|
// collection defined indexes
|
2023-04-25 13:12:14 +08:00
|
|
|
const indexes: any = this.model.options.indexes || [];
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
let indexName = [];
|
|
|
|
let indexItem;
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
if (typeof index === 'string') {
|
|
|
|
indexItem = {
|
|
|
|
fields: [index],
|
|
|
|
};
|
|
|
|
indexName = [index];
|
|
|
|
} else if (Array.isArray(index)) {
|
|
|
|
indexItem = {
|
|
|
|
fields: index,
|
|
|
|
};
|
|
|
|
indexName = index;
|
|
|
|
} else if (index?.fields) {
|
|
|
|
indexItem = index;
|
|
|
|
indexName = index.fields;
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
if (lodash.isEqual(this.model.primaryKeyAttributes, indexName)) {
|
|
|
|
return;
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
const name: string = this.model.primaryKeyAttributes.join(',');
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
if (name.startsWith(`${indexName.join(',')},`)) {
|
|
|
|
return;
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
for (const item of indexes) {
|
|
|
|
if (lodash.isEqual(item.fields, indexName)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const name: string = item.fields.join(',');
|
|
|
|
if (name.startsWith(`${indexName.join(',')},`)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
if (!indexItem) {
|
|
|
|
return;
|
|
|
|
}
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
indexes.push(indexItem);
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-07-01 09:33:05 +08:00
|
|
|
const tableName = this.model.getTableName();
|
|
|
|
// @ts-ignore
|
|
|
|
this.model._indexes = this.model.options.indexes
|
|
|
|
// @ts-ignore
|
2022-10-10 22:35:21 +08:00
|
|
|
.map((index) => Utils.nameIndex(this.model._conformIndex(index), tableName))
|
|
|
|
.map((item) => {
|
|
|
|
if (item.name && item.name.length > 63) {
|
|
|
|
item.name = 'i_' + md5(item.name);
|
|
|
|
}
|
|
|
|
return item;
|
|
|
|
});
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-11-22 20:31:29 +08:00
|
|
|
this.refreshIndexes();
|
2022-07-01 09:33:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
removeIndex(fields: any) {
|
|
|
|
if (!fields) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// @ts-ignore
|
|
|
|
const indexes: any[] = this.model._indexes;
|
|
|
|
// @ts-ignore
|
|
|
|
this.model._indexes = indexes.filter((item) => {
|
|
|
|
return !lodash.isEqual(item.fields, fields);
|
|
|
|
});
|
2022-11-22 20:31:29 +08:00
|
|
|
this.refreshIndexes();
|
|
|
|
}
|
|
|
|
|
|
|
|
refreshIndexes() {
|
|
|
|
// @ts-ignore
|
|
|
|
const indexes: any[] = this.model._indexes;
|
2023-02-13 21:38:47 +08:00
|
|
|
|
2022-11-22 20:31:29 +08:00
|
|
|
// @ts-ignore
|
2023-02-13 21:38:47 +08:00
|
|
|
this.model._indexes = lodash.uniqBy(
|
2023-02-19 11:55:25 +08:00
|
|
|
indexes
|
|
|
|
.filter((item) => {
|
|
|
|
return item.fields.every((field) =>
|
|
|
|
Object.values(this.model.rawAttributes).find((fieldVal) => fieldVal.field === field),
|
|
|
|
);
|
|
|
|
})
|
|
|
|
.map((item) => {
|
|
|
|
if (this.options.underscored) {
|
|
|
|
item.fields = item.fields.map((field) => snakeCase(field));
|
|
|
|
}
|
|
|
|
return item;
|
|
|
|
}),
|
2023-02-13 21:38:47 +08:00
|
|
|
'name',
|
|
|
|
);
|
2022-07-01 09:33:05 +08:00
|
|
|
}
|
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
async sync(syncOptions?: SyncOptions) {
|
2022-08-20 23:23:13 +08:00
|
|
|
const modelNames = new Set([this.model.name]);
|
2021-12-06 21:12:54 +08:00
|
|
|
|
2022-09-11 21:58:49 +08:00
|
|
|
const { associations } = this.model;
|
2021-12-06 21:12:54 +08:00
|
|
|
|
|
|
|
for (const associationKey in associations) {
|
|
|
|
const association = associations[associationKey];
|
2022-08-20 23:23:13 +08:00
|
|
|
modelNames.add(association.target.name);
|
2022-11-16 12:53:58 +08:00
|
|
|
|
2021-12-06 21:12:54 +08:00
|
|
|
if ((<any>association).through) {
|
2022-08-20 23:23:13 +08:00
|
|
|
modelNames.add((<any>association).through.model.name);
|
2021-12-06 21:12:54 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-24 16:30:01 +08:00
|
|
|
const models: ModelStatic<Model>[] = [];
|
2021-12-06 21:12:54 +08:00
|
|
|
// @ts-ignore
|
|
|
|
this.context.database.sequelize.modelManager.forEachModel((model) => {
|
2022-08-20 23:23:13 +08:00
|
|
|
if (modelNames.has(model.name)) {
|
2021-12-06 21:12:54 +08:00
|
|
|
models.push(model);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
for (const model of models) {
|
2023-11-04 12:39:44 +08:00
|
|
|
await model.sync(
|
|
|
|
syncOptions || {
|
|
|
|
force: false,
|
|
|
|
alter: {
|
|
|
|
drop: false,
|
|
|
|
},
|
2023-10-28 17:14:31 +08:00
|
|
|
},
|
2023-11-04 12:39:44 +08:00
|
|
|
);
|
2021-12-06 21:12:54 +08:00
|
|
|
}
|
2021-09-18 00:23:21 +08:00
|
|
|
}
|
2022-11-16 12:53:58 +08:00
|
|
|
|
|
|
|
public isInherited() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public isParent() {
|
|
|
|
return this.context.database.inheritanceMap.isParentNode(this.name);
|
|
|
|
}
|
2023-02-16 10:53:04 +08:00
|
|
|
|
2023-03-10 19:16:00 +08:00
|
|
|
public getTableNameWithSchema() {
|
2023-02-16 10:53:04 +08:00
|
|
|
const tableName = this.model.tableName;
|
|
|
|
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
if (this.collectionSchema() && this.db.inDialect('postgres')) {
|
2023-03-03 11:05:57 +08:00
|
|
|
return this.db.utils.addSchema(tableName, this.collectionSchema());
|
2023-02-16 10:53:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return tableName;
|
|
|
|
}
|
|
|
|
|
2023-04-06 09:05:47 +08:00
|
|
|
public tableNameAsString(options?: { ignorePublicSchema: boolean }) {
|
|
|
|
const tableNameWithSchema = this.getTableNameWithSchema();
|
|
|
|
if (lodash.isString(tableNameWithSchema)) {
|
|
|
|
return tableNameWithSchema;
|
|
|
|
}
|
|
|
|
|
|
|
|
const schema = tableNameWithSchema.schema;
|
|
|
|
const tableName = tableNameWithSchema.tableName;
|
|
|
|
|
|
|
|
if (options?.ignorePublicSchema && schema === 'public') {
|
|
|
|
return tableName;
|
|
|
|
}
|
|
|
|
|
|
|
|
return `${schema}.${tableName}`;
|
|
|
|
}
|
|
|
|
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
public getTableNameWithSchemaAsString() {
|
|
|
|
const tableName = this.model.tableName;
|
|
|
|
|
|
|
|
if (this.collectionSchema() && this.db.inDialect('postgres')) {
|
|
|
|
return `${this.collectionSchema()}.${tableName}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
return tableName;
|
|
|
|
}
|
|
|
|
|
2023-02-16 10:53:04 +08:00
|
|
|
public quotedTableName() {
|
2023-03-10 19:16:00 +08:00
|
|
|
return this.db.utils.quoteTable(this.getTableNameWithSchema());
|
2023-02-16 10:53:04 +08:00
|
|
|
}
|
2023-03-03 11:05:57 +08:00
|
|
|
|
|
|
|
public collectionSchema() {
|
|
|
|
if (this.options.schema) {
|
|
|
|
return this.options.schema;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.db.options.schema) {
|
|
|
|
return this.db.options.schema;
|
|
|
|
}
|
|
|
|
|
2023-03-05 14:45:56 +08:00
|
|
|
if (this.db.inDialect('postgres')) {
|
|
|
|
return 'public';
|
|
|
|
}
|
|
|
|
|
2023-03-03 11:05:57 +08:00
|
|
|
return undefined;
|
|
|
|
}
|
feat: database view collection (#1587)
* test: create view collection
* feat: view collection class
* feat: list view
* chore: skip sync view collection
* test: should create view collection in difference schema
* test: create view collection in collection manager
* feat: create view collection by user sql
* test: view resourcer
* feat: view collection
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* feat: view collection cannot be added, deleted, or modified
* refactor: connect to database view
* refactor: sync from database
* chore: rename list view sql
* chore: list view fields api
* chore: create collection without viewName
* feat: bring out fields when selecting a view
* chore: bring out fields when selecting a view
* feat: view field inference class
* chore: bring out fields when selecting a view
* chore: sync form database view
* chore: sync form database view
* refactor: view collection local
* feat: view get api
* feat: database type infer
* feat: integer map
* chore: remove from in view list
* chore: build error
* chore: uniq collection
* fix: typo
* chore: replace collection list source field
* fix: destroy view collection
* chore: timestamp field map
* refactor: interface avalableTypes
* refactor: interface avalableTypes
* chore: list fields test
* refactor: interface avalableTypes
* chore: uiSchema response in field source
* fix: view query
* chore: collection snippet
* refactor: view collection support preview
* fix: handle field source
* fix: typo
* fix: configure fileds title
* fix: configure fileds title
* fix: configure fileds title
* fix: sync from databse interface
* fix: sync from databse interface
* feat: set fields api
* fix: sync from databse fix
* feat: possibleTypes
* chore: fields get
* fix: sync from databse
* fix: list view test
* fix: view test in difference schema
* chore: comment
* feat: when there is only one source collection, the view is a subset of a Collection
* feat: view collection add field
* fix: inherit query with schema
* fix: test
* fix: ci test
* fix: test with schema
* chore: set pg default search path
* chore: mysql test
* fix: test with schema
* chore: test
* chore: action test
* chore: view column usage return type
* feat: mysql field inference
* fix: tableName
* chore: node sql parser
* fix: sql build
* fix: database build
* fix: mysql test
* feat: view collection uiSchema title
* fix: incorrect field source display when switching views
* refactor: view collection not allow modify
* fix: view collection is allow add, delete, and modify
* fix: mysql test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* fix: sqlite test
* chore: add id field as default target key
* style: style improve
* feat: load source field options
* style: style improve
* chore: disable remove column in view collection
* chore: support creating view collection with different schemas with the same name
* chore: support creating view collection with different schemas with the same name
* fix: query view in difference schema
* refactor: view collection viewname
* fix: query view collection in difference schema
* fix: field load
* chore: field options
* fix: mysql test
* fix: uiSchema component error when using a view field in a block
* fix: sqlite test
* chore: test
* fix: dump user views
* fix: view collection can be updated and edited in table block
* chore: sync from database display last field configuration
* chore: loadCollections
* chore: sync from database display last field configuration
* fix: field options merge issues
* style: preview table
* fix: view collection is allow using in kanban blocks
* refactor: code improve
* fix: view collection can be updated an edited in calendar block
* chore: disable infer field without interface
* feat: preview only shows source or interface fields
* fix: test
* refactor: locale
* feat: sql parser
* chore: remove node-sql-parser
* fix: yarn.lock
* test: view repository
* fix: view repository test
* chore: console.log
* chore: console.log
* fix: mysql without schema
* fix: mysql without schema
* chore: preview with field schema
* chore: tableActionInitializers
* style: preview style improve
* chore: parameter is filter when there is no filterByTk
* fix: preview pagination
* fix: preview pagination
* style: preview table style improve
* fix: sync from database loading
* chore: preview performance optimization
* chore: preview performance optimization
* feat: limit & offset
* chore: preview performance optimization
* test: field with dot column
* fix: datetime interface display
* fix: missing boolean type
* fix: sync
* fix: sync from database
* style: style improve
* style: style improve
* style: style improve
* chore: preview table
* chore: preview table
* chore: preview table
* fix: styling
---------
Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
|
|
|
|
|
|
|
public isView() {
|
|
|
|
return false;
|
|
|
|
}
|
2023-05-25 21:46:58 +08:00
|
|
|
|
|
|
|
protected sequelizeModelOptions() {
|
|
|
|
const { name } = this.options;
|
|
|
|
return {
|
|
|
|
..._.omit(this.options, ['name', 'fields', 'model', 'targetKey']),
|
|
|
|
modelName: name,
|
|
|
|
sequelize: this.context.database.sequelize,
|
|
|
|
tableName: this.tableName(),
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
private checkOptions(options: CollectionOptions) {
|
|
|
|
checkIdentifier(options.name);
|
|
|
|
this.checkTableName();
|
|
|
|
}
|
|
|
|
|
|
|
|
private checkTableName() {
|
|
|
|
const tableName = this.tableName();
|
|
|
|
for (const [k, collection] of this.db.collections) {
|
|
|
|
if (
|
|
|
|
collection.name != this.options.name &&
|
|
|
|
tableName === collection.tableName() &&
|
|
|
|
collection.collectionSchema() === this.collectionSchema()
|
|
|
|
) {
|
|
|
|
throw new Error(`collection ${collection.name} and ${this.name} have same tableName "${tableName}"`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private bindFieldEventListener() {
|
|
|
|
this.on('field.afterAdd', (field: Field) => {
|
|
|
|
field.bind();
|
|
|
|
});
|
|
|
|
|
|
|
|
this.on('field.afterRemove', (field: Field) => {
|
|
|
|
field.unbind();
|
|
|
|
this.db.emit('field.afterRemove', field);
|
|
|
|
});
|
|
|
|
}
|
2021-09-18 00:23:21 +08:00
|
|
|
}
|