Тунелі
Тунелі - функціональна група, яка описує перелік методів використання зʼєднання відповідного зʼєднувача. використовуватись при описі бізнес-схеми. Тунелі не зберігають стану, а екземпляр тунелю створюється лише перед виконанням його методу, після чого знищується, очищуючи оперативну памʼять від цього екземпляра тунелю.
Архітектура
Кожен тунель індивідуально налаштований під конкретний з'єднувач та містить перелік методів для взаємодії з цим з'єднувачем. Тунелі можуть бути використані як у ядрі обчислень, так і у бізнес-схемі.
Тунель функціонує як проміжний шар між обробкою з'єднань та безпосереднім доступом і використанням цього з'єднання.
Перелік
X-Fiber підтримує слідуючий перелік тунелів:
| Назва | Доступ | Опис |
|---|---|---|
| MongoTunnel | Зовнішній | Опис методів по роботі з колекціями та документами NoSQL бази данних MongoDB. |
| TypeormTunnel | Зовнішній | Опис методів створення таблиць, опису звʼязків та створення запитів до SQL бази даних. |
| RedisTunnel | Загальний | Опис методів створення запитів до NoSQL Redis |
| RabbitMQTunnel | Загальний | Опис методів створення повідомлень, слухачів та отримувачів цих повідомлень. |
Застосування
1. Використання тунелю в ядрі обчислень:
import { inversify } from '~packages'
import { AbstractService } from './abstract.service'
import type {
IPermissionService,
NPermissionService,
IDiscoveryService,
ILoggerService
} from '~types'
const { injectable, inject } = inversify
@injectable()
export class PermissionService extends AbstractService implements IPermissionService {
protected readonly _SERVICE_NAME = PermissionService.name;
constructor(
@inject(CoreSymbols.DiscoveryService)
protected readonly _discoveryService: IDiscoveryService,
@inject(CoreSymbols.LoggerService)
protected readonly _loggerService: ILoggerService,
// ... other inject structures
) {
super();
}
public async createRole(
role: string,
info: NPermissionService.RoleInfo
): Promise<void> {
const tunnel = container.get<IRedisTunnel>(CoreSymbols.RedisTunnel);
try {
if (info.routes.length > 0) {
const routes = info.routes.map((r) => r.route + "-" + r.method);
await tunnel.addSet(`role:${role}:routes`, routes);
}
if (info.events.length > 0) {
const events = info.events.map((r) => r.event + "-" + r.type);
await tunnel.addSet(`role:${role}:events`, events);
}
} catch (e) {
// ... throw logic
}
}
// ... other methods
}
де:
PermissionService- клас сервісу прав доступу.createRole- метод створення ролі.tunnel-Redisтунель, який надає перелік методів для взаємодії зRedis.
1. Використання тунелю в бізнес-схемі:
import {setMongoRepo} from "@x-fiber/calculator";
type User = { name: string, login: string }
type Repository = {
create: (user: User) => Promise<void>
getById: (id: string) => Promise<User | null>
}
export const repository = setMongoRepo<User & { _id: string }, Repository>({
create: async (provider: Provider, agents: Agents, data: User): Promise<void> => {
try {
await provider.create(data)
} catch (e) {
agents.logger.error(e)
throw agents.errors.throwRepo(e)
}
},
getById: async (provider: Provider, agents: Agents, data: string): Promise<User | null> => {
// ... handler logic
}
});
де:
- Типи:
User- проста структура моделі бази данихMongoDB.Repository- перелік методів по роботі з колекцією бази данихMongoDB.setMongoRepo- вбудована функція з ядра обчислень, для опису переліку методів по роботі з колекцією.Provider- тип провайдера з переліком методів по роботі з колекцієюMongoDB.Agents- перелік агентів функціональності
- Структури:
repository- обʼєкт з переліком методів по роботі з колекцією бази даних, який дорівнює типуRepository.create- метод створення документа в колекції бази данихMongoDB.getById- метод отримання документа по його унікальному ідентифікатору.