mirror of
https://github.com/kamask-dev/pchelpmaster.git
synced 2026-11-11 05:49:38 +00:00
4.4 KiB
4.4 KiB
Общая инфраструктура (shared/)
Клиент PocketBase, который можно получить только через DI, и доменные ошибки, в которые переводятся ошибки SDK.
Где лежит
src/app/shared/
├── pocketbase/
│ ├── pb-url.ts # PB_PUBLIC_PATH, токен PB_URL, серверный провайдер
│ └── pocketbase-client.ts # токен POCKETBASE, фабрика, providePocketBase()
└── errors/
├── domain-errors.ts # DomainError (база), NotFoundError, ValidationError, ...
└── to-domain-error.ts # toDomainError(error: unknown): Error
Публичный API
PB_URL—InjectionToken<string>: базовый адрес PocketBase. В браузере<origin>/pb, на сервереprocess.env['PB_URL']илиhttp://127.0.0.1:8090.PB_PUBLIC_PATH—'/pb', путь, по которому браузер обращается к PocketBase.providePbUrlForServer()— серверный провайдерPB_URL; регистрируется вapp.config.server.tsи перекрывает браузерный.POCKETBASE—InjectionToken<PocketBase>: свой экземпляр на каждый инжектор приложения (на сервере — на каждый запрос). Фабрика одна и та же в браузере и на сервере.providePocketBase()— регистрируетPOCKETBASEиPB_URLпо умолчанию (браузерный:<origin>/pb); вызывается вapp.config.ts, поэтому действует и в браузере, и на сервере. ВозвращаетEnvironmentProviders: вprovidersкомпонента его подключить нельзя, иначе у поддерева был бы свой клиент с пустымauthStore.toDomainError(error)и классы ошибок изdomain-errors.ts— таблица соответствий в architecture.md, раздел 4.
Как пользоваться
// data/ слоя фичи
private readonly pb = inject(POCKETBASE);
async list(): Promise<Tag[]> {
try {
return (await this.pb.collection('tags').getFullList()).map(toTag);
} catch (error) {
throw toDomainError(error);
}
}
Как расширить или заменить
- В тестах вместо клиента подставляется
{ provide: POCKETBASE, useValue: ... }или тестовыйPB_URL. InvalidCredentialsErrorсоздаёт сервис аутентификации;toDomainErrorеё не знает.
Тесты
to-domain-error.spec.ts,pocketbase-client.spec.ts— unit.pocketbase-client.integration.spec.ts— клиент из DI на тестовом PocketBase, изоляция двух пользователей и гостя.tests/lint/eslint-rules.spec.ts— границы ESLint, см. config-tests.md.
Подводные камни
new PocketBase(и импорт классаPocketBase(в том числе изpocketbase/*) разрешены только в фабрикеpocketbase-client.ts(и вtests/;import typeможно везде кромеdomain/иui/); импортpocketbaseиpocketbase/*запрещён вdomain/иui/. См. architecture.md, раздел 6.- Новую доменную ошибку наследуйте от
DomainError, а не отError: только такtoDomainErrorузнаёт её и возвращает как есть. Иначе она будет завёрнута вUnknownError, и UI её не распознает. authStore—BaseAuthStoreв памяти, неLocalAuthStore: на сервере иначе данные пользователей были бы общими.- Автоотмена запросов SDK выключена: параллельные запросы одного типа не отменяют друг друга.
- Серверный
PB_URL— внутренний адрес; он не попадает в браузер, браузер ходит через/pb. См. architecture.md, раздел 7.