diff --git a/packages/core/database/src/fields/field.ts b/packages/core/database/src/fields/field.ts index 021e6ba89f..59c2c11faf 100644 --- a/packages/core/database/src/fields/field.ts +++ b/packages/core/database/src/fields/field.ts @@ -62,6 +62,10 @@ export abstract class Field { abstract get dataType(): any; + get rawDataType() { + return this.dataType; + } + isRelationField() { return false; } @@ -179,7 +183,10 @@ export abstract class Field { const opts = _.omit(this.options, ['name']); if (this.dataType) { // @ts-ignore - Object.assign(opts, { type: this.database.sequelize.normalizeDataType(this.dataType) }); + Object.assign(opts, { + type: this.database.sequelize.normalizeDataType(this.dataType), + rawDataType: this.rawDataType, + }); } Object.assign(opts, this.additionalSequelizeOptions()); diff --git a/packages/core/database/src/model.ts b/packages/core/database/src/model.ts index 3fb2892d65..00a9700c36 100644 --- a/packages/core/database/src/model.ts +++ b/packages/core/database/src/model.ts @@ -8,7 +8,7 @@ */ import lodash from 'lodash'; -import { Model as SequelizeModel, ModelStatic } from 'sequelize'; +import { Model as SequelizeModel, ModelStatic, FindOptions } from 'sequelize'; import { Collection } from './collection'; import { Database } from './database'; import { Field } from './fields'; @@ -216,4 +216,9 @@ export class Model): Promise { + this.database.emit('beforeModelFind', this, options); + return super.findAll(options); + } } diff --git a/packages/core/database/src/query-interface/query-interface.ts b/packages/core/database/src/query-interface/query-interface.ts index fa185f9a8d..42c0d5d914 100644 --- a/packages/core/database/src/query-interface/query-interface.ts +++ b/packages/core/database/src/query-interface/query-interface.ts @@ -17,6 +17,7 @@ import { } from 'sequelize'; import { Collection } from '../collection'; import Database from '../database'; +import { Literal } from 'sequelize/types/utils'; export type TableInfo = { tableName: string; @@ -167,7 +168,7 @@ export default abstract class QueryInterface { } } - public generateJsonPathExpression(field: string, path: string) { - return `${field}.${path}`; + public generateJsonPathExpression(field: string, path: string): Literal { + return this.db.sequelize.literal(`${field}.${path}`); } } diff --git a/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts b/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts index 50d46743cb..9fe3046640 100644 --- a/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts +++ b/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts @@ -90,7 +90,7 @@ describe('sql collection', () => { expect(res.body.data.sources).toEqual(['testSqlCollection']); }); - it.only('sqlCollection:update', async () => { + it('sqlCollection:update', async () => { await agent.resource('collections').create({ values: { name: 'fakeCollection', diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/http-api/collections.test.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/http-api/collections.test.ts index e689a9a154..3eb9c30281 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/http-api/collections.test.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/__tests__/http-api/collections.test.ts @@ -252,7 +252,7 @@ describe('collections repository', () => { expect(response1.body.data.length).toBe(2); }); - it('case 7', async () => { + it.only('case 7', async () => { const response = await agent.resource('posts').create({ values: { tags: [ diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts index 940c867eca..fefea7fd0c 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts @@ -7,7 +7,7 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { Database } from '@nocobase/database'; +import { Database, Op } from '@nocobase/database'; import { FieldIsDependedOnByOtherError } from '../errors/field-is-depended-on-by-other'; export function beforeDestoryField(db: Database) { @@ -18,20 +18,22 @@ export function beforeDestoryField(db: Database) { if (['belongsTo', 'hasOne', 'hasMany', 'belongsToMany'].includes(type)) { return; } - - const relatedFields = await db.getRepository('fields').find({ - filter: { - $or: [ - { - [db.queryInterface.generateJsonPathExpression('options', 'sourceKey')]: name, - collectionName, - }, - { - [db.queryInterface.generateJsonPathExpression('options', 'targetKey')]: name, - [db.queryInterface.generateJsonPathExpression('options', 'targetKey')]: collectionName, - }, + const $or = [ + { + [Op.and]: [ + db.sequelize.where(db.queryInterface.generateJsonPathExpression('options', 'sourceKey'), Op.eq, name), + { collectionName }, ], }, + { + [Op.and]: [ + db.sequelize.where(db.queryInterface.generateJsonPathExpression('options', 'targetKey'), Op.eq, name), + db.sequelize.where(db.queryInterface.generateJsonPathExpression('options', 'target'), Op.eq, collectionName), + ], + }, + ]; + const relatedFields = await db.getRepository('fields').find({ + filter: { $or }, transaction, });