Приложение построено по патерну MVC. Запуск происходит из index.js. В файле содержится обработка API express'ом, прослушивание порта и подключение к БД. В папке controllers находится тонкий слой контроллеров. Там же находится и middleware обработчика ошибок. Контроллеры принимают request и отправляют response. Тут же реализован механизм загрузки файла через потоки. Сделано это в целях предотвращения перегрузки памяти сервера. Сервисы (папка services) имеют в себе правила валидации и обработку данных, пришедших с клиента. Данные записываются в БД, она возвращает id записанного файла, или информацию по нему. Схемы БД и отношения таблиц друг к другу описаны в файле model.
Присутствует свой класс ошибки для разделения ошибок, вызванных непредвиденным поведением и ошибок, которые вызваны неправильным поведением клиента (ApiError). RunService это функция высшего порядка, для унификации вызовов валидации для всех возможных сервисов. Простым языком, что бы не писать в каждом сервисе одинаковый перехватчик ошибок.
https://superfilms.herokuapp.com/
cd webbylab
docker-compose up --build
cd webbylab
cd server
cp .env.sample .env
docker-compose up
npm start
cd ../client
npm start
cd ../server # опционально: запуск тестов
npm test # опционально: запуск тестов