(приступить к выполнению! (чеклист))
Задание рассчитано на 4-8 часов выполнения (при условии, что соискатель знаком с необходимыми технологиями, и ресёрч сводится к минимуму).
Использование фреймворков, библиотек или npm-модулей, написанных не Вами, не предполагается.
Использовать модули из стандартной поставки NodeJS нужно.
Сервер на NodeJS должен работать в качестве файлового сервера (выдавать файлы для работы Frontend-части) и принимать/отдавать данные по API (3 эндпоинта):
- POST для добавления нового сообщения
- POST для отправки следующего числа и получения среднего между ним и предыдущим в ответ
- GET для получения информации обо всех предыдущих числах и расчётах
Три страницы:
- О себе. Статический HTML с краткой информацией - несколько предложений, фотография.
- Доска сообщений с рендером предыдущих на стороне сервера (SSR) и формой добавления нового сообщения.
- Средние числа. Ввод числа в простую форму, отправка запроса на сервер, получение среднего числа в ответ, вывод результата над предыдущими. Рендер на стороне клиента (CSR).
На всех страницах стили - предельно простой легко читаемый минимализм. Без изысков. Адаптив не нужен, но информация должна помещаться на экране по умолчанию.
- при входе на страницу сервер формирует и выдаёт HTML-разметку с включением данных уже полученных сообщений (на старте сервера там одно захардкоденное сообщение)
- каждое сообщение на экране состоит из значений полей
text
иauthor
- кроме прошлых сообщений на странице находится форма размещения нового сообщения c теми же полями и кнопкой "разместить сообщение"
- при отправке сообщения выполняется обновление страницы после которого новое сообщение должно появиться рядом с предыдующими (первым или последним - в зависимости от порядка сортировки)
- сервер может хранить сообщения в массиве в памяти и/или (необязательно) в файле
- пользователь вводит число в форму, сам отмечает, если число отрицательное и/или дробное (например галочками)
- при нажатии кнопки "отправить и получить среднее" выполняется отправка запроса к серверу на второй API-эндпоинт
- запрос и обработка ответа на клиенте посредством JavaScript без перезагрузок страницы
- сервер в ответ присылает предыдущее число, последнее принятое от пользователя и среднее между ними
- клиент выводит их под формой новой строкой (из неё должно быть понятно, где что)
- данные предыдущих расчётов сдвигаются вниз
- при входе/обновлении страницы приходящая от сервера HTML-разметка не содержит данных о предыдующих расчётах...
- сразу после построения DOMa клиент отправляет запрос на третий эндпоинт, по получении ответа на который под формой выводится история предыдущих присланных и вычисленных чисел
- сдача работы в виде ссылки на репозиторий на GitHub или аналог, убедительная история коммитов
- все три страницы содержат ссылки для удобного перехода на две другие (и переход выполняется независимо от адреса локального или на хостинге) и на свой репозиторий проекта
- сервер должен отдавать клиенту только публичные файлы (файлы бэкенда выдаваться не должны)
- сервер не должен падать при запросах на получение отсутствующих файлов или на непредусмотренные API-эндпоинты
- страница 404, адекватно дающая понять, что запрошенного файла нет, стили на ней не принципиальны, но если они есть, то должны быть включены в разметку и не требовать отдельных запросов
- отличимый префикс API-эндпоинтов
- первый API-эндпоинт, принимающий новое сообщение, фиксирует дату его получения по серверному времени
- второй API-эндпоинт, принимающий число и возвращающий среднее, учитывает знак и/или дробную часть числа, только если соответствующие флаги в форме были установлены, и отметки об этом были в пришедшем на сервер запросе (иначе берёт по модулю / отбрасывает дробную часть)
- третий API-эндпоинт, отдающий информацию о предыдущих вычислениях, делает это в дружественном, понятном программистам виде (например, используя отформатированный JSON с ссответствующим нэймингом ключей объектов)
- сервер не должен падать при некорректных данных / запросах с неправильными методами, вместо этого он должен отдавать предусмотренный отрицательный ответ без или с объяснением причин
- деплой онлайн на Heroku (бесплатно) или любом другом сервисе, позволяющий проверить работу без скачивания/запуска у себя локально
- учёт времени, затраченного на выполнение
- фидбек по тестовому заданию, что было сложно, легко, интересно
(вне рамок времени, указанного вначале)
- вывод сообщений с датами размещения в формате привычном для посетителей сайтов
- работающие кнопки удаления сообщений с перезагрузкой страницы
- валидация форм в браузере, проверка обязательных полей
- валидация данных, приходящих на POST-эндпоинты
- санитайзинг полей добавляемого сообщения на сервере и/или вывод их содержимого простым текстом (а не тэгами)
- фон сообщений разных авторов разными оттенками, соответствующими указанному имени автора и не меняющимися при перезагрузке страницы
- вывод статистики вычислений (максимальное, минимальное числа, амплитуда передаваемых чисел)
- имитация сложности вычислений (небольшая искусственная задержка ответа сервера с отображением прелоадера)