- TaskService
- CreateTask - создать новую задачу. Также создаётся запись в таблице task_logs о этой задаче.
- GetTask - получить задачу по id. Если задача уже есть в кэше, то она и возвращается, иначе задача берётся из БД, сохраняется в кэш и возвращаетя пользователю.
- AssignTask - закрепить задачу за пользователем
- SetParentTask - назначить задаче родительскую задачу
- TaskCommentService
- CreateComment - создать комментарий к конкретной задаче
- GetComments - получить все комментарии по задаче. Можно задать параметр получения всех комментариев к задаче( удалённых комментариев в том числе) или только действительных комментариев. По требованию в тз пять самых новых сообщений записываются в кэш.
- UpdateTaskComment - изменить сообщение в конкретном комментарии
- SetDeleted - отметить комментарий удалённым (объект сохраняется в системе, а также заполняется атрибут deleted_at временем удаления )
Одним из требований к заданию также было реализовать свою "на коленке" реализацию rate limiter для ограничении числа запросов в минуту от конкретного пользователя, с допущением, что ip пользователя можно получить из запроса Rate limiter работает по алгоритму "текущего ведра" (Token Bucket Algorithm) и для хранения информации о запросах используется Redis.
RateLimiterInterceptor перехватывает запрос и передаёт информацию о пользователе в RateLimiterService, где проверяется не превышен ли лимит.
- PostgreSQL
- TaskRepository - основновной репозиторий отвечающий за создание задач, получение задач и т.д.
- TaskCommentRepository - репозиторий отвечающий за комментарии к задачам
- TaskLogRepository - репозиторий для логирования изменений в задачах
- UserRepository - репозиторий для работы с пользователями
- Redis
- RateLimiterRepository - репозиторий для доступа к информации о запросах от пользователя в минуту
- TakenTaskRepository - репозиторий для доступа к кешу для хранения, получения данных о взятых тасках
- UserScheduleRepository - репозиторий для доступа к пользовательскому расписанию