## Условие
На вход веб-сервису приходит HTTP-запрос: по данному пользователем нормализованному урлу скопировать изображение во внутренний сервис для хранения картинок и получить внутренний id в сервисе хранения.Либо вернуть уже существующий id, если этот урл был загружен ранее. Нельзя заливать дважды картинку с в точности совпадающим урлом, иначе хранилище зря забивается.
Требования по обработке ошибок:
- если загрузка не удалась из-за некорректного урла, хотим возвращать 400 (bad request)- в случае ошибок, связанных с конфликтующими параллельными запросами, хотим возвращать 409 (conflict)- в случае ошибок обработки на стороне сервера, хотим возвращать 500 (internal server error)
Необходимо реализовать production-ready менеджер для заливки картинок по урлам в уже готовый сервис для хранения картинок.
Нужно использовать готовый интерфейс клиента для заливки изображения в сервис хранения по урлу.
Обратите внимание, что если вызвать несколько раз UploadImage с одним и тем же урлом, то картинка будет заливаться повторно, пространство хранилища будет расходоваться зря.Чтобы решить эту проблему, предлагается использовать вспомогательную базу данных.
Нужно предложить интерфейс для работы со вспомогательной базой данных (без реализации) и, опираясь на него,реализовать логику в менеджере для обработки запросов:type ImagesStorage interface { // В случае успеха возвращает уникальный внутренний id, не проверяет был ли этот урл залит ранее // Если картинка не грузится из-за неправильного урла, возвращается ошибка ErrInvalidURL. UploadImage(url string) (string, error)
// Получение сохраненной картинки по id, не требуется в данной задаче. GetImage(id string) (IDbyte, error)}
var ErrInvalidURL = errors.New("invalid url ")
// Менеджер обработки запросов, логику которого нужно реализоватьtype Manager struct{}Решение
Заголовок раздела «Решение»Источник: VK / ВК (ВКонтакте) - 1 · 2 кв 2025
← ## Условие · Все задачи · Go · Как работает этот код? Что он выведет?… →