Перейти до основного вмісту

Сервіс бізнес-схеми

інформація

Бізнес-схема виступає ключовим елементом інфраструктури веб-сервера, який детально описує функціональні аспекти веб-застосунку. Після створення, ця бізнес-схема надсилається до сервісу бізнес-схеми для подальшого аналізу та використання у різних компонентах системи. Головним ж призначенням бізнес-схеми - використання для обробки запитів та подій ядром обчислень.

Архітектура

Сервіс бізнес-схеми виконує два ключові завдання. По-перше, він відповідає за збереження актуальної версії бізнес-схеми, яка формується завдяки завантажувачам бізнес-схем. По-друге, сервіс надає перелік методів для доступу до ресурсів, що містяться в бізнес-схемі. Ці методи використовуються агентом бізнес-схеми для отримання доступу до інших модулів, що описані у цій бізнес-схемі.

scheme-service-arch.svg

інформація

Роль структури бізнес-схеми в системі обчислень важлива. Наприклад, у відповідь на кожний запит, адаптери протоколів створюють знімок бізнес-схеми, який передається в контекст запиту. У цьому контексті агент бізнес-схеми 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 - обробник кінцевого маршруту.

Методи агента бізнес-схеми

примітка

Сервіс надає групу методів для організації кодової бази в бізнес-схемі, використовуючи агента бізнес-схеми, який об'єднує в собі усі наведені нижче методи.

НазваПростірОпис
schemagetОтримання повної структури бізнес-схеми
getMongoRepositorymethodОтримати репозиторій MongoDB, прикладної області, до якої надісланий запит чи подія.
getAnotherMongoRepositorymethodОтримати репозиторій MongoDB, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія.
getTypeormRepositorymethodОтримати репозиторій TypeORM, прикладної області, до якої надісланий запит чи подія.
getAnotherTypeormRepositorymethodОтримати репозиторій TypeORM, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія.
getValidatormethodОтримати валідатор, прикладної області, до якої надісланий запит чи подія.
getAnotherValidatormethodОтримати валідатор, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія.
getHelpermethodОтримати помічник, прикладної області, до якої надісланий запит чи подія.
getAnotherHelpermethodОтримати помічник, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія.
getResourcemethodОтримати ресурс перекладу, прикладної області, до якої надісланий запит чи подія.
getAnotherResourcemethodОтримати ресурс перекладу, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія.
getDictionarymethodОтримати словник перекладу, прикладної області, до якої надісланий запит чи подія.
getAnotherDictionarymethodОтримати словник перекладу, прикладної області цього ж сервісу, але відмінної від тієї, до якої був надісланий запит чи подія.