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('sanitizers', registries.sanitizers())
.add('validators', registries.validators()) .add('validators', registries.validators())
.add('content-api', createContentAPI(this)) .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) // Create a mapping of every useful directory (for the app, dist and static directories)
this.dirs = utils.getDirs(rootDirs, { strapi: this }); this.dirs = utils.getDirs(rootDirs, { strapi: this });
@ -461,6 +462,8 @@ class Strapi extends Container implements StrapiI {
async register() { async register() {
await loaders.loadApplicationContext(this); await loaders.loadApplicationContext(this);
this.get('models').add(coreStoreModel).add(webhookModel);
// init webhook runner // init webhook runner
this.webhookRunner = createWebhookRunner({ this.webhookRunner = createWebhookRunner({
eventHub: this.eventHub, eventHub: this.eventHub,
@ -481,17 +484,15 @@ class Strapi extends Container implements StrapiI {
} }
async bootstrap() { async bootstrap() {
this.db = await Database.init({ const models = [
...this.config.get('database'), ...utils.transformContentTypesToModels([
models: [ ...Object.values(this.contentTypes),
...utils.transformContentTypesToModels([ ...Object.values(this.components),
...Object.values(this.contentTypes), ]),
...Object.values(this.components), ...this.get('models').get(),
]), ];
coreStoreModel,
webhookModel, this.db = await Database.init({ ...this.config.get('database'), models });
],
});
this.store = createCoreStore({ db: this.db }); this.store = createCoreStore({ db: this.db });
this.webhookStore = createWebhookStore({ 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 apis } from './apis';
export { default as sanitizers } from './sanitizers'; export { default as sanitizers } from './sanitizers';
export { default as validators } from './validators'; 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 { toString } from 'lodash/fp';
import type { Model, Database } from '@strapi/database'; import type { Database, Model } from '@strapi/database';
const coreStoreModel: Model = { const coreStoreModel: Model = {
uid: 'strapi::core-store', uid: 'strapi::core-store',

View File

@ -10,7 +10,6 @@ import { createConnection } from './connection';
import * as errors from './errors'; import * as errors from './errors';
import { Callback, transactionCtx, TransactionObject } from './transaction-context'; import { Callback, transactionCtx, TransactionObject } from './transaction-context';
import { validateDatabase } from './validations'; import { validateDatabase } from './validations';
import type { Model } from './types'; import type { Model } from './types';
export { isKnexQuery } from './utils/knex'; 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)) { for (const model of _.cloneDeep(models)) {
metadata.add({ metadata.add({
...model, ...model,
attributes: model.attributes, attributes: {
...model.attributes,
},
lifecycles: model.lifecycles ?? {}, lifecycles: model.lifecycles ?? {},
indexes: model.indexes ?? [], indexes: model.indexes ?? [],
foreignKeys: model.foreignKeys ?? [], foreignKeys: model.foreignKeys ?? [],