Система управления товарами для площадки электронной коммерции.
- Регистрация пользователя с подтверждением через почту
- Авторизация пользователя с использованием Spring Security и JWT
- Разграничение функциональности по ролям (USER, ADMIN)
- Поддержка входа и выхода с нескольких устройств.
- Возможность создания/редактирования/удаления товаров и внутренней валюты администратором
- Приобретение внутренней валюты со списанием средств ($) у пользователя
- Счета пользователя в разной внутренней валюте (gold:100; silver:50...)
- Приобретение товаров за внутреннюю валюту
- Пользовательский инвентарь для хранения товаров
- Выдача исключений при ошибках
- События (events и listeners)
- Миграция баз данных с помощью Flayway
- Запуск MYSQL сервера и проекта с помощью Docker
- Документация Swagger Docs
- Docker
- Git
git clone https://github.com/chunarevsa/StoreRestApi.git
cd StoreRestApi
spring.datasource.username
spring.datasource.password
MYSQL сервер запускается с параметром ports:3306:3306
База данных websitechsa
создаётся автоматически
spring.mail.username
spring.mail.password
docker-compose -f docker-compose.dev.yml up --build
Проект запускается с параметром server.port:8088
- Java
- Maven
- MYSQL
- Git
git clone https://github.com/chunarevsa/StoreRestApi.git
cd StoreRestApi
Необходимо запустить MYSQL сервер с портом 3306
spring.datasource.username
spring.datasource.password
Переключить spring.datasource.url
с "Для Docker" на "Без Docker"
spring.mail.username
spring.mail.password
./mvnw spring-boot:run
Проект запускается с параметром server.port:8088
База данных websitechsa
создаётся автоматически
Документация доступна по адресу:
http://localhost:8088/swagger-ui.html
Для удобства запросы из Postman
доступны в файле
Website.postman_collection.json
Регистрация
curl --location --request POST 'localhost:8088//auth/register' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "[email protected]",
"password": "test1",
"registerAsAdmin": true
}'
registerAsAdmin
- будет ли являться пользователь администраторомemail
иusername
должны быть уникальными
Подтверждение регистрации
curl --location --request GET 'localhost:8088/auth/registrationConfirmation?token=bcbf8764-dbf2-4676-9ebd-2c74436293b9' \
- Выдаётся исключение, если
token
некорректный
Авторизация
curl --location --request POST 'localhost:8088/auth/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "[email protected]",
"password": "test1",
"deviceInfo": {
"deviceId": "D1",
"deviceType": "DEVICE_TYPE_ANDROID",
"notificationToken": "N1"
}
}'
- Авторизация осуществляется через
email
иpassword
- Необходимо указать информацию об устройстве
- Поддерживается авторизация с нескольких устройств
Logout
curl --location --request POST 'localhost:8088/user/logout' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA' \
--header 'Content-Type: application/json' \
--data-raw '{
"deviceInfo": {
"deviceId": "D1",
"deviceType": "DEVICE_TYPE_ANDROID",
"notificationToken": "N1"
}
}'
- Logout c конкретного устройства
Пополнение счёта пользователя
curl --location --request POST 'localhost:8088/admin/addmoney?amount=1000&username=admin' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Добавляет пользователю средства
$
, на которые он может приобретать внутреннюю валюту, чтобы покупать товар - Выдаётся исключение, если такого пользователя не существут
Добавление новый валюты
curl --location --request POST 'localhost:8088/currency/add' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "gold",
"cost": "10",
"active": "true"
}'
- Доступно только
ADMIN
- Название
title
валюты должно быть уникальным - Выдаётся исключение, если данные введены некорректно
Изменение валюты
curl --location --request POST 'localhost:8088/currency/gold/edit' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "gold",
"cost": "12",
"active": "true"
}'
- Доступно только
ADMIN
- Выдаётся исключение, если такой валюты нет
- Выдаётся исключение, если данные введены некорректно
Удаление валюты
curl --location --request POST 'localhost:8088/currency/gold/delete' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Доступно только
ADMIN
- Выдаётся исключение, если такой валюты нет
Получение списка всех валют
curl --location --request GET 'localhost:8088/currency/all' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Разное предоставление информации в зависимости от роли (ADMIN, USER)
USER
- Получение списка активных валют. Выдаётся исключение, если таких нетADMIN
- Получение списка всех валют. Выдаётся исключение, если валюты отсутствуют
Получение информации о валюте
curl --location --request GET 'localhost:8088/currency/gold' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Разное предоставление информации в зависимости от роли (ADMIN, USER)
USER
- Получение краткой информации о валюте. Выдаётся исключение, если она не активна или отсутствуетADMIN
- Получение расширенной информации о валюте. Выдаётся исключение, если такая валюта отсутствует
Покупка валюты
curl --location --request POST 'localhost:8088/currency/buy?title=gold&amount=100' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Выдаётся исключение, если валюта неактивна или отсутствует
- Выдаётся исключение, если у пользователя недостаточно средств
$
для покупки указанного количества валютыamount
- Валюта добавлется пользователю в
account
. Если такой валюты у пользователя ещё не было - создаётся новый счёт для валюты
Добавление нового товара
curl --location --request POST 'localhost:8088/item/add' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Ломик Гордона Фримена",
"type": "Weapon",
"description": "Cool weapon ",
"active": "true",
"prices": [
{
"cost": "5",
"currency": "gold",
"active": "true"
},
{
"cost": "50",
"currency": "silver",
"active": "true"
}
]
}'
- Доступно только
ADMIN
- Товар создаётся, как минимум, с одной ценой во внутренней валюте
- У товара может быть только одна цена в одной валюте
- Выдаётся исключение, если цена указана в отсутствующей валюте
- Выдаётся исключение, если цены и товары введены некорректно
Добавление новой цены товару
curl --location --request POST 'localhost:8088/item/1/prices/add' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA' \
--header 'Content-Type: application/json' \
--data-raw '{
"cost": "10",
"currency": "silver",
"active": "true"
}'
- Доступно только
ADMIN
- Выдаётся исключение, если цена указана в отсутствующей валюте
- Выдаётся исключение, если цены введены некорректно
- Выдаётся исключение, если у товара уже есть цена в такой валюте
Изменение товара
curl --location --request POST 'localhost:8088/item/1/edit' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Легендарный плащ",
"type": "skin",
"description": "обычный плащ",
"active": "true"
}'
- Доступно только
ADMIN
- Выдаётся исключение, если данные о товаре введены некорректно
Изменение цены товара
curl --location --request POST 'localhost:8088/item/price/1/edit' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA' \
--header 'Content-Type: application/json' \
--data-raw '{
"cost": "10",
"currency": "silver",
"active": "true"
}'
- Доступно только
ADMIN
- Выдаётся исключение, если цена указана в отсутствующей валюте
- Выдаётся исключение, если данные о цене введены некорректно
- Выдаётся исключение, если у товара уже есть цена в такой валюте
Удаление товара
curl --location --request POST 'localhost:8088/item/1/delete' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Доступно только
ADMIN
- Выдаётся исключение, если такой товар отсутствует
Получение списка всех товаров
curl --location --request GET 'localhost:8088/item/all' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Разное предоставление информации в зависимости от роли (ADMIN, USER)
USER
- Получение списка активных товаров. Выдаётся исключение, если таких нетADMIN
- Получение списка всех товаров. Выдаётся исключение, если товары отсутствуют
Получение информации о товаре
curl --location --request GET 'localhost:8088/item/1' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Разное предоставление информации в зависимости от роли (ADMIN, USER)
USER
- Получение краткой информации о товаре. Выдаётся исключение, если он неактивен или отсутствуетADMIN
- Получение расширенной информации о товаре. Выдаётся исключение, если такой товар отсутствуют
Получение всех цен товара
curl --location --request GET 'localhost:8088/item/1/prices' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Выдаётся исключение, если такой товар отсутствует
- Разное предоставление информации в зависимости от роли (ADMIN, USER)
USER
- Получение списка цен с краткой информацией. Выдаётся исключение, если они не активныADMIN
- Получение списка цен с расширенной информацией.
Покупка товара
curl --location --request POST 'localhost:8088/item/1/buy?currencytitle=gold&amountitem=2' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Выдаётся исключение, если товар неактивен или отсутствует
- Выдаётся исключение, если цена товара в такой валюте неактивна или отсутствует
- Выдаётся исключение, если у пользователя недостаточно валюты
gold
для покупки указанного количества товаровamountitem
- Валюта
gold
списывается соaccount
- Товар добавляется пользователю в инвентарь
inventory
. Если такого товара у пользователя ещё не было - создаётся новая ячейкаinventoryUnit
Свой профиль
curl --location --request GET 'localhost:8088/user/profile' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Получение информации о своём профиле, балансе
$
и счетахaccounts
Просмотр своего инвентаря
curl --location --request GET 'localhost:8088/user/profile/inventory' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Получение информации о своём инвентаре
inventory
Просмотр профиля любого пользователя
curl --location --request GET 'localhost:8088/user/admin' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Выдаётся исключение, если такой пользователь отсутствует
- Получение краткой информации о другом пользователе
Получение списка всех пользователей
curl --location --request GET 'localhost:8088/user/admin' \
--header 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjM5Mjk2NTEwLCJleHAiOjE2NDE4ODg1MTAsImF1dGhvcml0aWVzIjoiUk9MRV9VU0VSLFJPTEVfQURNSU4ifQ.v-EYaLqelzIn0emvlRPTzg7LIA4-y-Q0zsa9NREAJvTmh38gugeN0WIdbAQMKI10ql87fs9A4EncNeH3WydLdA'
- Доступно только
ADMIN
- Получение списка с краткой информацией о всех пользователях