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

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

інформація

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

Архітектура

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

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

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

mongo-repository

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.
warning

Така типізація дозволяє описувати простий тип функції, визначаючи лише ті аргументи, які потрібно передати, а також тип результату, який функція має повернути. Додавання аргументів 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
});
warning

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