diff --git a/packages/core/core/src/Strapi.ts b/packages/core/core/src/Strapi.ts index 17b13c5cea..124147e943 100644 --- a/packages/core/core/src/Strapi.ts +++ b/packages/core/core/src/Strapi.ts @@ -198,7 +198,8 @@ class Strapi extends Container implements StrapiI { .add('sanitizers', registries.sanitizers()) .add('validators', registries.validators()) .add('content-api', createContentAPI(this)) - .add('auth', createAuth()); + .add('auth', createAuth()) + .add('models', registries.models()); // Create a mapping of every useful directory (for the app, dist and static directories) this.dirs = utils.getDirs(rootDirs, { strapi: this }); @@ -461,6 +462,8 @@ class Strapi extends Container implements StrapiI { async register() { await loaders.loadApplicationContext(this); + this.get('models').add(coreStoreModel).add(webhookModel); + // init webhook runner this.webhookRunner = createWebhookRunner({ eventHub: this.eventHub, @@ -481,17 +484,15 @@ class Strapi extends Container implements StrapiI { } async bootstrap() { - this.db = await Database.init({ - ...this.config.get('database'), - models: [ - ...utils.transformContentTypesToModels([ - ...Object.values(this.contentTypes), - ...Object.values(this.components), - ]), - coreStoreModel, - webhookModel, - ], - }); + const models = [ + ...utils.transformContentTypesToModels([ + ...Object.values(this.contentTypes), + ...Object.values(this.components), + ]), + ...this.get('models').get(), + ]; + + this.db = await Database.init({ ...this.config.get('database'), models }); this.store = createCoreStore({ db: this.db }); this.webhookStore = createWebhookStore({ db: this.db }); diff --git a/packages/core/core/src/registries/index.ts b/packages/core/core/src/registries/index.ts index 43eb0b5198..e6a7467d7b 100644 --- a/packages/core/core/src/registries/index.ts +++ b/packages/core/core/src/registries/index.ts @@ -12,3 +12,4 @@ export { default as config } from './config'; export { default as apis } from './apis'; export { default as sanitizers } from './sanitizers'; export { default as validators } from './validators'; +export { registry as models } from './models'; diff --git a/packages/core/core/src/registries/models.ts b/packages/core/core/src/registries/models.ts new file mode 100644 index 0000000000..a3e451ff5a --- /dev/null +++ b/packages/core/core/src/registries/models.ts @@ -0,0 +1,16 @@ +import { Model } from '@strapi/database'; + +export const registry = () => { + const models: Model[] = []; + + return { + add(model: Model) { + models.push(model); + return this; + }, + + get() { + return models; + }, + }; +}; diff --git a/packages/core/core/src/services/core-store.ts b/packages/core/core/src/services/core-store.ts index 8594c2b007..f0c6677376 100644 --- a/packages/core/core/src/services/core-store.ts +++ b/packages/core/core/src/services/core-store.ts @@ -1,5 +1,5 @@ import { toString } from 'lodash/fp'; -import type { Model, Database } from '@strapi/database'; +import type { Database, Model } from '@strapi/database'; const coreStoreModel: Model = { uid: 'strapi::core-store', diff --git a/packages/core/database/src/index.ts b/packages/core/database/src/index.ts index fa4b579eb1..e88d734864 100644 --- a/packages/core/database/src/index.ts +++ b/packages/core/database/src/index.ts @@ -10,7 +10,6 @@ import { createConnection } from './connection'; import * as errors from './errors'; import { Callback, transactionCtx, TransactionObject } from './transaction-context'; import { validateDatabase } from './validations'; - import type { Model } from './types'; export { isKnexQuery } from './utils/knex'; @@ -169,4 +168,5 @@ class Database { } } -export { Database, errors, Model }; +export { Database, errors }; +export type { Model }; diff --git a/packages/core/database/src/metadata/index.ts b/packages/core/database/src/metadata/index.ts index 8bf686d075..866eccbb94 100644 --- a/packages/core/database/src/metadata/index.ts +++ b/packages/core/database/src/metadata/index.ts @@ -38,7 +38,9 @@ export const createMetadata = (models: Model[] = []): Metadata => { for (const model of _.cloneDeep(models)) { metadata.add({ ...model, - attributes: model.attributes, + attributes: { + ...model.attributes, + }, lifecycles: model.lifecycles ?? {}, indexes: model.indexes ?? [], foreignKeys: model.foreignKeys ?? [],