ТЗ-ёпта на png.sijeko.ru

Данный официальный документ содержит ТЗ-ёпту для проекта https://png.sijeko.ru/

Этот проект является рабочим инструментом, который используется ежедневно.

Список используемых терминов и сокращений

Если вы не понимаете какого-то термина или сокращения в данном ТЗ-ёпте, оно предназначено не для вас, до свидания.

Архитектура

Приложение представляет собой типичное клиент-серверное взаимодействие с использованием принципа REST.

Клиент

Приложение на Ангуляре, Реакте или Бекбоне, я хуй ебу.

Главная страница: перетягиваем файлы изображений в бразуер, для каждого создаётся очередь оптимизации. Картинка добавляется в начало списка заблюренным кружком, который также является и круглым прогресс-баром. Раз в одну-две секунды опрашиваются перетянутые файлы, чтобы узнать прогресс выполнения. Когда оптимизация завершена (прогресс 100%), видим ссылку на изображение и эскиз. При возможности, добавить также ссылку на скачивание WebP-версии изображения.

Служебные страницы (статика):

  • условия использования;
  • контакты;

Необходимо использовать History API, чтобы в урлах не было решёток.

Сервер

Базовый урл: /api/v1

К базовому урлу добавляются все нижеперечисленные урлы HTTP-запросов (GET /imagesGET /api/v1/images).

Серверное API умеет возвращать данные в форматах JSON и XML. Форматом ответа можно управлять с помощью заголовка запроса Accept:

  • Accept: application/json — выдать данные в формате JSON;
  • Accept: application/xml — выдать данные в формате XML.

По умолчанию возвращается JSON, он же указан в примерах.

Целые числа, если не указано иное, являются беззнаковыми 64-разрядными целыми числами.

GET /images

Получить последние оптимизированные изображения.

В случае успешной обработки запроса возвращает 200 OK и массив вида:

[
	{
		//… Объект вида `GET /image/@id`
	},
	{
		//…
	}
	// …
]

По умолчанию возвращает 24 последних файла. Если нужно получить другое количество, необходимо воспользоваться GET-параметром count. Например, для получения 12 последних файлов: GET /image?count=12.

POST /images

Добавить изображение в очередь задач.

Поддерживаются форматы: PNG, BMP, GIF, PNM, TIFF.

Поскольку оптитимизация — долгосрочный процесс, запрос не ждёт её завершения, а сразу возвращает идентификатор очереди оптимизаци, он же — идентификатор изображения (@id).

При успешной поставновке изображения в очередь, возвращается код 201 Created, с заголовками X-Id и Location. Например:

201 Created
X-Id: asdf123w
Location: /api/v1/image/asdf123w

HEAD /images/@id

Проверить изображение в очереди. Возвращает прогресс выполнения оптимизации, либо урл файла, если он готов.

Пример незавершённого процесса (66,7%):

X-Progress: 66.7

Пример завершённого процесса (100%):

X-Progress: 100
Location: /api/v1/image/asdf123w

GET /images/@id

Получить изображение.

При успешном запросе возвращает 200 OK и объект:

{
	"id": "asdf123w",           // Идентификатор
	"name": "имя файла.png",    // Имя исходного файла
	"size": 66777,              // Размер оптимизированного файла в байтах
	"width": 66777,             // Ширина изображения в пикселях
	"height": 66777,            // Высота изображения в пикселях
	"mime": "image/png",        // MIME-тип файла
	"original": 77666,          // Размер исходного файла в байтах
	"ratio": 0.859797,          // Коэффициент сжатия (size / original)
	"success": true,            // Была ли оптимизация успешной (size < original)
	"webp": true,               // Удалось ли получить WebP-версию файла
	"webpSize": 6777,           // Размер WebP-файла (если удалось его получить)
	"time": 66,                 // Время, затраченное на оптмизицацию, в секундах
	"createdAt": 66,            // Таймштамп начала оптимизации
	"optimizedAt": 66,          // Таймштамп завершения оптимизации
	"url": "/i/asdf123w.png",   // Ссылка на просмотр файла
	"downloadUrl": "66.png",    // Ссылка на скачивание файла
	"webpUrl": "66.png.webp",   // Ссылка на скачивание WebP-файла (если он есть)
	//…                         // Возможно, ещё какая-нибудь служебная информация
}

Возможности расширения

  • Авторизация пользователей, чтобы была видна история своих файлов.
  • Платные аккаунты, чтобы снять ограничение на максимальный размер файла в бесплатном аккаунте.