/koa_rtr

Primary LanguageJavaScript

Задание ниже направлено на проверку владения базовыми модулями NodeJS, поэтому при их выполнении желательно избегать использования сторонних библиотек. Но т.к. требования находятся в ранней стадии разработки, и могут содержать ошибки или неточности, то разрешается использование сторонних библиотек, если выполнение задание без них видится затруднительным или невозможным.

Описание сервиса
Требуется написать сервис, исполняющее роль примитивного хранилища файлов, который бы позволял сохранять файлы по имени через HTTP в файловую систему сервера и скачивать определенный файл, зная имя файла.

Сервис состоит из нескольких модулей:

Хранилище файлов
Адаптер для локальной файловой системы
Хранилище мета-данных
HTTP API
Система мониторинга файловой системы*
Желательно придерживаться указанной структуры приложения. Разбиение на модули позволяет заменить, например, драйвей локальной файловой системы на модуль, посылающий файлы на удаленный FTP-сервер, или HTTP-апи - на webSocket-апи

Хранилище файлов
Модуль позволяет сохранять и получать содержимое файлов по имени файла при помощи модуля-адаптера (см ниже). Сохранение и получание содержимого файлов должно производиться при помощи потоков. Функция сохранения файла принимает вместе с потоком имя файла, которое будет служить его идентификатором. Функция получения содержимого файла принимает имя файла.

При сохранении файла, его мета-данные (имя, mime type, размер) записываются в хранилище мета-данных.

Адаптер для локальной файловой системы
Модуль позволяет сохранять и получать содержимое файлов из определенной директории (например ./data в корневой папке проекта).

Для чтения и записи используются функции fs.createWriteStream и fs.createReadStream соответственно.

Модуль хранения мета-данных.
Для хранения мета-данных файла (имя, mime type, размер) можно использовать текстовый файл или одну из баз данных: sqlite, redis, mongodb и т.п.

Модуль HTTP API
Для реализации HTTP API можно использовать как стандартный модуль http, так и библиотеку типа ExpressJS

GET /files/{filename}
Метод должен возвращать файл с корректными заголовками Content-Length и Content-Type