Демо: http://nur-beejee.zzz.com.ua/
Уважаемая команда BeeJee, перед проверкой данного тестового задания прошу учесть информацию ниже.
Перед выполнением задания, мною был задан вопрос: Нужно вообще всё сделать на PHP? Включая построение таблицы задач, пагинацию, сортировку по полю, валидацию? Или же эти вещи надо/можно делать на JS, а на PHP сделать только бэкенд - получение запроса, сохранение задачи в БД, отправка ответа.
На что был получен ответ: Построение таблиц вы можете реализовать на фронтенде. Однако пагинация и т.д. должна быть однозначно на беке. Ведь не имеет смысла тянуть все данные из бд и обрабатывать их на фронте. А если их будет тысячи и больше? С другой стороны- если вы реализуете корректное апи и работу с бд- то можно использовать ваш подход.
Я сделал по второму предложенному вами варианту: реализовал корректное API в духе REST, и корректную, четкую работу с БД. Считаю данный подход максимально современным, а также в наибольшей мере демонстрирующим мои знания.
Другие мои комментарии после выполнения задания:
- В БД использованы индексы, и аккуратно подобраны типы значений. Используются индексы Foreign Key, для консистентности.
- Алгоритм проверки пароля приближен к реальному, основан на генерации хеша и сравнении с хранимым.
- Приложение выполнено по правилам REST: используются методы GET, POST, PATCH, DELETE. Приложение чётко разделено на Frontend и Backend (папка server/).
- Для проверки исходного кода фронтенда, пожалуйста смотрите в папку src/, а не public/out/ (так как используется TypeScript).
- (на что потратил 70% времени) Фронтенд сделан без библиотек и фреймворков, но я простыми средствами сделал что-то вроде React+Redux. В итоге получилась такая же надежная система в духе Unidirectional Data Flow. Из минусов: не мог себе позволить тратить время на правильный Change Detection, поэтому при изменении состояния (state) ре-рендерятся все компоненты.
- JQuery мною не используется (только Vanilla JS), и я бы не подключал его вовсе, но к сожалению он нужен для работы модального окна Bootstrap.
- Используются менеджеры зависимостей Composer и npm, система импорта классов PSR-4. Для копирования статических ассетов из папки node_modules/ используется Gulp.
- Попробуйте пагинацию - работает хорошо при любом количестве задач и страниц. То же самое с сортировкой.
- Экспортированный SQL находится в файле anurbol.sql в корне проекта.
- В коде почти нет комментариев, так как считаю что и нет сложных для понимания вещей. Более-менее сложная часть - самодельный фронтенд-движок, но для среднего TS/JS-разработчика, на мой взгляд, код сам себя объясняет
- Уже много после окончания задания, подумал, что, возможно, формальным упущением моей реализации является отсутствие M/Model в MVC, если подразумевается такая модель как например в Laravel/Kohana/CodeIgniter и т.д. Честно говоря просто забыл про этот момент, фокусируясь на выполнении тестового протокола. Но! В самом начале хотел сделать полноценный ORM с моделями Task/User/Session но в виду относительной простоты задания и лишь одним Relationship (Session::HasOne(User)) решил что это оверинжиниринг (цитата из задания: "Этому приложению не нужна сложная архитектура, решите поставленные задачи минимально необходимым количеством кода").