Conversation
46c77eb to
43bfd86
Compare
Perederey
left a comment
There was a problem hiding this comment.
Привет! Отличная работа! Архитектура чистая, тесты есть, все работает. Видно, что ты вложился.
Из того, на что стоит обратить внимание
- Не использованы generics для Repository Pattern, это основная фича из вебинара последнего , они помогут избежать дублирования кода между UserRepo и ItemRepo
- Нет structured logging с slog, везде используется старый log, а в задании это была важная тема про observability
- Отсутствует errgroup для параллельных операций, в сервисах типа List/Sync лучше распараллелить обработку с контролем concurrency
Но в целом проект крутой, особенно понравилась реализация клиент-серверной синхронизации и TUI! Продолжай в том же духе!
| "gophkeeper/internal/infra/httpapi" | ||
| "gophkeeper/internal/infra/persistence" | ||
| "gophkeeper/internal/infra/security" | ||
| "log" |
There was a problem hiding this comment.
Лучше используй log/slog для structured logging с контекстными полями (trace_id, user_id и т.д.), это упрощает observability в продакшене
| ) | ||
|
|
||
| // UserRepo is a SQLite-backed repository for users. | ||
| type UserRepo struct { |
There was a problem hiding this comment.
Лучше используй generic репозиторий, чтобы избежать дублирования кода между UserRepo и ItemRepo
| "github.com/google/uuid" | ||
| ) | ||
|
|
||
| // Service orchestrates client use cases. |
There was a problem hiding this comment.
В конструкторе NewService надо бы проверять, что api, store, crypto не nil, и возвращать ошибку. Это принцип Fail Fast из Clean Архитектуры
| vault *vault.Service | ||
| signer ports.TokenSigner | ||
| ttl time.Duration | ||
| } |
There was a problem hiding this comment.
Надо бы добавить middleware
No description provided.