refactor: разнести пакеты и обновить валидацию
This commit is contained in:
54
README.md
54
README.md
@@ -22,6 +22,12 @@ Mila намеренно не знает ничего про снапшоты, г
|
||||
go get gitea.unprism.ru/KRBL/mila
|
||||
```
|
||||
|
||||
Библиотека собирается под актуальную стабильную ветку Go:
|
||||
|
||||
```text
|
||||
go 1.26.5
|
||||
```
|
||||
|
||||
## Зона Ответственности
|
||||
|
||||
Mila — библиотека протокола. Ее нужно встраивать в прикладной сервис, например
|
||||
@@ -48,6 +54,36 @@ Mila не делает:
|
||||
- не общается с фронтендом напрямую;
|
||||
- не решает, как именно должен отображаться контент.
|
||||
|
||||
## Структура Пакетов
|
||||
|
||||
Корневой пакет `mila` оставлен фасадом для удобной интеграции. Прикладному коду
|
||||
достаточно импортировать только его:
|
||||
|
||||
```go
|
||||
import "gitea.unprism.ru/KRBL/mila"
|
||||
```
|
||||
|
||||
Внутри реализация разнесена по подпакетам:
|
||||
|
||||
| Пакет | Ответственность |
|
||||
| --- | --- |
|
||||
| `protocol` | модели, конфиг, ошибки, валидация, интерфейс хранилища |
|
||||
| `storage` | `MemoryStore` и `FileStore` |
|
||||
| `httpserver` | HTTP-handler, options, коды ответов |
|
||||
|
||||
Фасад в корне переэкспортирует основные типы и функции:
|
||||
|
||||
```go
|
||||
mila.ContentState
|
||||
mila.Config
|
||||
mila.Store
|
||||
mila.NewHandler
|
||||
mila.NewMemoryStore
|
||||
mila.NewFileStore
|
||||
mila.WithLogger
|
||||
mila.WithOnSet
|
||||
```
|
||||
|
||||
## Протокол
|
||||
|
||||
Медиакомплекс выступает HTTP-сервером. БВК выступает HTTP-клиентом.
|
||||
@@ -141,6 +177,20 @@ mila.Config{
|
||||
Лимиты для `str` и `tpl_name` нужно подтвердить у интегратора. В переданном PDF
|
||||
текстовый слой неоднозначно распознает исходное значение.
|
||||
|
||||
Валидация выполняется через `github.com/go-playground/validator/v10`. Ошибки
|
||||
валидации заворачиваются в `mila.ErrInvalidData`, поэтому их можно проверять
|
||||
стандартно:
|
||||
|
||||
```go
|
||||
if errors.Is(err, mila.ErrInvalidData) {
|
||||
// обработать невалидные данные от БВК
|
||||
}
|
||||
```
|
||||
|
||||
Для проверки лимитов строка временно конвертируется в `[]rune`, потому что
|
||||
ограничение задано в символах протокола, а хранить и отдавать данные удобнее как
|
||||
обычную UTF-8 строку JSON/HTTP.
|
||||
|
||||
## Хранилища
|
||||
|
||||
`MemoryStore` подходит, когда состояние не должно переживать рестарт процесса:
|
||||
@@ -214,7 +264,7 @@ type ContentState struct {
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "route: must be at most 3 characters"
|
||||
"error": "mila: invalid content state: route must be at most 3 characters"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -229,6 +279,6 @@ go test ./...
|
||||
- успешный `set-content` + `get-content`;
|
||||
- `get-content` до готовности состояния;
|
||||
- невалидный `route`;
|
||||
- UTF-8 и лимиты для текста/шаблона;
|
||||
- лимиты для текста/шаблона;
|
||||
- сохранение и чтение через `FileStore`;
|
||||
- отсутствие файла состояния в `FileStore`.
|
||||
|
||||
Reference in New Issue
Block a user