Необходимо создать сервис реализующий механизм загрузки изображений с автоматическим созданием миниатюр.
Сервис должен выполнять следующий сценарий:
- Пользователь загружает картинку используя метод API, например POST /uploads
- Сервер сохраняет загруженное изображение на диск и данные о нём в БД, после чего создает задачу в очереди на генерацию миниатюры
- Воркер-скрипт подключенный к очереди обрабатывает задачу, получая файл и создавая для него миниатюру, после чего сохраняет её на диск, а информацию о ней в БД
- Имеющуюся информацию о загруженных картинках и созданных для них миниатюрах сервер возвращает в отдельном методе, например /uploads/:id
Требования:
- Использовать PostgreSQL в качестве базы данных
- Использовать Nats JetStream в качестве инструмента для реализации очереди
- Размеры для генерации миниатюры должны быть конфигурируемы, в качестве тестовых значений можно использовать границы в 100 пикселей по ширине и высоте, ужимая картинку до данного размера по наибольшей стороне
- Для генерации миниатюр предполагается использование библиотеки, например libvips https://github.com/libvips/libvips , и её wrapper для GoLang - https://github.com/davidbyttow/govips
- Склонировать репозиторий
git clone https://github.com/Yury132/Golang-Task-2.git
- Установить PostgreSQL в Docker контейнер, используя docker-compose.yml файл из проекта
-
Скопировать docker-compose.yml в новую папку "postgresql"
-
Выполнить в терминале команду
docker compose up
- Подключиться к базе данных PostgreSQL (Например, через DBeaver)
POSTGRES_DB: mydb
POSTGRES_USER: root
POSTGRES_PASSWORD: mydbpass
Port: 5432
Host: localhost
- Установить NATS в Docker контейнер командами
docker pull nats:latest
docker run -p 4222:4222 -ti nats:latest -js
- Запустить веб-приложение командой
go run cmd/main.go
- Используя Postman, загрузить изображение, отправив POST запрос
http://localhost:8080/uploads?size=100
Указав в Body -> form-data -> "Key"="file" и "Value"="image.png"
Указав в Params -> "Key"="size" и "Value"="100"
- Используя Postman, получить данные о всех изображениях и соответствующих им миниатюрах, отправив GET запрос
http://localhost:8080/get-data
где:
id - Уникальный идентификатор загруженного изображения
name - Название изображения
type - Формат изображения
width - Разрешение загруженного изображения (ширина)
height - Разрешение загруженного изображения (высота)
name_miniature - Название созданной миниатюры
width_miniature - Разрешение созданной миниатюры (ширина)
height_miniature - Разрешение созданной миниатюры (высота)
- Используя Postman, получить данные о конкретном загруженном изображении и созданной для него миниатюре, отправив GET запрос
http://localhost:8080/uploads/id
где "id" - положительное целое число
- Загруженные изображения и миниатюры будут сохраняться в папке "uploads"