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

Репозиторій TypeORM

інформація

Документ "Репозиторій TypeORM" слугує мостом взаємодії між таблицею бази даних MongoDB та бізнес-логікою, що сприяє підвищенню читабельності та розширюваності коду. Він є інструментом для взаємодії з таблицями даних, забезпечуючи можливість виконання різноманітних запитів до них.

примітка

X-Fiber використовує TypeORM оскільки TypeORM універальна ORM, яка може бути використана надалі в інших середовищах, таких як десктопних платформах тощо.

Функції, виклику запиту реалізовують методи по роботі з базою даних завдяки методам Typeorm Репозиторію. Детальніше про функціонал дивись функціонал Typeorm Repository

Архітектура

При необхідності опису методів для роботи з таблицею SQL бази даних необхідно створити документ "Репозиторій TypeORM" з переліком необхідних методів для роботи.

Документ "Репозиторій TypeORM" повинен бути зареєстрований в документі "Реєстр" предметної області, який в свою чергу, має бути зареєстрований в відповідному сервісі включеному до бізнес-схеми. Це гарантує, що при запуску ядра обчислень будуть завантажені всі методи по роботі з таблицею бази даних SQL.

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

typeorm-repository-arch

примітка

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

Cклад

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

type TypeormHandler<ARGS = void, RESULT = void> = (args: ARGS) => Promise<RESULT>;
type TypeormHandlers = Record<string,TypeormHandler>
type Provider = {
// ... list of methods
}
type Agents = {
// ... fnAgent, schemaAgent, etc.
}

type TypeormStructure<S extends Record<string, any>, T extends TypeormHandlers = TypeormHandlers> = {
[K in keyof T]: T[K] extends (data: infer D, ...args: infer A) => infer R
? (provider: Provider, agents: Agents, data: D) => R
: T[K];
};

де:

  • TypeormHandler - тип метода запиту до SQL бази даних.
    • ARGS - тип аргументів методу, які можуть бути передані при його виклику.
    • RESULT - тип результату, який буде повернутий після виконання методу.
  • TypeormHandlers - тип переліку методів запиту до SQL бази даних.
  • Provider - провайдер функціональності, який надає перелік методів по створенню запитів до таблиці SQL бази даних схеми цієї ж предметної області.
  • TypeormStructure - загальний опис кінцевої структури обробників.
    • S - тип структури SQL таблиці бази даних.
    • K - назва методу.
    • T - структура методу.
    • D - Тип даних, які будуть передані в метод, який дорівнює ARGS типу Handler.
    • R - Тип даних результату повернення з методу, який дорівнює ARGS типу Handler.
    • provider - провайдер функціональності, який дорівнює Provider.
    • agents - агенти функціональності.
    • data - Тип даних, які будуть передані в метод, який дорівнює ARGS типу Handler.
warning

Така типізація дозволяє описувати простий тип функції, визначаючи лише ті аргументи, які потрібно передати, а також тип результату, який функція має повернути. Додавання аргументів provider та agents до функції залишається відповідальністю ядра обчислень, оскільки робота provider залежить від з'єднання з базою даних та оркестрації цих з'єднань, а agents представляють набір функціональності, яка надається ядром обчислень.

Аргумент провайдера TypeORM

інформація

Усі обробники будуються на основі провайдера provider TypeORM, який містить набір методів для створення логіки взаємодії з SQL таблицями бази даних.

Провайдер має перелік методів, які повністю повторюють перелік методів вбудованого в TypeORM методу - getRepository(). Деталі та опис функціональності дивись getRepository()

Аргумент агентів функціональності

Аргумент агентів функціональності являє собою обʼєкт з переліком агентів:

type IFunctionalityAgent = {
// agent functionality description
}

type ISchemaAgent = {
// agent functionality description
}

type IIntegrationAgent = {
// agent functionality description
}

export type Agents = {
fnAgent: IFunctionalityAgent;
schemaAgent: ISchemaAgent;
inAgent: IIntegrationAgent;
};

де:

  • fnAgent - агент з переліком просторів імен функціональності, які надають функціональні компоненти ядра обчислень.
  • schemaAgent - агент з переліком функціональності для доступу до інших складових бізнес-схеми.
  • inAgent - агент з переліком просторів імен функціональності, які надають інтеграційні рішення ядра обчислень.

Деталі структури кожного агента функціональності описується в розділі "Агенти"

Аргумент даних

Аргументами даних виступає опис тих даних, які необхідно надати функції з відповідного обробника, наприклад інформацію про користувача, яку надалі потрібно зберегти в SQL базі даних.

Реалізація

import { setTypeormRepository } from '@x-fiber/proton';
import type { Provider, Agents } from '@x-fiber/proton';

type User = { name: string, login: string }
type Repository = {
create: (user: User) => Promise<void>
getById: (id: string) => Promise<User | null>
}

export const BusUsersAggTypeormRepository = setTypeormRepository<User, Repository>({
create: async (provider: Provider, agents: Agents, data: User): Promise<void> => {
// ... handler logic
},
getById: async (provider: Provider, agents: Agents, data: string): Promise<User | null> => {
// ... handler logic
}
});

де:

  • Типи:
    • User - проста структура SQL таблиці бази даних.
    • Repository - перелік методів по роботі з таблицею бази даних.
    • setTypeormRepo - вбудована функція з ядра обчислень, для опису переліку методів по роботі з таблицею.
    • Provider - тип провайдера з переліком методів по роботі з таблицею бази даних.
    • Agents - перелік агентів функціональності
  • Структури:
    • BusUsersAggTypeormRepository - обʼєкт з переліком методів по роботі з таблицею бази даних, який дорівнює типу Repository.
    • create - метод створення запису в бази даних.
    • getById - метод отримання документа по його унікальному ідентифікатору.

Реєстрація

Щоб успішно використовувати методи по роботі з таблицею SQL базою даних, документ "Репозиторій TypeORM" повинен бути зареєстрований в документі "Реєстр" цієї предметної області. Наприклад для предметної області - агрегат "Користувачі", необхідно в опис документів функції setRegistry для встановлення посилання на маршрутизатор та інші компоненти модуля:

import { setRegistry } from '@x-fiber/proton';
import { BusUsersAggTypeormSchema } from './BusUsers.agg.typeorm-schema';
import { BusUsersAggTypeormRepository } from './BusUsers.agg.typeorm-repository';

export const BusUsersAggRegistry = setRegistry<'BusUsersAgg'>('BusUsersAgg', {
typeorm: {
name: 'BUS_USERS_AGG',
schema: BusUsersAggTypeormSchema,
repository: BusUsersAggTypeormRepository
},
// ... other documents
});
warning

Реєстрація документа "Репозиторій TypeORM" не може бути здійснена без документа "Cхема TypeORM" оскільки, не можуть бути описані методи по роботі з відповідною схемою TypeORM без наявності цієї схеми та відповідно таблиці в самій SQL базі даних.