“Картошка” - это отечественный электронный кошелек, который позволяет оплачивать услуги, делать денежные переводы в рамках системы. Ваша задача написать серверную часть, удовлетворяющую “Картошке”
Основные поля пользователя:
- Фамилия
- Имя
- Отчество (опционально)
- Номер мобильного телефона
- Адрес электронной почты
- Дата рождения
- Пароль
ФИО допускается только буквы русского алфавита. Первые буквы - заглавные. Не более 50 символов по отдельности. Номер мобильного телефона - Формат телефона: 11 цифр, начинается с '7' К номеру телефона может быть привязан только один пользователь. Адрес электронной почты - стандартная маска. К электронной почте может быть привязан только один пользователь. Дата рождения - дата в ISO 8601 Особые требования к паролю:
- от 8 до 64 символов
- Только латинские символы, цифры, знаки только !?
- Обязательно наличие минимум 1 буквы верхнего и нижнего регистра, цифры и знака.
- Хранение исключительно в БД, в хешированном виде, алгоритм - на усмотрение разработки.
К требованиям хранения пользователей относится хранение временной метки (timestamp) создания и обновления полей пользователя. Пользователя запрещено удалять из БД
- Создание пользователя
- Получение пользователя
- Редактирование полей пользователя (только ФИО, дата рождения)
Пользователь имеет неограниченное число сессий. Сессия принадлежит только одному пользователю. Сессии имеет ограниченный срок действия. В БД необходимо хранить все сессии: активные и "протухшие" по времени или выходу из сессии
- Создание сессии (вход в аккаунт)
- Получение информации о сессии
- Выход из сессии (выход из аккаунта)
Время жизни сессии можно настроить при перезапуске приложения
Кошельком владеет только один пользователь. Изначально каждый пользователь имеет 100 д.е. в кошельке. Основные поля кошелька:
- Номер - целое число.
- Баланс, в денежных единицах (далее д.е.). - целое число, меньше или равно нулю.
- Получение информации о кошельке
Реализовать функционал рулетки (дополнительный эндпоинт):
- HESOYAM: с 25% шансом пользователь получает на счёт 10 д.е.
Выражает оплату за услугу между двумя пользователями: продавцом и потребителем. Продавец выставляет потребителю счёт на оплату. После выставления счёта потребитель может его оплатить по номеру. Частичная оплата недопустима. Пока счёт не оплачен, он может быть отменён получателем
Основные поля счёта на оплату (услуги):
- Номер счёта - UUID, идентифицирует счёт
- Стоимость услуги - целое число, больше нуля
- Идентификатор отправителя (продавца, тот кто выставил счёт)
- Идентификатор получателя (покупателя, тот кто оплачивает счёт)
- Комментарий (опционально)
- Статус - Оплачен/Неоплачен/Отменён
- Дата и время выставления счёта
Комментарий не более 250 символов, строка произвольная. Дата выставления счёта в ISO 8601 формате.
- Создание счёта на оплату
- Отмена счёта на оплату отправителем
- Оплата счёта на оплату получателем
- Получение информации о счёте на оплату
- Получение всех выставленных счетов
- Получение всех счетов к оплате
-
Реализовать дополнительные операции:
- Получение наиболее давнего неоплаченного счёта к оплате
- Получение общей задолженности по неоплаченным счетам к оплате
-
Добавить фильтры к операциям 5-6. Например:
- По статусам счёта (оплачен/неоплачен/отменён)
- По датам выставления счёта с/по
- По идентификатору
Основные поля счёта на денежного перевода:
- Дата и время перевода
- Сумма
Переводы могут быть двух типов:
- Перевод пользователю
- Оплата за услугу
Перевод совершается в д.е. Выполняется сразу после его создания. Пользователь может совершить перевод в д.е. не более, чем есть у него в кошельке. К требованиям хранения переводов относится хранение временной метки (timestamp) создания переводов.
Перевод пользователю можно осуществить:
- По номеру телефона
- По номеру кошелька
Оплатить услугу можно только по её номеру
- Получение информации о переводе
- Создание (оно же выполнение) денежного перевода
- Получение истории переводов: требуется возможность фильтрации по: типу (входящий/исходящий), статусу (оплачен/не оплачен), пользователю-получателю
- При работе с ISO не изобретайте велосипед, используйте org.springframework.format.annotation.DateTimeFormat.ISO.*