Репозиторій MongoDB
Документ "Репозиторій MongoDB" слугує мостом взаємодії між колекцією бази даних MongoDB
та бізнес-логікою, що сприяє
підвищенню читабельності та розширюваності коду. Він є інструментом для взаємодії з колекціями даних, забезпечуючи
можливість виконання різноманітних запитів до них.
Архітектура
При необхідності опису методів для роботи з колекцією бази даних MongoDB
необхідно створити документ "Репозиторій
MongoDB" з переліком необхідних методів для роботи.
Документ "Репозиторій MongoDB" повинен бути зареєстрований в документі "Реєстр" предметної області, який в свою чергу,
має бути зареєстрований в відповідному сервісі включеному до бізнес-схеми. Це гарантує, що при запуску ядра обчислень
будуть завантажені всі методи по роботі з колекцією бази даних MongoDB
.
Використання репозиторію відбувається в обробниках запиту, обробниках подій, документів "Планувальник" тощо. Під час виконання запиту, якщо він містить посилання на репозиторій тієї ж або іншої предметної області, яка також належить до цього ж сервісу, здійснюється пошук необхідної функції. Після цього до неї додаються потрібні аргументи, та виконується обробка запиту в базі даних MongoDB.
Cклад
Репозиторій відображає структуру даних у форматі "ключ-значення", де кожен ключ відображає назву функції, а йому відповідає власне сама функція. Цей підхід дозволяє зручно організувати та керувати функціональними можливостями системи, забезпечуючи швидкий доступ до потрібного функціоналу через ім'я функції як ключ.
type MongoHandler<ARGS = void, RESULT = void> = (args: ARGS) => Promise<RESULT>;
type MongoHandlers = Record<string, MongoHandler>
type Provider = {
// ... list of methods
}
type Agents = {
// ... fnAgent, schemaAgent, etc.
}
type MongoStructure<S extends Record<string, any>, T extends MongoHandlers = MongoHandlers> = {
[K in keyof T]: T[K] extends (data: infer D, ...args: infer A) => infer R
? (provider: Provider, agents: Agents, data: D) => R
: T[K];
};
де:
MongoHandler
- тип структури опису структури функції запиту до колекціїMongoDB
.ARGS
- тип аргументів методу, які можуть бути передані при його виклику.RESULT
- тип результату, який буде повернутий після виконання методу.
MongoHandlers
- тип переліку методів запиту до колекціїMongoDB
.Provider
- провайдер функціональності, який надає перелік методів по створенню запитів до колекціїMongoDB
моделі цієї ж предм етної області.MongoStructure
- загальний опис кінцевої структури обробників.S
- тип структури моделі колекціїMongoDB
.K
- назва методу.T
- структура методу.D
- Тип даних, які будуть передані в метод, який дорівнюєARGS
типуHandler
.R
- Тип даних результату повернення з методу, який дорівнюєARGS
типуHandler
.provider
- провайдер функціональності, який дорівнюєProvider
.agents
- агенти функціональності.data
- Тип даних, які будуть передані в метод, який дорівнюєARGS
типуHandler
.
Така типізація дозволяє описувати простий тип функції, визначаючи лише ті аргументи, які потрібно передати, а також тип результату, який функція має повернути. Додавання аргументів provider та agents до функції залишається відповідальністю ядра обчислень, оскільки робота provider залежить від з'єднання з базою даних та оркестрації цих з'єднань, а agents представляють набір функціональності, яка надається ядром обчислень.
Аргумент провайдера функціональності
Опис провайдера функціональності з переліком методів роботи знаходиться в "Провайдер репозиторію MongoDB"
Аргумент агентів функціональності
Аргумент агентів функціональності являє собою обʼєкт з переліком агентів:
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
- агент з переліком просторів імен функціональності, які надають інтеграційні рішення ядра обчислень.
Деталі структури кожного агента функціональності описується в розділі "Агенти"
📄️ Агент функціональності
📕 Опис можливостей агента функціональності
📄️ Агент бізнес-схеми
📕 Опис роботи агента бізнес-схеми
📄️ Агент інтеграцій
📕 Опис можливостей агента інтеграцій
Аргумент даних
Аргументами даних виступає опис тих даних, які необхідно надати функції з відповідного обробника, наприклад інформацію
про користувача, яку надалі потрібно зберегти в базі даних MongoDB
.
Реалізація
import { setMongoRepository } 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 BusUsersAggMongoRepository = setMongoRepository<User & { _id: string }, 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
- проста структура моделі бази данихMongoDB
.Repository
- перелік методів по роботі з колекцією бази данихMongoDB
.setMongoRepo
- вбудована функція з ядра обчислень, для опису переліку методів по роботі з колекцією.Provider
- тип провайдера з переліком методів по роботі з колекцієюMongoDB
.Agents
- перелік агентів функціональності
- Структури:
BusUsersAggMongoRepository
- обʼєкт з переліком методів по роботі з колекцією бази даних, який дорівнює типуRepository
.create
- метод створення документа в колекції бази данихMongoDB
.getById
- метод отримання документа по його унікальному ідентифікатору.
Реєстрація
Щоб успішно використовувати методи по роботі з колекцією MongoDB, документ "Репозиторій MongoDB" повинен бути
зареєстрований в документі "Реєстр" цієї предметної області. Наприклад для предметної області - агрегат "Користувачі", необхідно в опис документів
функції setRegistry
для встановлення посилання на репозиторій та інші компоненти модуля:
import { setRegistry } from '@x-fiber/proton';
import { BusUsersAggMongoModel } from "./BusUsers.agg.mongo-model";
import { BusUsersAggMongoRepository } from "./BusUsers.agg.mongo-repository";
export const BusUsersAggRegistry = setRegistry<'BusUsersAgg'>("BusUsersAgg", {
mongo: {
name: 'BUS_USERS_AGG',
model: BusUsersAggMongoModel,
repository: BusUsersAggMongoRepository
},
// ... other documents
});
Реєстрація документа "Репозиторій MongoDB" не може бути здійснена без документа "Модель MongoDB" оскільки, не можуть бути описані методи по роботі з відповідною моделлю MongoDB без наявності цієї моделі та відповідно колекції в самій базі даних MongoDb.