Merge pull request #19342 from strapi/v5/model-api

chore: add a simple model registry
This commit is contained in:
Alexandre BODIN 2024-01-26 12:23:48 +01:00 committed by GitHub
commit 8bd5584d87
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 36 additions and 16 deletions

View File

@ -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 });

View File

@ -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';

View File

@ -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;
},
};
};

View File

@ -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',

View File

@ -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 };

View File

@ -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 ?? [],