refactor: разнести пакеты и обновить валидацию

This commit is contained in:
Георгий
2026-07-14 22:00:34 +03:00
parent 3ed29fa8e6
commit 1e1008d506
20 changed files with 409 additions and 128 deletions

View File

@@ -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`.