Сделать приложение на Ruby с JSON RESTful API.
Требования:
-
Пользователь оставляет объявление (announcement) о работе, а другие пользователи могут на это объявление откликаться (response) с ценой («я могу за столько-то»).
-
Автор объявления может отменить (cancel) его. В этом случае все отклики должны быть автоматически отклонены (declined).
-
Автор может принять (accept) один из откликов, тогда другие отклики должны быть отклонены (declined), а объявление стать закрытым (closed).
-
На закрытое или отмененное объявление нельзя оставлять отклики.
-
Пользователь оставивший отклик может сам свой отклик отменить (cancel). В этом случае статус отклика должен быть cancelled, а не declined.
-
Также в API должны быть методы для получения своего объявления со всеми откликами и получения списка всех активных объявлений (без откликов).
Сущности
-
Announcement
(id
,user_id
,description
,status
),description
— текст, не более 1000 символов; -
Response
(id
,announcement_id
,user_id
,price
,status
),price
- int, цена в рублях, от 100 до 10000; -
User
(id
).
Статусы объявления
active
- активно, можно откликаться;cancelled
- отменено автором;closed
- закрыто (есть принятый отклик).
Статусы отклика на объявление
pending
- новый отклик;cancelled
- отменен автором отклика;declined
- отменен автором объявления (или автоматически, если объявление закрыто или отменено);accepted
- принято автором объявления.
Ограничения
- откликаться можно только на активное объявление;
- если автор объявления отклонил чей-то отклик, то повторно откликаться нельзя;
- если автор отклика отменил свой отклик, то он может повторно откликнуться на это же объявление.
Аутентификация
В API вместо полноценной аутентификации, можно передавать user_id
в заголовках запроса.
Также можно сделать эндпоинт для создания пользователя для тестов: POST/users, который будет создавать нового пользователя и возвращать его id
.
Тесты
Обязательны.
Время на выполнение задания
Перед тем, как выполнять задание, оцените время на выполнение (без учета времени на настройку проекта). Напишите в README проекта оценку и фактическое время выполнения. Только честно :)