Сервіс бізнес-схеми
Бізнес-схема виступає ключовим елементом інфраструктури веб-сервера, який детально описує функціональні аспекти веб-застосунку. Після створення, ця бізнес-схема надсилається до сервісу бізнес-схеми для подальшого аналізу та використання у різних компонентах системи. Головним ж призначенням бізнес-схеми - використання для обробки запитів та подій ядром обчислень.
Архітектура
Сервіс бізнес-схеми виконує два ключові завдання. По-перше, він відповідає за збереження актуальної версії бізнес-схеми, яка формується завдяки завантажувачам бізнес-схем. По-друге, сервіс надає перелік методів для доступу до ресурсів, що містяться в бізнес-схемі. Ці методи використовуються агентом бізнес-схеми для отримання доступу до інших модулів, що описані у цій бізнес-схемі.
Роль структури бізнес-схеми в системі обчислень важлива. Наприклад, у відповідь на кожний запит, адаптери протоколів створюють знімок бізнес-схеми, який передається в контекст запиту. У цьому контексті агент бізнес-схеми schemaAgent використовується для доступу до необхідних модулів та кодової бази, що відповідає знімку бізнес-схеми через вбудовані посилання.
Крім того, структура бізнес-схеми активно використовується у роботі сервісів локалізації, зʼєднувачів баз даних та інших компонентів системи.
Використання
Цей сервіс виступає ядром обчислень для формування структурних модулів та забезпечує групу методів для звернення до інших ел ементів бізнес-схеми з самої бізнес-схеми.
1. Використання в ядрі обчислень
// ** SchemaService.ts */
import { inversify } from '~packages';
import { CoreSymbols } from '~symbols'
import { AbstractService } from './abstract.service';
import type {
ISchemeService,
NSchemeService,
NAbstractHttpAdapter
} from '~types'
const { injectable } = inversify;
@injectable()
export class SchemeService extends AbstractService implements ISchemeService {
// ... other class logic
public get typeormSchemas(): NSchemeService.TypeormEntities {
const entities: NSchemeService.TypeormEntities = new Map<
string,
Typeorm.EntitySchema<unknown>
>();
this.services.forEach((domains) => {
domains.forEach((storage, domain) => {
if (storage.typeormSchema && storage.typeormModel) {
const agents: NAbstractHttpAdapter.Agents = {
fnAgent: container.get<IFunctionalityAgent>(
CoreSymbols.FunctionalityAgent
),
schemaAgent: container.get<ISchemaAgent>(CoreSymbols.SchemaAgent),
baseAgent: container.get<IBaseOperationAgent>(
CoreSymbols.BaseOperationAgent
),
inAgent: container.get<IIntegrationAgent>(
CoreSymbols.IntegrationAgent
),
};
const entity = new EntitySchema<unknown>(
storage.typeormSchema(agents)
);
entities.set(storage.typeormModel, entity);
}
});
});
return entities;
}
// ... other class logic
}
// ** TypeormConnector.ts */
import { inversify } from '~packages';
import { CoreSymbols } from '~symbols'
import { AbstractConnector } from './abstract.connector';
import type { Typeorm, ITypeormConnector, ISchemeService } from '~types'
const { injectable, typeorm } = inversify;
@injectable()
export class TypeormConnector extends AbstractConnector implements ITypeormConnector {
// ... other class logic
private _entities: Map<string, Typeorm.EntitySchema<unknown>> | undefined;
constructor(
@inject(CoreSymbols.SchemeService)
private readonly _schemeService: ISchemeService
// ... inject structures
) {
super();
this._repositories = new Map<string, Typeorm.Repository<unknown>>();
}
public async start(): Promise<void> {
// ... other method logic
const options: Typeorm.DataSourceOptions = {
// ... other options
entities: Array.from(this._schemeService.typeormSchemas()),
// ... other options
};
this._connection = new typeorm.DataSource(options);
// ... other method logic
}
}
де:
SchemeService- клас сервісу бізнес-схемиtypeormSchemas-getterдля отримання всіх схемSQLтаблиць баз даних.NSchemeService.TypeormEntities- тип переліку сутностейTypeORM, які в подальшому будуть додані в зʼєднанняTypeORM.
TypeormConnector- клас зʼєднувача зTypeORM._entities- колекція сутностей, яка використовується при створені ресурсу зʼєднання зSQLбазою даних.start- метод, який виконується при запуску зʼєднувача.Typeorm.DataSourceOptions- тип структури опцій створення ресурсу зʼєднання.this._connection- зʼєднання зSQL, базою даних.
2. Використання в бізнес-схемі:
import { setRouter } from '@x-fiber/calculator';
type User = {
// ... user structure
}
type Domains = 'BusUsersAgg' | 'BusUsersAuthSpec' | 'BusUsersPermissionSpec'
type Routes = 'get-one'
type Repository = {
create: (user: User) => Promise<string>
getById: (id: string) => Promise<User | null>
getAll: (limit?: number) => Promise<User[] | null>
removeById: (id: string) => Promise<void>
}
export const BusUsersAggRouter = setRouter<Routes>({
'get-one': {
GET: {
scope: 'private:user',
handler: async (request: Request, agents: Agents, context: Context) => {
const repository = agents.schemaAgent.getTypeormRepository<Repository>();
// repository.create()
// repository.getById()
// repository.getAll()
// repository.removeById()
},
},
},
});
де:
- Типи:
User- структура схемиSQLбази даних.Domains- перелік прикладних областей конкретного сервісу.Routes- перелік кін цевих маршрутів.Repository- перелік методів по роботі зSQLбазою даних конкретної прикладної області.Request- тип обʼєкту запиту.Agents- тип переліку агентів функціональності.Context- тип контексту виконання запиту.
- Структури:
setRouter- вбудована функція в ядро обчислень, яка призначення для опису маршрутизатора."get-one"- назва кінцевого маршруту.GET-httpметод.scope- тип приватизації.handler- обробник кінцевого маршруту.
Методи агента бізнес-схеми
Сервіс надає групу методів для організації кодової бази в бізнес-схемі, використовуючи агента бізнес-схеми, який об'єднує в собі усі наведені нижче методи.
| Назва | Простір | Опис |
|---|---|---|
schema | get | Отримання повної структури бізнес-схеми |
getMongoRepository | method | Отримати репозиторій MongoDB, прикладної області, до якої надісланий запит чи подія. |
getAnotherMongoRepository | method | Отримати репозиторій MongoDB, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія. |
getTypeormRepository | method | Отримати репозиторій TypeORM, прикладної області, до якої надісланий запит чи подія. |
getAnotherTypeormRepository | method | Отримати репозиторій TypeORM, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія. |
getValidator | method | Отримати валідатор, прикладної області, до якої надісланий запит чи подія. |
getAnotherValidator | method | Отримати валідатор, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія. |
getHelper | method | Отримати помічник, прикладної області, до якої надісланий запит чи подія. |
getAnotherHelper | method | Отримати помічник, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія. |
getResource | method | Отримати ресурс перекладу, прикладної області, до якої надісланий запит чи подія. |
getAnotherResource | method | Отримати ресурс перекладу, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія. |
getDictionary | method | Отримати словник перекладу, прикладної області, до якої надісланий запит чи подія. |
getAnotherDictionary | method | Отримати словник перекладу, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія. |