Skip to content

Latest commit

 

History

History
105 lines (70 loc) · 4.93 KB

README.md

File metadata and controls

105 lines (70 loc) · 4.93 KB

Задание №2

Необходимо создать сервис реализующий механизм загрузки изображений с автоматическим созданием миниатюр.

Сервис должен выполнять следующий сценарий:

  1. Пользователь загружает картинку используя метод API, например POST /uploads
  2. Сервер сохраняет загруженное изображение на диск и данные о нём в БД, после чего создает задачу в очереди на генерацию миниатюры
  3. Воркер-скрипт подключенный к очереди обрабатывает задачу, получая файл и создавая для него миниатюру, после чего сохраняет её на диск, а информацию о ней в БД
  4. Имеющуюся информацию о загруженных картинках и созданных для них миниатюрах сервер возвращает в отдельном методе, например /uploads/:id

Требования:

  1. Использовать PostgreSQL в качестве базы данных
  2. Использовать Nats JetStream в качестве инструмента для реализации очереди
  3. Размеры для генерации миниатюры должны быть конфигурируемы, в качестве тестовых значений можно использовать границы в 100 пикселей по ширине и высоте, ужимая картинку до данного размера по наибольшей стороне
  4. Для генерации миниатюр предполагается использование библиотеки, например 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 файл из проекта
  1. Скопировать docker-compose.yml в новую папку "postgresql"

  2. Выполнить в терминале команду

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"

alt text

Указав в Params -> "Key"="size" и "Value"="100"

alt text

  • Используя Postman, получить данные о всех изображениях и соответствующих им миниатюрах, отправив GET запрос
http://localhost:8080/get-data

alt text

где:

id - Уникальный идентификатор загруженного изображения

name - Название изображения

type - Формат изображения

width - Разрешение загруженного изображения (ширина)

height - Разрешение загруженного изображения (высота)

name_miniature - Название созданной миниатюры

width_miniature - Разрешение созданной миниатюры (ширина)

height_miniature - Разрешение созданной миниатюры (высота)

  • Используя Postman, получить данные о конкретном загруженном изображении и созданной для него миниатюре, отправив GET запрос
http://localhost:8080/uploads/id

где "id" - положительное целое число

  • Загруженные изображения и миниатюры будут сохраняться в папке "uploads"