https://github.com/Mich4107/cloud-file-storage
Ревью от Ивана
Docker и docker-compose:
-
Как будто бы хочется мультистейдж билд, чтобы шаги кэшировать и лишнее не тянуть. Используй jre образ вместо jdk, чтоб затраты ресурсов на джаву. https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/Dockerfile#L1
-
Было бы круто пуллить образы из докерхаба. Можно даже автоматизировать через
github-actions
, а продовый энв как раз можно спрятать вgithub-secrets
https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/docker-compose.yml#L4 -
Как ты мог заметить, depends_on не работает, потому что ты не прописал rediness (health) для сервисов. https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/docker-compose.yml#L16
-
Маппинг наружу для портов постгреса и редиса тут видимо забыл убрать) https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/docker-compose.yml#L28
Domain entities:
-
User::login - не вижу unique констреинта. https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/src/main/java/ru/yuubi/cloud_file_storage/entity/User.java#L17
-
Приложение называется - cloud file storage, но ни одной модели, связанной с файлами/директориями я не вижу
Services:
-
Создание нового юзера - ансейф, при том констреинта на уникальность логина нету https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/src/main/java/ru/yuubi/cloud_file_storage/service/AuthService.java#L22
-
Дальше идет что-то непонятное для меня (инфраструктура security в сервисе). SecurityContext обычно проставляют на этапе фильтрации реквеста (
SecurityFilterChain
) В общем security должно быть вынесено из сервисов https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/src/main/java/ru/yuubi/cloud_file_storage/service/AuthService.java#L32 -
За такой MinioService я бы поставил тебе request-changes, там явно не хватает декомпозиции и очень много низкоуровневой логики, которая следует из использования минио в качестве стора. Напрямую используешь сдкашные объекты, потому что моделек для файлов и директорий нету. Так можно было бы обернуть клиент минио, а в сервисе работать со своими модельками. Нет никаких валидаций на уникальность объектов в сторе (старые просто перезаписываются). Очень много копипаста логики по наименованию объектов в минио (буквально в каждом методе она повторяется) В итоге все приложение содержится в этом сервисе. https://github.com/Mich4107/cloud-file-storage/blob/0d66e5eced70645f7b4841468dec56cf87331084/src/main/java/ru/yuubi/cloud_file_storage/service/MinioService.java#L37
Config:
- Таймауты для минио клиента не проставлены, а файл в 15000MB аплоадить ты будешь явно дольше, чем длится дефолтный таймаут
Controllers:
- Не увидел обработки эксепшенов => любой эксепшен приводит к рестарту контейнера. Логи не аппендятся в волюм, поэтому искать и фиксить баги в твоем приложении будет тяжело. Можно добавить хотя-бы keep-alive в конфиг спринга.