Сайт с задачами для программистов. Но не обычными, а очень сложными, решить которые очень трудно или даже невозможно. Чтобы попробовать решить задачу нужно заплатить (скажем 100 рублей), и пользователь получает возможность в течение 24 часов отправлять своё решение (код) на проверку автоматическими тестами.
Если решить задачу не получилось, 100 рублей откладываются в "фонд задачи". Если получилось, пользователь забирает все деньги из фонда (всё то, что заплатили пользователи, пытавшиеся решить задачу до него). Часть денег с каждой попытки также получает автор задачи. Модератор проверяет, что все участники процесса играют по правилам.
Используется JS, React и styled-components. На бэке node.js и mongodb.
Можно авторизоваться через гитхаб oauth, пользователи с полученной от гитхаба инфой складываются в монгу. Каждому пользователю ассайнится роль user (роли могут быть admin, moderator или user).
На главной странице можно посмотреть пагинированный список задач, у каждой задачи есть название (строка), описание (маркдаун), стоимость попытки, фонд и статус (не видимый для пользователя). Пользователи могут просматривать любые задачи в статусе PUBLISHED, а также создавать свои собственные.
Для того, чтобы создать задачу, пользователь заполняет специальную форму на отдельной странице. Созданная через форму задача переводится в статус DRAFT. Список созданных пользователем задач находится под списком всех задач. В любой момент времени автор задачи может открыть собственную задачу, посмотреть, отредактировать или удалить её.
Через специальное поле (группу полей) в форме редактирования задачи для неё создаются тесты. Каждый тест это JS код, который вместе с кодом задачи будет запущен в отдельном процессе. Каждый тест возвращает промис, который, если реджектнут, говорит о том, что тест провалился. Переданное с аргументом в реджекте сообщение показывается пользователю.
В форме создания задачи есть кнопка "опубликовать". Опубликованная задача переводится в статус ON_REVIEW. Эту задачу видят пользователи с ролью moderator или admin на специальной странице (об этом позднее). Переведенная в статус ON_REVIEW задача больше не может быть отредактировано автором в форме.
Есть отдельная страница, доступная только админам и модераторам. Админ видит на ней таблицу пользователей, и задач, модератор видит только таблицу задач. Каждая задача или пользователь могут быть открыты в отдельном окне. Вся инфа о задаче или пользователе может быть изменена. Также пользователь или задача могут быть удалены.
на экране задачи у пользователя (не автора задачи) будет возможность попробовать решить задачу. Для этого пользователь создаёт сущность Попытка. Попытка имеет статус, изначально он UNPAID. Пока что (для удобства тестирования) попытка сразу будет переводиться в статус PAID. Каждая попытка имеет отдельную страницу, содержимое которой зависит от статуса попытки.
Попытка в статусе PAID отображает сообщение "Оплата прошла успешно. Готовы начать?". Когда пользователь соглашается, попытка переводится в статус ON_AIR. Страница попытки в статусе ON_AIR содержит описание задачи и окно с редактором кода. При нажатии "отправить" код отправляется на сервер и прогоняется по тестам. Сообщение из первого упавшего теста возвращается пользователю.
Если все тесты прошли успешно, попытка и задача переводятся в статус SOLVED. Больше создавать попыток к этой задаче нельзя. Экран попытки содержит сообщение "Попытка успешна", а также пояснения о том, как вывести деньги (пока что этого не будет).
Попытки отображаются отдельной таблицей в админке. Доступна эта таблица модераторам и админам. Попытку можно перевести в статус verified, а затем в статус paid. Все попытки пользователя также доступны у него на главной странице в виде таблицы.
Если пользователь не справился с решением задачи за 24 часа, попытка автоматически переводится в статус FAILED.