diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index e934c9c..596d216 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -27,7 +27,7 @@ jobs: cd frontend && flutter build apk --release - name: Upload APK artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: android-apk path: frontend/build/app/outputs/flutter-apk/app-release.apk @@ -45,7 +45,26 @@ jobs: java-version: '17' distribution: 'temurin' cache: 'gradle' - + + - name: Grant execute permission for gradlew + run: cd backend && chmod +x gradlew + + - name: Set up PostgreSQL + uses: harmon758/postgresql-action@v1 + with: + postgresql version: '14' + postgresql db: ${{ secrets.POSTGRES_DB }} + postgresql user: ${{ secrets.POSTGRES_USER }} + postgresql password: ${{ secrets.POSTGRES_PASSWORD }} + + - name: Export DB secrets to environment + run: | + echo "DB_HOST=localhost" >> $GITHUB_ENV + echo "DB_PORT=5432" >> $GITHUB_ENV + echo "DB_NAME=${{ secrets.POSTGRES_DB }}" >> $GITHUB_ENV + echo "DB_USER=${{ secrets.POSTGRES_USER }}" >> $GITHUB_ENV + echo "DB_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}" >> $GITHUB_ENV + - name: Build with Gradle run: | cd backend && ./gradlew build @@ -55,7 +74,7 @@ jobs: cd backend && docker build -t cardly-backend . - name: Upload backend artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: backend-build path: backend/build/libs diff --git a/Documentation/Diagrams/Activity diagram.png b/Documentation/Diagrams/Activity diagram.png new file mode 100644 index 0000000..06b2040 Binary files /dev/null and b/Documentation/Diagrams/Activity diagram.png differ diff --git a/Documentation/Diagrams/Deployment.png b/Documentation/Diagrams/Deployment.png new file mode 100644 index 0000000..e64f81e Binary files /dev/null and b/Documentation/Diagrams/Deployment.png differ diff --git a/Documentation/Diagrams/ER.png b/Documentation/Diagrams/ER.png new file mode 100644 index 0000000..78a8fb4 Binary files /dev/null and b/Documentation/Diagrams/ER.png differ diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.png" "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.png" new file mode 100644 index 0000000..b4e3a6f Binary files /dev/null and "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.png" differ diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.svg" "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.svg" new file mode 100644 index 0000000..26e8f3a --- /dev/null +++ "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.svg" @@ -0,0 +1,4 @@ + + + +
alt
alt
Данные введены некорректно
Данные введены некорректно
Данные введены корректно
Данные введены корректно
Неверный формат ввода данных, повторите попытку
Неверный формат ввода данных, повторите попытку
Клиент
Клиент
Сервер
Сервер
Пользователь
Пользователь
База данных
База данных
Облачное хранилище
Облачное хранилище
Запуск приложения
Запуск приложения
Открытие приложения
Открытие приложения
Запрос на открытие приложения
Запрос на открытие приложения
Запрос необходимых данных для загрузки начальной страницы
Запрос необходимых данных для загрузки начальной страницы
Запуск приложения
Запуск приложения
Возврат данных для загрузки домашней страницы
Возврат данных для загрузки домашней страницы
Нажатие кнопки войти при нажатии на профиль или на других страницах, предлагающих возможность входа
Нажатие кнопки войти при нажатии на профиль или на других страницах, предлагающих возможность входа
Вход
Вход
Открытие страницы "войти"
Открытие страницы "войти"
Ввод данных, нажатие кнопки войти
Ввод данных, нажатие кнопки войти
Проверка корректности формата введенных данных
Проверка корректности формата введенных данных
Передача данных формы
Передача данных формы
Запрос на проверку данных
Запрос на проверку данных
Возврат результатов поиск
Возврат результатов поиск
возврат результатов поиска
возврат результатов поиска
alt
alt
Данные существуют в БД
Данные существуют в БД
Данные остутсвуют в БД
Данные остутсвуют в БД
Неверно введен логин или пароль
Неверно введен логин или пароль
Возврат на страницу на который была нажата кнопка "войти"
Возврат на страницу на который была нажата кнопка "войти"
alt
alt
Данные введены некорректно
Данные введены некорректно
Данные введены корректно
Данные введены корректно
Неверный формат ввода данных и(или) пароли не совпадают, повторите попытку
Неверный формат ввода данных и(или) пароли не совпадают, повторите попытку
Регистрация
Регистрация
Открытие страницы "регистрация"
Открытие страницы "регистрация"
Ввод данных, нажатие кнопки войти
Ввод данных, нажатие кнопки войти
Проверка корректности формата введенных данных и совпадения паролей
Проверка корректности формата введенных данных и совпадения паролей
Передача email из формы
Передача email из формы
Запрос на поиск полученного email
Запрос на поиск полученного email
Возврат результатов поиска email
Возврат результатов поиска email
Возврат результатов, сервер генерирует письмо с кодом и отправляет на email, если emaila нет в БД
Возврат результатов, сервер генерирует письмо с кодом и отправляет на email, если emaila нет в БД
alt
alt
Данные существуют в БД
Данные существуют в БД
Данные остутсвуют в БД
Данные остутсвуют в БД
Переход  на страницу "подтверждение email"
Переход  на страницу "подтверждение email"
Аккаунт с данным email уже существует
Аккаунт с данным email уже существует
Нажатие кнопки зарегистрироваться на странице входа
Нажатие кнопки зарегистрироваться на странице входа
alt
alt
Код неверный
Код неверный
Код верный
Код верный
Переход  на предыдущую страницу (не считая страницы входа)
Переход  на предыдущую страницу (не считая страницы входа)
Код неверный, вернуться на страницу входа или выслать новый код
Код неверный, вернуться на страницу входа или выслать новый код
Ввод кода подтверждения, нажатие кнопки зарегистрироваться
Ввод кода подтверждения, нажатие кнопки зарегистрироваться
Проверка корректности введенного кода
Проверка корректности введенного кода
Перенаправление данных
Перенаправление данных
Добавление данных пользователя в БД
Добавление данных пользователя в БД
Данные успешно добавлены
Данные успешно добавлены
Возвращение результатов
Возвращение результатов
alt
alt
Данные введены некорректно
Данные введены некорректно
Данные введены корректно
Данные введены корректно
Неверный формат ввода данных повторите попытку
Неверный формат ввода данных повторите попытку
Смена пароля
Смена пароля
Ввод email 
Ввод email 
Проверка корректности формата email
Проверка корректности формата email
Передача email из формы
Передача email из формы
Запрос полученного email
Запрос полученного email
Возврат результатов поиска email
Возврат результатов поиска email
Возврат результатов, если email существует в БД -генерируется письмо с кодом и отправляется на введенный email
Возврат результатов, если email существует в БД -генерируется письмо с кодом и отправляется на введенный email
alt
alt
Данные отсутствуют в БД
Данные отсутствуют в БД
Данные существуют в БД
Данные существуют в БД
Аккаунт с данным email не существует, переход на страницу "регистрация"
Аккаунт с данным email не существует, переход на страницу "регистрация"
Нажатие кнопки забыли пароль на странице входа
Нажатие кнопки забыли пароль на странице входа
Отправка кода для смены пароля на указанный email
Отправка кода для смены пароля на указанный email
Ввод данных, нажатие кнопки сменить пароль
Ввод данных, нажатие кнопки сменить пароль
Проверка корректности формата введенных данных и совпадения паролей
Проверка корректности формата введенных данных и совпадения паролей
alt
alt
Данные введены некорректно
Данные введены некорректно
Данные введены корректно
Данные введены корректно
Неверный формат ввода данных и(или) пароли не совпадают, повторите попытку
Неверный формат ввода данных и(или) пароли не совпадают, повторите попытку
Перенаправление данных
Перенаправление данных
запрос на изменение данных пользователя в БД
запрос на изменение данных пользователя в БД
Данные успешно обновлены
Данные успешно обновлены
Возврат результатов 
Возврат результатов 
Переход на главную страницу
Переход на главную страницу
На странице магазина - при попытке совершить покупку;
на странице обмена - при попытке совершить обмен;
при попытке открыть инвентарь;
при нажатии на кнопки уведомления, квесты, создать уникальную карту - на странице коллекций;
При попытке отправить обмен в процессе просмотра инвентаря другого пользователя 
На странице магазина - при попытке совершить покупку;...
Поиск аккаунта с таким логином и паролем
Поиск аккаунта с таким логином и паролем
Поиск emal в БД
Поиск emal в БД
Передача введенного кода
Передача введенного кода
Возврат результатов проверки
Возврат результатов проверки
Поиск emal в БД
Поиск emal в БД
Обновление данных в БД
Обновление данных в БД
alt
alt
Код неверный
Код неверный
Код верный
Код верный
Переход  на страницу смена пароля
Переход  на страницу смена пароля
Код неверный, вернуться на страницу входа или выслать новый код
Код неверный, вернуться на страницу входа или выслать новый код
Ввод кода подтверждения, нажатие кнопки подтвердить
Ввод кода подтверждения, нажатие кнопки подтвердить
Проверка корректности введенного кода
Проверка корректности введенного кода
Передача введенного кода
Передача введенного кода
Возврат результатов проверки
Возврат результатов проверки
Открытие страницы "смена пароля"
Открытие страницы "смена пароля"
Text is not SVG - cannot display
\ No newline at end of file diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.png" "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.png" new file mode 100644 index 0000000..b21c60f Binary files /dev/null and "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.png" differ diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.svg" "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.svg" new file mode 100644 index 0000000..7ef166c --- /dev/null +++ "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.svg" @@ -0,0 +1,4 @@ + + + +
alt
alt
Недостаточно
Недостаточно
Достаточно
Достаточно
alt
alt
Обмен отклонён
Обмен отклонён
Обмен подтверждён
Обмен подтверждён
Отправка уведомления, об отказе в обмене
Отправка уведомления, об отказе в обмене
Передача данных 
Передача данных 
Изменение статуса обмена и инвентарей пользователей
Изменение статуса обмена и инвентарей пользователей
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Отправка уведомления об успешном обмене
Отправка уведомления об успешном обмене
Пользователь
Пользователь
Клиент
Клиент
Сервер
Сервер
База данных
База данных
Облачное хранилище
Облачное хранилище
Добавление карты в избранное (инвентарь)
Добавление карты в избранное (инвентарь)
Нажать на кнопку "Добавить в избранное"
Нажать на кнопку "Добавить в избранное"
alt
alt
Невозможно добавить в избранное
Невозможно добавить в избранное
Возможно добавить в избранное
Возможно добавить в избранное
Достигнут лимит избранных карт
Достигнут лимит избранных карт
Передача данных 
Передача данных 
Добавление карты в "Избранное" В БД
Добавление карты в "Избранное" В БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Карта успешно добавлена в "Избранное"
Карта успешно добавлена в "Избранное"
Удаление карты из избранного (инвентарь)
Удаление карты из избранного (инвентарь)
Нажать на активированную кнопку "Добавить в избранное"
Нажать на активированную кнопку "Добавить в избранное"
Передача данных
Передача данных
Удаление карты из "Избранное" в БД
Удаление карты из "Избранное" в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Карта успешно удалена из "Избранное"
Карта успешно удалена из "Избранное"
Разбор карты на валюту (инвентарь)
Разбор карты на валюту (инвентарь)
Нажать на карточку в инвентаре
Нажать на карточку в инвентаре
Увеличение карточки появление кнопки "Разобрать"
Увеличение карточки появление кнопки "Разобрать"
Нажать на кнопку "Разобрать"
Нажать на кнопку "Разобрать"
Передача данных
Передача данных
Удаление карты из инвентаря пользователя, изменение его баланса
Удаление карты из инвентаря пользователя, изменение его баланса
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Карта успешно разобрана на валюту
Карта успешно разобрана на валюту
Фильтровать карты (инвентарь, обменник)
Фильтровать карты (инвентарь, обменник)
Нажать на кнопку фильтровать
Нажать на кнопку фильтровать
Предложение параметров для фильтрации (редкость, коллекция)
Предложение параметров для фильтрации (редкость, коллекция)
Выставление фильтров
Выставление фильтров
Передача данных
Передача данных
Запрос данных из БД, удовлетворяющих условиям фильтров
Запрос данных из БД, удовлетворяющих условиям фильтров
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Отфильтрованный список карт
Отфильтрованный список карт
Выставить карту на обмен (инвентарь)
Выставить карту на обмен (инвентарь)
Нажать на карточку в инвентаре
Нажать на карточку в инвентаре
Увеличение карточки появление кнопки "Обменять"
Увеличение карточки появление кнопки "Обменять"
Выбрать карты желаемые получить при обмене (можно не заполнять). Нажать на кнопку выставить на обмен
Выбрать карты желаемые получить при обмене (можно не заполнять). Нажать на кнопку выставить на обмен
Передача данных
Передача данных
Запрос на изменение положения карты из "inventory" в "OnChange" в инвентаре
Запрос на изменение положения карты из "inventory" в "OnChange"...
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Отправка уведомления о том, что карта успешно выставлена на обмен
Отправка уведомления о том, что карта успешно выставлена на обмен
Открыть набор (магазин)
Открыть набор (магазин)
Нажать на кнопку открыть после покупки набора
Нажать на кнопку открыть после покупки набора
Передача данных
Передача данных
Добавление карт в инвентарь в БД
Добавление карт в инвентарь в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Возврат на текущую страницу, инвентарь обновлен
Возврат на текущую страницу, инвентарь обновлен
Магазин
Магазин
Нажать на кнопку "Магазин"
Нажать на кнопку "Магазин"
Запрос на открытие страницы магазина
Запрос на открытие страницы магазина
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Запрос необходимых изображений карточек и наборов
Запрос необходимых изображений карточек и наборов
Передача данных магазина
Передача данных магазина
Возврат данных для загрузки страницы
Возврат данных для загрузки страницы
Купить набор (Магазин)
Купить набор (Магазин)
Нажать на кнопку купить рядом с набором
Нажать на кнопку купить рядом с набором
alt
alt
Недостаточно
Недостаточно
Достаточно
Достаточно
Недостаточно средств: перейти на страницу пополнения или вернуться в магазин
Недостаточно средств: перейти на страницу пополнения или вернуться в магазин
Передача данных 
Передача данных 
Списание валюты в БД
Списание валюты в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Кнопка открыть набор
Кнопка открыть набор
Запрос количества валюты
Запрос количества валюты
Нажатие на кнопку "Открыть набор"
Нажатие на кнопку "Открыть набор"
Передача данных 
Передача данных 
Добавление карт в инвентарь
Добавление карт в инвентарь
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Демонстрация "выпавших карт" пользователю, возвращение на страницу магазина
Демонстрация "выпавших карт" пользователю, возвращение на страницу магазина
Ивентарь
Ивентарь
Нажать на кнопку "Инвентарь"
Нажать на кнопку "Инвентарь"
Запрос на открытие страницы инвентаря
Запрос на открытие страницы инвентаря
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Посмотреть содержимое набора (Магазин)
Посмотреть содержимое набора (Магазин)
Нажать на иконку набора
Нажать на иконку набора
Запрос на открытие страницы набора
Запрос на открытие страницы набора
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Просмотр коллекции
Просмотр коллекции
Нажать на аватарку коллекции из списка 
Нажать на аватарку коллекции из списка 
Запрос на открытие страницы коллекции
Запрос на открытие страницы коллекции
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Просмотр обменов
Просмотр обменов
Нажать на кнопку Обменник
Нажать на кнопку Обменник
Запрос на открытие страницы обменов
Запрос на открытие страницы обменов
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Поиск интересующих карточек (Обменник)
Поиск интересующих карточек (Обменник)
Запрос данных
Запрос данных
Запрос предложений для данной карточки
Запрос предложений для данной карточки
Возвращение списка обменов для искомой карты
Возвращение списка обменов для искомой карты
Возврат результатов
Возврат результатов
Ввести название карточки в строке поиска
Ввести название карточки в строке поиска
Быстрый обмен (Обменник)
Быстрый обмен (Обменник)
Выбор 1 из доступных карт
Выбор 1 из доступных карт
Переход в инвентарь, отображаются только карты, подходящие для быстрого обмена
Переход в инвентарь, отображаются только карты, подходящие для быстрого обмена
Отправка данных
Отправка данных
Внесение в БД обмена и изменение инвентарей пользователей
Внесение в БД обмена и изменение инвентарей пользователей
Возврат сообщения об успешном обмене, отправка уведомления, добавления обмена в историю
Возврат сообщения об успешном обмене, отправка уведомления, добавления обмена в историю
Возврат результатов
Возврат результатов
 Обмен (Обменник)
 Обмен (Обменник)
Выбор 1 из доступных карт
Выбор 1 из доступных карт
Переход в инвентарь, отображаются все карты
Переход в инвентарь, отображаются все карты
Отправка данных
Отправка данных
Внесение в БД предложения обмена, статус - ожидает подтверждения
Внесение в БД предложения обмена, статус - ожидает подтверждения
Возврат сообщения об отправке предложения обмена, отправка уведомления
Возврат сообщения об отправке предложения обмена, отправка уведомления
Возврат результатов
Возврат результатов
Нажатие на кнопку "обменяться картой из списка" интересующего предложения
Нажатие на кнопку "обменяться картой из списка" интересующего предложения
Нажатие на кнопку  "предложить другую карту" интересующего предложения
Нажатие на кнопку  "предложить другую карту" интересующего предложения
Возврат результатов
Возврат результатов
Просмотр обменов пльзователя (обменник)
Просмотр обменов пльзователя (обменник)
Отправка данных
Отправка данных
Запрос в БД списка обменов пользователя
Запрос в БД списка обменов пользователя
Вывод списка обменов пользователя
Вывод списка обменов пользователя
Нажатие на кнопку "мои обмены"
Нажатие на кнопку "мои обмены"
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
alt
alt
Реквизиты некорректны и (или) оплата не прошла
Реквизиты некорректны и (или) оплата не прошла
Оплата прошла успешно
Оплата прошла успешно
сообщение об ошибке, возврат на страницу магазина
сообщение об ошибке, возврат на страницу магазина
Пополнение баланса пользователя в БД , добавление информации о платеже
Пополнение баланса пользователя в БД , добавление информации о платеже
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Отправка уведомления об успешном пополнении, возврат на страницу магазина
Отправка уведомления об успешном пополнении, возврат на страницу магазина
Пополнение валюты
Пополнение валюты
Выбор предложения
Выбор предложения
Переход на вкладку монеты в магазине
Переход на вкладку монеты в магазине
Ввод реквизитов
Ввод реквизитов
Поиск пользователей
Поиск пользователей
Запрос данных
Запрос данных
Запрос пользователей по имени или по id
Запрос пользователей по имени или по id
Вести имя пользователя в строке поиска
Вести имя пользователя в строке поиска
Просмотр профиля другого пользователя
Просмотр профиля другого пользователя
Запрос данных
Запрос данных
Запрос данных пользователя
Запрос данных пользователя
Возвращение данных пользователя, показ витрины карт, достижений и (или инвентаря)
Возвращение данных пользователя, показ витрины карт, достижений и (или инвентаря)
Возврат результатов
Возврат результатов
Нажать на пользователя из списка
Нажать на пользователя из списка
При нажатии на карту в инвентаре пользователя можно отправить предложение обмена, быстрый обмен невозможен
При нажатии на карту в инвентаре пользователя можно отправить предложение обмена, быстрый обмен невозможен
Передача данных 
Передача данных 
Внос URL изображения в БД
Внос URL изображения в БД
Добавление (изменение) аватарки
Добавление (изменение) аватарки
Нажатие на иконку аватарки в профиле 
Нажатие на иконку аватарки в профиле 
Страница для загрузки аватарки
Страница для загрузки аватарки
Изменение аватарки
Изменение аватарки
Загрузка фотографии
Загрузка фотографии
Загрузка изображения в облако
Загрузка изображения в облако
Просмотр достижений/новостей/уведомлений/ квестов
Просмотр достижений/новостей/уведомлений/ квестов
Запрос данных
Запрос данных
Запрос данных пользователя
Запрос данных пользователя
Нажать на соответствующую кнопку 
Нажать на соответствующую кнопку 
Изменение пользовательских настроек
Изменение пользовательских настроек
Отправка данных
Отправка данных
Отправка данных
Отправка данных
Настройки изменены
Настройки изменены
Возврат результатов
Возврат результатов
Нажать на кнопку "Настройки" в профиле, установить параметры
Нажать на кнопку "Настройки" в профиле, установить параметры
alt
alt
Обмен отклонён
Обмен отклонён
Обмен подтверждён
Обмен подтверждён
Передача данных 
Передача данных 
Изменение статуса обмена и инвентарей пользователей
Изменение статуса обмена и инвентарей пользователей
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Отправка уведомления об успешном обмене, возврат на текущую страницу
Отправка уведомления об успешном обмене, возврат на текущую страницу
Отзыв на обмен (уведомления, история обменов)
Отзыв на обмен (уведомления, история обменов)
Вывод информации об обмене
Вывод информации об обмене
Нажатие на предложение обмена
Нажатие на предложение обмена
Передача данных 
Передача данных 
Статус обмена = "отклонён"
Статус обмена = "отклонён"
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Возврат на текущую страницу
Возврат на текущую страницу
Отклонение обмена
Отклонение обмена
Подача жалобы на пользователя
Подача жалобы на пользователя
Заполнение формы 
Заполнение формы 
Отправка данных
Отправка данных
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Нажать на кнопку "Пожаловаться", в профиле другого пользователя
Нажать на кнопку "Пожаловаться", в профиле другого пользователя
Переход на страницу "Отчет о нарушении"
Переход на страницу "Отчет о нарушении"
Отправка уведомления по результатам отчета
Отправка уведомления по результатам отчета
Отправка данных
Отправка данных
Пользователь
Пользователь
Генерация уникальных карт
Генерация уникальных карт
Нажать на кнопку "Сгенерировать ИИ карту"
Нажать на кнопку "Сгенерировать ИИ карту"
Клиент
Клиент
Сервер
Сервер
Нейросеть
Нейросеть
БД
БД
Облако
Облако
Проверка: достаточно ли валюты для генерации уникальной карты?
Проверка: достаточно ли валюты для генерации уникальной карты?
Возврат на главную страницу, сообщение о недостатке баланса
Возврат на главную страницу, сообщение о недостатке баланса
Запрос на генерацию изображения
Запрос на генерацию изображения
Запрос на генерацию изображения
Запрос на генерацию изображения
Возврат изображения
Возврат изображения
Создание новой карты в БД, помещении ее в инвентарь пользователя. добавление url, списание с баланса стоимости генерации карты
Создание новой карты в БД, помещении ее в инвентарь пользователя. добавление url, списание с баланса стоимости генерации карты
Сохранение изображения для карточки 
Сохранение изображения для карточки 
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Карта добавлена в инвентарь, возвращение на главную 
Карта добавлена в инвентарь, возвращение на главную 
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Запрос на добавление
Запрос на добавление
Запрос количества избранных карт
Запрос количества избранных карт
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Проверка лимита избранных карт
Проверка лимита избранных карт
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Отправка данных стоимости набора
Отправка данных стоимости набора
Возврат результатов
Возврат результатов
Проверка: достаточно ли валюты?
Проверка: достаточно ли валюты?
Возврат результатов
Возврат результатов
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Передача данных 
Передача данных 
Изменение статуса обмена и инвентарей пользователей
Изменение статуса обмена и инвентарей пользователей
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Загрузка предложений
Загрузка предложений
Передача данных о содержимом набора
Передача данных о содержимом набора
Возврат данных для загрузки страницы
Возврат данных для загрузки страницы
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Передача данных 
Передача данных 
Запросы на получение изображений (при необходимости)
Запросы на получение изображений (при необходимости)
Загрузка изображений
Загрузка изображений
Передача данных
Передача данных
Нажатие на предложение обмена (обменник)
Нажатие на предложение обмена (обменник)
Нажать на интересующее предложение обмена
Нажать на интересующее предложение обмена
Запрос на открытие страницы деталей обмена
Запрос на открытие страницы деталей обмена
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Пользователь получает всю информацию по данному предложению обмена
Пользователь получает всю информацию по данному предложению обмена
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов аватарок
Возврат данных для загрузки страницы, в том числе urlов аватарок
Запросы на получение аватарок пользователей
Запросы на получение аватарок пользователей
Загрузка изображений
Загрузка изображений
Создание предложения обмена (обменник или при просмотре инвентаря другого пользователя)
Создание предложения обмена (обменник или при просмотре инвентаря другого пользователя)
Нажатие на кнопку "создать обмен" 
Нажатие на кнопку "создать обмен" 
Открытие страницы "создание обмена"
Открытие страницы "создание обмена"
"Добавить" в поле ваша карта для обмена
"Добавить" в поле ваша карта для обмена
Открытие инвентаря пользователя
Открытие инвентаря пользователя
Выбор карты для обмена
Выбор карты для обмена
Открытие страницы "создание обмена"
Открытие страницы "создание обмена"
"Добавить" в поле карты на которые вы готовы совершить обмен
"Добавить" в поле карты на которые вы готовы совершить обмен
Если предложение отправляется в процессе просмотра инвентаря другого пользователя, то это поле будет заполнено картой, при просмотре который была нажата кнопка предложить обмен и недоступно для редактирования
Если предложение отправляется в процессе просмотра инвентаря другого пользователя, то это поле будет заполнено картой, при просмотре который была нажата кнопка предложить обмен и недоступно для редактирования
Открытие страницы "создание обмена"
Открытие страницы "создание обмена"
Нажатие на кнопку "Отправить предложение обмена"
Нажатие на кнопку "Отправить предложение обмена"
Передача данных
Передача данных
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Отправка уведомления о том, что предложение обмена успешно отправлено
Отправка уведомления о том, что предложение обмена успешно отправлено
Внос в БД данных по данной операции
Внос в БД данных по данной операции
Отмена предложения обмена (обмены пользователя)
Отмена предложения обмена (обмены пользователя)
Отправка данных
Отправка данных
Внос необходимых изменений в БД
Внос необходимых изменений в БД
Отображение истории обменов, выбранный обмен удалён
Отображение истории обменов, выбранный обмен удалён
Нажатие на кнопку "отменить" предложения с неподтвержденным статусом
Нажатие на кнопку "отменить" предложения с неподтвержденным статусом
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Подтверждение обмена
Подтверждение обмена
Передача данных
Передача данных
Возврат результатов
Возврат результатов
Выбор темы изображения (из списка предложенных)
Выбор темы изображения (из списка предложенных)
Передача данных
Передача данных
Коллекции (страница при открытии приложения)
Коллекции (страница при открытии приложения)
Пользователь запустил приложение
Пользователь запустил приложение
Запрос на открытие страницы "коллекция"
Запрос на открытие страницы "коллекция"
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Возврат результатов
Возврат результатов
Запрос на покупку валюты
Запрос на покупку валюты
Запрос на обработку платежа
Запрос на обработку платежа
Запрос данных платежа
Запрос данных платежа
Передача данных платежа
Передача данных платежа
Возврат результата транзакции
Возврат результата транзакции
Возврат результатов
Возврат результатов
Клиент
Клиент
Сервер
Сервер
База данных
База данных
Платежный шлюз
Платежный шлюз
Пользователь
Пользователь
Запрос списка тем для генерации и баланса пользователя
Запрос списка тем для генерации и баланса пользователя
Ответ на запрос
Ответ на запрос
Text is not SVG - cannot display
\ No newline at end of file diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\264\320\274\320\270\320\275.png" "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\264\320\274\320\270\320\275.png" new file mode 100644 index 0000000..b9a732d Binary files /dev/null and "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\264\320\274\320\270\320\275.png" differ diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\264\320\274\320\270\320\275.svg" "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\264\320\274\320\270\320\275.svg" new file mode 100644 index 0000000..5659499 --- /dev/null +++ "b/Documentation/Diagrams/Sequences_Diagrams/\320\220\320\264\320\274\320\270\320\275.svg" @@ -0,0 +1,4 @@ + + + +
Администратор
Администратор
Клиент
Клиент
База данных
База данных
Облачное хранилище
Облачное хранилище
Отправка данных
Отправка данных
Запрос в БД списка отчетов о нарушении
Запрос в БД списка отчетов о нарушении
Вывод списка отчетов
Вывод списка отчетов
Нажатие на кнопку "просмотр жалоб"
Нажатие на кнопку "просмотр жалоб"
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Передача данных 
Передача данных 
Внесение необходимых изменений в БД
Внесение необходимых изменений в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Нажатие на кнопку  "рассмотреть отчет"
Нажатие на кнопку  "рассмотреть отчет"
Вывод деталей отчета
Вывод деталей отчета
Отзыв на отчет
Отзыв на отчет
Рассмотрение жалоб пользователей
Рассмотрение жалоб пользователей
Сервер
Сервер
alt
alt
Изменить
Изменить
Удалить
Удалить
Передача данных 
Передача данных 
Удаление карты из БД
Удаление карты из БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Карта успешно удалена, коллекция обновлена
Карта успешно удалена, коллекция обновлена
Удаление/изменение карты из коллекции
Удаление/изменение карты из коллекции
Нажатие на кнопку "удалить карту/изменить карту"
Нажатие на кнопку "удалить карту/изменить карту"
Увеличение карты, вывод кнопок администратора
Увеличение карты, вывод кнопок администратора
Нажатие на карту в коллекции
Нажатие на карту в коллекции
Внести новые данные карты
Внести новые данные карты
Передача данных 
Передача данных 
Изменение полей карты в БД
Изменение полей карты в БД
Загрузка нового изображения карты
Загрузка нового изображения карты
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Карта успешно обновлена
Карта успешно обновлена
Возврат результатов
Возврат результатов
Вывод формы для создания карты
Вывод формы для создания карты
Нажатие на кнопку "+" при просмотре коллекции
Нажатие на кнопку "+" при просмотре коллекции
Передача данных 
Передача данных 
Создание новой карты в БД
Создание новой карты в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Заполнить необходимые данные
Заполнить необходимые данные
Добавление новой карты в коллекцию
Добавление новой карты в коллекцию
Добавление изображения карты
Добавление изображения карты
Карта успешно создана, коллекция обновлена
Карта успешно создана, коллекция обновлена
Вывод формы для создания коллекции
Вывод формы для создания коллекции
Нажатие на кнопку "+" при просмотре списка коллекций
Нажатие на кнопку "+" при просмотре списка коллекций
Передача данных 
Передача данных 
Создание новой коллекции в БД
Создание новой коллекции в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Заполнить необходимые данные, 
Заполнить необходимые данные, 
Создание коллекции
Создание коллекции
Добавление необходимых изображений
Добавление необходимых изображений
Возврат результатов
Возврат результатов
Коллекция успешно создана
Коллекция успешно создана
Запрос подтверждения удаления, удалить можно только коллекцию, не содержащую карт
Запрос подтверждения удаления, удалить можно только коллекцию, не содержащую карт
Нажатие на кнопку "удалить коллекцию"
Нажатие на кнопку "удалить коллекцию"
Передача данных 
Передача данных 
Удаление коллекции из БД
Удаление коллекции из БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Удалить
Удалить
Удаление коллекции
Удаление коллекции
Удаление связанных изображений
Удаление связанных изображений
Коллекция успешно удалена
Коллекция успешно удалена
Вывод формы для создания набора
Вывод формы для создания набора
Нажатие на кнопку "+" при просмотре списка наборов
Нажатие на кнопку "+" при просмотре списка наборов
Передача данных 
Передача данных 
Создание нового набора в БД
Создание нового набора в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Заполнить необходимые данные
Заполнить необходимые данные
Добавление набора в магазин
Добавление набора в магазин
Добавление необходимых изображений
Добавление необходимых изображений
Набор успешно создан
Набор успешно создан
Запрос подтверждения удаления
Запрос подтверждения удаления
Нажатие на кнопку "удалить набор"
Нажатие на кнопку "удалить набор"
Удаление набора из магазина
Удаление набора из магазина
Вывод формы с данными набора
Вывод формы с данными набора
Нажатие на кнопку "редактировать набор"
Нажатие на кнопку "редактировать набор"
Передача данных 
Передача данных 
Внесение изменений в БД
Внесение изменений в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Изменение списка карт, цены и(или) других параметров набора
Изменение списка карт, цены и(или) других параметров набора
Изменение содержимого набора, его внешнего вида, стоимости
Изменение содержимого набора, его внешнего вида, стоимости
Внесение изменений в облако (при необходимости)
Внесение изменений в облако (при необходимости)
Возврат результатов
Возврат результатов
Набор успешно изменён
Набор успешно изменён
Переход на страницу пополнения валюты
Переход на страницу пополнения валюты
Нажатие на раздел монеты в магазине
Нажатие на раздел монеты в магазине
Передача данных 
Передача данных 
Внесение изменений в БД
Внесение изменений в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Изменение цены покупки валюты или создание новых предложений
Изменение цены покупки валюты или создание новых предложений
Изменение курса валют
Изменение курса валют
Данные успешно обновлены
Данные успешно обновлены
Вывод формы для редактирования
Вывод формы для редактирования
нажать на соответствующую кнопку в требуемом разделе
нажать на соответствующую кнопку в требуемом разделе
Передача данных 
Передача данных 
Внесение изменений в БД
Внесение изменений в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Внесение данных в форму или нажатие на кнопку удалить
Внесение данных в форму или нажатие на кнопку удалить
Создание изменение и удаление достижений, квестов, новостей
Создание изменение и удаление достижений, квестов, новостей
Внесение изменений в облако (при необходимости)
Внесение изменений в облако (при необходимости)
Возврат результатов
Возврат результатов
Сообщение об успешной операции
Сообщение об успешной операции
Просмотр истории обменов (обменник)
Просмотр истории обменов (обменник)
Отправка данных
Отправка данных
Запрос в БД списка обменов пользователя
Запрос в БД списка обменов пользователя
Вывод списка обменов пользователя
Вывод списка обменов пользователя
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Ввести данные пользователя и просмотреть его список обменов
Ввести данные пользователя и просмотреть его список обменов
Признать обмен недействительным (в случаях установления взлома аккаунта)
Признать обмен недействительным (в случаях установления взлома аккаунта)
Возврат результатов
Возврат результатов
Нажатие на кнопку  посмотреть детали обмена интересующего обмена
Нажатие на кнопку  посмотреть детали обмена интересующего обмена
Запрос на открытие страницы
Запрос на открытие страницы
Запрос в БД всей информации по данному обмену
Запрос в БД всей информации по данному обмену
Возврат результатов
Возврат результатов
Вывод детальной информации обмена
Вывод детальной информации обмена
Передача данных 
Передача данных 
Внесение изменений инвентарей пользователей в БД
Внесение изменений инвентарей пользователей в БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Признать обмен недействительным
Признать обмен недействительным
Обмен успешно удалён
Обмен успешно удалён
Просмотр достижений/новостей/
 квестов
Просмотр достижений/новостей/...
Запрос данных
Запрос данных
Запрос данных пользователя
Запрос данных пользователя
Нажать на соответствующую кнопку 
Нажать на соответствующую кнопку 
Передача данных 
Передача данных 
Запросы на получение изображений (при необходимости)
Запросы на получение изображений (при необходимости)
Загрузка изображений
Загрузка изображений
Передача данных
Передача данных
Коллекции (страница при открытии приложения)
Коллекции (страница при открытии приложения)
Администратор запустил приложение
Администратор запустил приложение
Запрос на открытие страницы "коллекция"
Запрос на открытие страницы "коллекция"
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Просмотр коллекции
Просмотр коллекции
Нажать на аватарку коллекции из списка 
Нажать на аватарку коллекции из списка 
Запрос на открытие страницы выбранной коллекции
Запрос на открытие страницы выбранной коллекции
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Возврат данных
Возврат данных
Возврат данных
Возврат данных
Просмотр содержимого магазина
Просмотр содержимого магазина
Нажать на кнопку "Магазин"
Нажать на кнопку "Магазин"
Запрос на открытие страницы магазина
Запрос на открытие страницы магазина
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Запрос необходимых изображений карточек и наборов
Запрос необходимых изображений карточек и наборов
Передача данных магазина
Передача данных магазина
Возврат данных для загрузки страницы
Возврат данных для загрузки страницы
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Передача данных 
Передача данных 
Удаление набора из БД
Удаление набора из БД
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Удалить
Удалить
Удаление текстур набора
Удаление текстур набора
Набор успешно удален
Набор успешно удален
Возврат результатов
Возврат результатов
Text is not SVG - cannot display
\ No newline at end of file diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\235\320\265\320\260\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.png" "b/Documentation/Diagrams/Sequences_Diagrams/\320\235\320\265\320\260\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.png" new file mode 100644 index 0000000..e5aacfb Binary files /dev/null and "b/Documentation/Diagrams/Sequences_Diagrams/\320\235\320\265\320\260\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.png" differ diff --git "a/Documentation/Diagrams/Sequences_Diagrams/\320\235\320\265\320\260\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.svg" "b/Documentation/Diagrams/Sequences_Diagrams/\320\235\320\265\320\260\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.svg" new file mode 100644 index 0000000..8a2f7f1 --- /dev/null +++ "b/Documentation/Diagrams/Sequences_Diagrams/\320\235\320\265\320\260\320\262\321\202\320\276\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214.svg" @@ -0,0 +1,4 @@ + + + +
Пользователь
Пользователь
Ивентарь
Ивентарь
Нажать на кнопку "Инвентарь"
Нажать на кнопку "Инвентарь"
Запрос на открытие страницы инвентаря
Запрос на открытие страницы инвентаря
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на главную или перейти на страницу входа
Вернуться на главную или перейти на страницу входа
Клиент
Клиент
Сервер
Сервер
База данных
База данных
Облачное хранилище
Облачное хранилище
Покупка набора (магазин)
Покупка набора (магазин)
Нажать на кнопку "купить" рядом с набором
Нажать на кнопку "купить" рядом с набором
Запрос на списание валюты
Запрос на списание валюты
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на страницу магазина или перейти на страницу входа
Вернуться на страницу магазина или перейти на страницу входа
Поиск Карточек (Обменник)
Поиск Карточек (Обменник)
Запрос данных
Запрос данных
Запрос предложений для данной карточки
Запрос предложений для данной карточки
Возвращение списка обменов для искомой карты
Возвращение списка обменов для искомой карты
Возврат результатов
Возврат результатов
Ввести название карточки в строке поиска
Ввести название карточки в строке поиска
Фильтровать карты      (обменник)
Фильтровать карты      (обменник)
Нажать на кнопку фильтровать
Нажать на кнопку фильтровать
Предложение параметров для фильтрации (редкость, коллекция)
Предложение параметров для фильтрации (редкость, коллекция)
Выставление фильтров
Выставление фильтров
Передача данных
Передача данных
Запрос данных из БД, удовлетворяющих условиям фильтров
Запрос данных из БД, удовлетворяющих условиям фильтров
Возврат результатов
Возврат результатов
Возврат результатов
Возврат результатов
Отфильтрованный список карт
Отфильтрованный список карт
Попытка отправить предложение обмена
Попытка отправить предложение обмена
Нажать на предложение обмена
Нажать на предложение обмена
Запрос на получения страницы для отправки обмена
Запрос на получения страницы для отправки обмена
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на страницу обменов или перейти на страницу входа
Вернуться на страницу обменов или перейти на страницу входа
Нажатие на кнопку "профиль"
Нажатие на кнопку "профиль"
Нажать на кнопку профиль
Нажать на кнопку профиль
Запрос на открытие профиля
Запрос на открытие профиля
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на главную или перейти на страницу входа
Вернуться на главную или перейти на страницу входа
Просмотр профиля другого пользователя
Просмотр профиля другого пользователя
Запрос данных
Запрос данных
Запрос данных пользователя
Запрос данных пользователя
Возвращение данных пользователя, показ витрины и (или инвентаря)
Возвращение данных пользователя, показ витрины и (или инвентаря)
Возврат результатов
Возврат результатов
Нажать на пользователя из списка
Нажать на пользователя из списка
При нажатии на карту в инвентаре пользователя можно отправить предложение обмена, быстрый обмен невозможен, однако при попытке отправить обмен будет выполнен переход на страницу входа
При нажатии на карту в инвентаре пользователя можно отправить предложение обмена, быстрый обмен невозможен, однако при попытке отправить обмен будет выполнен переход на страницу входа
Покупка валюты
Покупка валюты
Нажать на покупку предложения в магазине
Нажать на покупку предложения в магазине
Запрос открытия страницы пополнения
Запрос открытия страницы пополнения
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на главную или перейти на страницу входа
Вернуться на главную или перейти на страницу входа
Попытка генерации уникальной карты
Попытка генерации уникальной карты
Нажать на кнопку "Сгенерировать ИИ карту"
Нажать на кнопку "Сгенерировать ИИ карту"
Запрос на генерацию изображения
Запрос на генерацию изображения
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на главную или перейти на страницу входа
Вернуться на главную или перейти на страницу входа
Магазин
Магазин
Нажать на кнопку "Магазин"
Нажать на кнопку "Магазин"
Запрос на открытие страницы магазина
Запрос на открытие страницы магазина
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Запрос необходимых изображений карточек и наборов
Запрос необходимых изображений карточек и наборов
Передача данных магазина
Передача данных магазина
Возврат данных для загрузки страницы
Возврат данных для загрузки страницы
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Посмотреть содержимое набора (Магазин)
Посмотреть содержимое набора (Магазин)
Нажать на иконку набора
Нажать на иконку набора
Запрос на открытие страницы набора
Запрос на открытие страницы набора
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных о содержимом набора
Передача данных о содержимом набора
Возврат данных для загрузки страницы
Возврат данных для загрузки страницы
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Просмотр коллекции
Просмотр коллекции
Нажать на аватарку коллекции из списка 
Нажать на аватарку коллекции из списка 
Запрос на открытие страницы выбранной коллекции
Запрос на открытие страницы выбранной коллекции
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Просмотр обменов
Просмотр обменов
Нажать на кнопку Обменник
Нажать на кнопку Обменник
Запрос на открытие страницы обменов
Запрос на открытие страницы обменов
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Проверка авторизации
Коллекции (страница при открытии приложения)
Коллекции (страница при открытии приложения)
Пользователь запустил приложение
Пользователь запустил приложение
Запрос на открытие страницы "коллекция"
Запрос на открытие страницы "коллекция"
Запрос необходимых данных для загрузки страницы
Запрос необходимых данных для загрузки страницы
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов изображений
Возврат данных для загрузки страницы, в том числе urlов изображений
Запросы на получение изображений
Запросы на получение изображений
Загрузка изображений
Загрузка изображений
Попытка посмотреть "мои обмены"
Попытка посмотреть "мои обмены"
Нажать на историю обменов
Нажать на историю обменов
Запрос на получения страницы
Запрос на получения страницы
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на страницу обменов или перейти на страницу входа
Вернуться на страницу обменов или перейти на страницу входа
Проверка авторизации
Проверка авторизации
Нажатие на кнопку "квесты" или "уведомления"
Нажатие на кнопку "квесты" или "уведомления"
Нажать на соответствующую кнопку
Нажать на соответствующую кнопку
Запрос на открытие страницы
Запрос на открытие страницы
Вывод всплывающего сообщения
Вывод всплывающего сообщения
Вернуться на главную или перейти на страницу входа
Вернуться на главную или перейти на страницу входа
Проверка авторизации
Проверка авторизации
Просмотр новостей
Просмотр новостей
Запрос данных
Запрос данных
Запрос данных
Запрос данных
Нажать на кнопку новости
Нажать на кнопку новости
Передача данных 
Передача данных 
Запросы на получение изображений (при необходимости)
Запросы на получение изображений (при необходимости)
Загрузка изображений
Загрузка изображений
Передача данных
Передача данных
Поиск пользователей
Поиск пользователей
Запрос данных
Запрос данных
Запрос пользователей по имени или по id
Запрос пользователей по имени или по id
Вести имя пользователя в строке поиска
Вести имя пользователя в строке поиска
Передача данных 
Передача данных 
Возврат данных для загрузки страницы, в том числе urlов аватарок
Возврат данных для загрузки страницы, в том числе urlов аватарок
Запросы на получение аватарок пользователей
Запросы на получение аватарок пользователей
Загрузка изображений
Загрузка изображений
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Documentation/Diagrams/Use case copy.png b/Documentation/Diagrams/Use case copy.png new file mode 100644 index 0000000..1408f11 Binary files /dev/null and b/Documentation/Diagrams/Use case copy.png differ diff --git a/Documentation/Diagrams/Use case.png b/Documentation/Diagrams/Use case.png new file mode 100644 index 0000000..81d21dc Binary files /dev/null and b/Documentation/Diagrams/Use case.png differ diff --git "a/Documentation/Diagrams/\320\232\320\273\320\260\321\201\321\201\321\213.png" "b/Documentation/Diagrams/\320\232\320\273\320\260\321\201\321\201\321\213.png" new file mode 100644 index 0000000..9f57078 Binary files /dev/null and "b/Documentation/Diagrams/\320\232\320\273\320\260\321\201\321\201\321\213.png" differ diff --git "a/Documentation/Financial model/unit-\321\215\320\272\320\276\320\275\320\276\320\274\320\270\320\272\320\260 \320\270 P&L RoI.docx" "b/Documentation/Financial model/unit-\321\215\320\272\320\276\320\275\320\276\320\274\320\270\320\272\320\260 \320\270 P&L RoI.docx" new file mode 100644 index 0000000..2c4b903 Binary files /dev/null and "b/Documentation/Financial model/unit-\321\215\320\272\320\276\320\275\320\276\320\274\320\270\320\272\320\260 \320\270 P&L RoI.docx" differ diff --git "a/Documentation/Financial model/unit-\321\215\320\272\320\276\320\275\320\276\320\274\320\270\320\272\320\260 \320\270 P&L RoI.pdf" "b/Documentation/Financial model/unit-\321\215\320\272\320\276\320\275\320\276\320\274\320\270\320\272\320\260 \320\270 P&L RoI.pdf" new file mode 100644 index 0000000..6a02d75 Binary files /dev/null and "b/Documentation/Financial model/unit-\321\215\320\272\320\276\320\275\320\276\320\274\320\270\320\272\320\260 \320\270 P&L RoI.pdf" differ diff --git "a/Documentation/Financial model/\320\241\320\277\320\276\321\201\320\276\320\261 \320\274\320\276\320\275\320\265\321\202\320\270\320\267\320\260\321\206\320\270\320\270 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.docx" "b/Documentation/Financial model/\320\241\320\277\320\276\321\201\320\276\320\261 \320\274\320\276\320\275\320\265\321\202\320\270\320\267\320\260\321\206\320\270\320\270 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.docx" new file mode 100644 index 0000000..756d651 Binary files /dev/null and "b/Documentation/Financial model/\320\241\320\277\320\276\321\201\320\276\320\261 \320\274\320\276\320\275\320\265\321\202\320\270\320\267\320\260\321\206\320\270\320\270 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.docx" differ diff --git "a/Documentation/Financial model/\320\241\320\277\320\276\321\201\320\276\320\261 \320\274\320\276\320\275\320\265\321\202\320\270\320\267\320\260\321\206\320\270\320\270 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.pdf" "b/Documentation/Financial model/\320\241\320\277\320\276\321\201\320\276\320\261 \320\274\320\276\320\275\320\265\321\202\320\270\320\267\320\260\321\206\320\270\320\270 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.pdf" new file mode 100644 index 0000000..fd7e378 Binary files /dev/null and "b/Documentation/Financial model/\320\241\320\277\320\276\321\201\320\276\320\261 \320\274\320\276\320\275\320\265\321\202\320\270\320\267\320\260\321\206\320\270\320\270 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.pdf" differ diff --git "a/Documentation/SWOT-\320\260\320\275\320\260\320\273\320\270\320\267.docx" "b/Documentation/SWOT-\320\260\320\275\320\260\320\273\320\270\320\267.docx" new file mode 100644 index 0000000..8885422 Binary files /dev/null and "b/Documentation/SWOT-\320\260\320\275\320\260\320\273\320\270\320\267.docx" differ diff --git "a/Documentation/SWOT-\320\260\320\275\320\260\320\273\320\270\320\267.pdf" "b/Documentation/SWOT-\320\260\320\275\320\260\320\273\320\270\320\267.pdf" new file mode 100644 index 0000000..3f720d7 Binary files /dev/null and "b/Documentation/SWOT-\320\260\320\275\320\260\320\273\320\270\320\267.pdf" differ diff --git a/Documentation/Swagger/cardly.yaml b/Documentation/Swagger/cardly.yaml new file mode 100644 index 0000000..0e9b37b --- /dev/null +++ b/Documentation/Swagger/cardly.yaml @@ -0,0 +1,3573 @@ +openapi: 3.0.0 +info: + title: Cadrly API + version: 0.1.0 + description: Приложение для обмена коллекционными карточками + +servers: + - url: https://cardly.ru/api + description: Production server +tags: + - name: Authentication + description: Регистрация, вход и управление аккаунтом + - name: Profile + description: Операции в профиле пользователя + - name: OtherProfile + description: Операции при просмотре профиля другого пользователя + - name: Inventory + description: Операции на странице "Инвентарь" + - name: Home + description: Операции на странице "Главное меню" + - name: Trades + description: Операции на странице "Обменник" + - name: Shop + description: Операции на странице "Магазин" + - name: Admin + description: Функции администратора + +paths: + /auth/register: + post: + tags: [Authentication] + summary: Регистрация нового пользователя + description: | + Принимает email, имя пользователя и пароль. + Если email и пароль валидны, отправляет код подтверждения. + Возвращает временный токен для верификации. + operationId: registerUser + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + example: "user@example.com" + description: Email пользователя + username: + type: string + minLength: 3 + maxLength: 25 + example: "Коллекционер_123" + description: "Имя пользователя (3-25 символов)" + password: + type: string + format: password + minLength: 8 + example: "Password123!" + description: "Пароль (минимум 8 символов)" + required: [email, username, password] + responses: + 200: + description: Код подтверждения отправлен + content: + application/json: + schema: + type: object + properties: + tempToken: + type: string + example: "temp_abc123" + message: + type: string + example: "Код подтверждения отправлен на email" + 400: + description: Неверный формат данных + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Некорректный формат введенных данных" + 409: + description: Пользователь уже существует + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Пользователь с таким email уже существует" + 500: + $ref: '#/components/responses/ServerError' + + /auth/verify: + post: + tags: [Authentication] + summary: Подтверждение email + description: | + Проверяет код подтверждения. + Если код подтверждения верный - создает аккаунт и возвращает данные пользователя. + operationId: verifyEmail + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + tempToken: + type: string + example: "temp_abc123" + description: "Временный токен из ответа регистрации" + code: + type: string + pattern: "^\\d{6}$" + example: "123456" + description: "6-значный код подтверждения" + required: [tempToken, code] + responses: + 200: + description: Успешная регистрация + headers: + Set-Cookie: + schema: + type: string + example: "session_id=abcde12345; HttpOnly; Path=/; Secure" + content: + application/json: + schema: + $ref: '#/components/schemas/User' + 400: + description: Неверный код или токен + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Неверный код подтверждения" + canRetry: + type: boolean + example: true + 410: + description: Истек срок действия кода + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Код устарел, запросите новый" + 500: + $ref: '#/components/responses/ServerError' + + /auth/resend-code: + post: + tags: [Authentication] + summary: Повторная отправка кода + description: Отправляет новый код подтверждения + operationId: resendVerificationCode + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + tempToken: + type: string + example: "temp_abc123" + required: [tempToken] + responses: + 200: + description: Новый код отправлен + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Новый код подтверждения отправлен" + 400: + $ref: '#/components/responses/BadRequest' + 500: + $ref: '#/components/responses/ServerError' + + /auth/login: + post: + tags: [Authentication] + summary: Вход в систему + description: | + Аутентификация пользователя по email и паролю. + Если данные введены верно - устанавливает сессионную cookie. + operationId: loginUser + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + example: "user@example.com" + password: + type: string + format: password + example: "SecurePass123!" + required: [email, password] + responses: + 200: + description: Успешный вход + headers: + Set-Cookie: + schema: + type: string + example: "session_id=abcde12345; HttpOnly; Path=/; Secure" + content: + application/json: + schema: + $ref: '#/components/schemas/User' + 400: + description: Неверный формат email + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Неверный фортмат email" + + 401: + description: Неверные учетные данные + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Неверный email или пароль" + 500: + $ref: '#/components/responses/ServerError' + + /auth/forgot-password: + post: + tags: [Authentication] + summary: Запрос кода для сброса пароля + description: Отправляет код подтверждения для сброса пароля, если email существует в системе + operationId: requestPasswordReset + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + format: email + example: "user@example.com" + required: [email] + responses: + 200: + description: Код подтверждения отправлен на email + content: + application/json: + schema: + type: object + properties: + resetToken: + type: string + example: "reset_xyz789" + message: + type: string + example: "Код подтверждения отправлен на email" + 400: + description: Неверный формат данных + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Некорректный формат emaila" + 404: + description: Пользователь с указанным email не найден + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Пользователь с таким email не зарегистрирован" + 500: + $ref: '#/components/responses/ServerError' + + /auth/reset-password: + post: + tags: [Authentication] + summary: Сброс пароля + description: Устанавливает новый пароль после подтверждения кода + operationId: resetPassword + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + resetToken: + type: string + example: "reset_xyz789" + code: + type: string + pattern: "^\\d{6}$" + example: "654321" + newPassword: + type: string + format: password + minLength: 8 + example: "NewSecurePass123!" + required: [resetToken, code, newPassword] + responses: + 200: + description: Пароль изменен + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Пароль успешно изменен" + 400: + description: Неверный код или токен + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Неверный код подтверждения" + 500: + $ref: '#/components/responses/ServerError' + + /auth/check: + get: + tags: [Authentication] + summary: Проверка статуса аутентификации + description: | + Проверяет, авторизован ли пользователь по сессионной cookie. + Возвращает данные пользователя, если сессия активна. + security: + - bearerAuth: [] + responses: + 200: + description: Пользователь авторизован + content: + application/json: + schema: + $ref: '#/components/schemas/User' + 401: + description: Пользователь не авторизован + content: + application/json: + schema: + type: object + properties: + isAuthenticated: + type: boolean + example: false + message: + type: string + example: "Требуется авторизация" + 500: + $ref: '#/components/responses/ServerError' + + /auth/refresh: + post: + tags: [Authentication] + summary: Обновление сессии + description: | + Обновляет сессионную cookie. + Требуется валидная существующая сессия. + security: + - bearerAuth: [] + responses: + 200: + description: Сессия успешно обновлена + headers: + Set-Cookie: + schema: + type: string + example: "session_id=new_abcde12345; HttpOnly; Path=/; Secure" + content: + application/json: + schema: + $ref: '#/components/schemas/User' + 401: + $ref: '#/components/responses/Unauthorized' + 500: + $ref: '#/components/responses/ServerError' + + /auth/logout: + post: + tags: [Authentication] + summary: Выход из системы + description: | + Завершает текущую сессию пользователя. + Удаляет сессионную cookie. + security: + - bearerAuth: [] + responses: + 204: + description: Успешный выход + headers: + Set-Cookie: + schema: + type: string + example: "session_id=; HttpOnly; Path=/; Secure; Expires=Thu, 01 Jan 1970 00:00:00 GMT" + 500: + $ref: '#/components/responses/ServerError' + + /profile: + get: + tags: [Profile] + summary: Получение данных профиля + description: | + Загружает данные профиля пользователя. + - Проверяет авторизацию + - Возвращает статистику, избранные карты и достижения + security: + - bearerAuth: [] + responses: + 200: + description: Данные профиля + content: + application/json: + schema: + type: object + properties: + userStats: + $ref: "#/components/schemas/UserStats" + favoriteCards: + type: array + items: + $ref: "#/components/schemas/Card" + maxItems: 5 + favoriteAchievements: + type: array + items: + $ref: "#/components/schemas/Achievement" + maxItems: 4 + user_ID: + type: integer + example: 123 + description: "ID пользователя" + username: + type: string + example: "Коллекционер_123" + description: "Имя пользователя" + avatar_url: + type: string + format: url + example: "https://example.com/avatars/user123.jpg" + description: "Ссылка на аватар пользователя" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /profile/achievements: + get: + tags: [Profile] + summary: Получение списка достижений + description: | + Возвращает полный список достижений с текущим статусом выполнения + security: + - bearerAuth: [] + responses: + 200: + description: Список достижений + content: + application/json: + schema: + type: object + properties: + achievements: + type: array + items: + $ref: "#/components/schemas/Achievement" + 500: + $ref: '#/components/responses/ServerError' + + /profile/achievements/favorites/count: + get: + tags: [Profile] + summary: Проверка количества избранных достижений + description: | + Возвращает текущее количество избранных достижений + security: + - bearerAuth: [] + responses: + 200: + description: Количество избранных + content: + application/json: + schema: + type: object + properties: + count: + type: integer + maximum: 4 + example: 3 + canAddMore: + type: boolean + example: true + 500: + $ref: '#/components/responses/ServerError' + + /profile/achievements/{achievement_ID}/favorite-add: + post: + tags: [Profile] + summary: Добавить достижение в избранное + description: | + Добавляет достижение в избранное (максимум 4) + security: + - bearerAuth: [] + parameters: + - in: path + name: achievement_ID + required: true + schema: + type: integer + responses: + 200: + description: Успешно добавлено в избранное + 400: + description: Невозможно добавить в избранное (лимит достигнут) + 500: + $ref: '#/components/responses/ServerError' + + /profile/achievements/{achievement_ID}/favorite-delete: + delete: + tags: [Profile] + summary: Удалить достижение из избранного + description: | + Удаляет достижение из избранного + security: + - bearerAuth: [] + parameters: + - in: path + name: achievement_ID + required: true + schema: + type: integer + responses: + 200: + description: Успешно удалено из избранного + 500: + $ref: '#/components/responses/ServerError' + + /profile/settings: + get: + tags: [Profile] + summary: Получение настроек + description: | + Возвращает текущие настройки профиля + security: + - bearerAuth: [] + responses: + 200: + description: Настройки профиля + content: + application/json: + schema: + $ref: "#/components/schemas/UserSettings" + 500: + $ref: '#/components/responses/ServerError' + + /profile/settings-change: + put: + tags: [Profile] + summary: Обновление настроек + description: | + Обновляет настройки профиля + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserSettings" + responses: + 200: + description: Настройки обновлены + content: + application/json: + schema: + $ref: "#/components/schemas/UserSettings" + 500: + $ref: '#/components/responses/ServerError' + + /other-profile/{user_ID}: + get: + tags: [OtherProfile] + summary: Получение данных профиля другого пользователя + description: | + Загружает данные профиля другого пользователя. + - Возвращает статистику, избранные карты и достижения + - Проверяет настройки приватности инвентаря + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + responses: + 200: + description: Данные профиля + content: + application/json: + schema: + type: object + properties: + userStats: + $ref: "#/components/schemas/UserStats" + favoriteCards: + type: array + items: + $ref: "#/components/schemas/Card" + maxItems: 5 + favoriteAchievements: + type: array + items: + $ref: "#/components/schemas/Achievement" + maxItems: 4 + inventoryVisible: + type: boolean + example: true + id: + type: integer + example: "456" + username: + type: string + example: "Игрок_456" + 500: + $ref: '#/components/responses/ServerError' + + /other-profile/{user_ID}/achievements: + get: + tags: [OtherProfile] + summary: Получение списка достижений другого пользователя + description: | + Возвращает полный список достижений с текущим статусом выполнения + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + responses: + 200: + description: Список достижений + content: + application/json: + schema: + type: object + properties: + achievements: + type: array + items: + $ref: "#/components/schemas/Achievement" + 500: + $ref: '#/components/responses/ServerError' + + /other-profile/{user_ID}/inventory: + get: + tags: [OtherProfile] + summary: Просмотр инвентаря другого пользователя + description: | + Возвращает инвентарь пользователя, если он не скрыт в настройках + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + responses: + 200: + description: Инвентарь пользователя + content: + application/json: + schema: + type: object + properties: + cards: + type: array + items: + $ref: "#/components/schemas/Card" + collections: + type: array + items: + $ref: "#/components/schemas/Collection" + 403: + description: Инвентарь скрыт + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Пользователь скрыл свой инвентарь" + 500: + $ref: '#/components/responses/ServerError' + + /other-profile/inventory/sort: + post: + tags: [OtherProfile] + summary: Сортировка карт в инвентаре другого пользователя + description: | + Сортирует карты в инвентаре другого пользователя + (по редкости, по коллекциям, механизм сортировки подробнее описан в инвентаре) + parameters: + - in: query + name: user_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + sortType: + type: string + enum: [rarity_desc, rarity_asc, collection, reset] + responses: + 200: + description: Отсортированный список карт + content: + application/json: + schema: + type: object + properties: + inventory: + type: array + items: + $ref: "#/components/schemas/Card" + 500: + $ref: '#/components/responses/ServerError' + + /other-profile/card/{card_ID}/view: + get: + tags: [OtherProfile] + summary: Просмотр карты другого пользователя + description: | + Возвращает детальную информацию о карте другого пользователя + и возвращает кнопку для создания предложения обмена + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + - in: query + name: owner_ID + required: true + schema: + type: integer + responses: + 200: + description: Информация о карте + content: + application/json: + schema: + type: object + properties: + card: + $ref: "#/components/schemas/Card" + 500: + $ref: '#/components/responses/ServerError' + + /other-profile/card/{card_ID}/initiate-trade: + post: + tags: [OtherProfile] + summary: Предложение обмена + description: | + Создает предложение обмена для указанной карты + и перенаправляет на страницу создания обмена + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + - in: query + name: owner_ID + required: true + schema: + type: integer + responses: + 200: + description: Перенаправление на создание обмена + content: + application/json: + schema: + type: object + properties: + redirectUrl: + type: string + example: "/trades/create?requested_card=123&owner=456" + 400: + description: Невозможно предложить обмен + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Недостаточно карт для обмена" + 409: + description: Конфликт при попытке обмена + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Невозможно предложить обмен - у владельца только один экземпляр этой карты" + cardQuantity: + type: integer + example: 1 + description: "Количество экземпляров карты у владельца" + 500: + $ref: '#/components/responses/ServerError' + + /other-profile/{user_ID}/report: + post: + tags: [OtherProfile] + summary: Подача жалобы на пользователя + description: | + Перенаправляет на страницу создания жалобы. + security: + - bearerAuth: [] + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + description: ID пользователя, на которого подается жалоба + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + reason: + type: string + enum: ["Неуместный никнейм", "Неуместный аватар", "Другое"] + example: "Неуместный никнейм" + description: "Причина жалобы" + comment: + type: string + maxLength: 500 + nullable: true + example: "Никнейм содержит нецензурные слова" + description: "Дополнительные комментарии" + required: [reason] + responses: + 200: + description: Перенаправление на страницу создания жалобы + content: + application/json: + schema: + type: object + properties: + redirectUrl: + type: string + example: "/report/create?reported_user=123" + reportDraft: + $ref: "#/components/schemas/Report" + 500: + $ref: '#/components/responses/ServerError' + + /inventory: + get: + tags: [Inventory] + summary: Получение данных инвентаря + description: | + Загружает данные инвентаря пользователя. + - Проверяет авторизацию пользователя + - Если пользователь не авторизован - возвращает ошибку 401 + - Если авторизован - возвращает список его карт, список избранных карт и баланс + security: + - bearerAuth: [] + responses: + 200: + description: Успешная загрузка инвентаря + content: + application/json: + schema: + type: object + properties: + inventory: + type: array + items: + $ref: "#/components/schemas/Card" + favoriteCards: + type: array + items: + type: integer + description: "ID избранных карт" + collections: + type: array + items: + $ref: "#/components/schemas/Collection" + balance: + type: integer + example: 2500 + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /inventory/card/{card_ID}/quantity: + get: + tags: [Inventory] + summary: Проверка количества экземпляров карты + description: | + Возвращает количество экземпляров карты у пользователя. + Если экземпляров больше 1 - можно разбирать/выставлять на обмен. + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 200: + description: Информация о количестве карт + content: + application/json: + schema: + type: object + properties: + count: + type: integer + example: 3 + canDisassemble: + type: boolean + example: true + canTrade: + type: boolean + example: true + 500: + $ref: '#/components/responses/ServerError' + + /inventory/favorites/count: + get: + tags: [Inventory] + summary: Получение количества избранных карт + description: | + Возвращает текущее количество избранных карт. + Если количество меньше 5 - можно добавлять новые карты в избранное. + security: + - bearerAuth: [] + responses: + 200: + description: Количество избранных карт + content: + application/json: + schema: + type: object + properties: + count: + type: integer + example: 3 + canAddMore: + type: boolean + example: true + 500: + $ref: '#/components/responses/ServerError' + + /inventory/card/{card_ID}/favorite: + get: + tags: [Inventory] + summary: Проверка статуса карты + description: | + Проверяет, добавлена ли карта в избранное. + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 200: + description: Статус избранного + content: + application/json: + schema: + type: object + properties: + isFavorite: + type: boolean + example: false + 500: + $ref: '#/components/responses/ServerError' + /inventory/card/{card_ID}/favorite-add: + post: + tags: [Inventory] + summary: Добавление карты в избранное + description: | + Добавляет карту в избранное, если: + - Карта не добавлена в "избранное" + - Общее количество избранных карт < 5 + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 200: + description: Карта успешно добавлена в избранное + 400: + description: Невозможно добавить карту в избранное + 500: + $ref: '#/components/responses/ServerError' + + /inventory/card/{card_ID}/favorite-delete: + delete: + tags: [Inventory] + summary: Удаление карты из избранного + description: | + Удаляет карту из избранного. + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 200: + description: Карта успешно удалена из избранного + 500: + $ref: '#/components/responses/ServerError' + + /inventory/sort: + post: + tags: [Inventory] + summary: Сортировка карт в инвентаре + description: | + Сортирует карты в инвентаре(по редкости, по коллекциям): + - При выборе по редкости: + - 1 нажатие: по убыванию редкости (Уникальная → Легендарная → Эпическая → Редкая → Обычная) + - 2 нажатие: по возрастанию редкости + - 3 нажатие: сброс сортировки + - При выборе "по коллекциям": сначала идут карты из одной коллекции, коллекции сортируются по ID. + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + sortType: + type: string + enum: [rarity_desc, rarity_asc, collection, reset] + responses: + 200: + description: Отсортированный список карт + content: + application/json: + schema: + type: object + properties: + cards: + type: array + items: + $ref: "#/components/schemas/Card" + 500: + $ref: '#/components/responses/ServerError' + + /inventory/destroy: + post: + tags: [Inventory] + summary: Разбор карты на валюту + description: | + Разбирает карту на валюту, если: + - У пользователя есть минимум 2 экземпляра этой карты + - Добавляет стоимость карты на баланс пользователя + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + card_ID: + type: integer + minimum: 1 + example: 501 + required: [card_ID] + responses: + 200: + description: Карта успешно разобрана + content: + application/json: + schema: + type: object + properties: + newBalance: + type: integer + example: 2550 + destroyedCardId: + type: integer + example: 501 + 500: + $ref: '#/components/responses/ServerError' + /inventory/card/{card_ID}/trade-status: + get: + tags: [Inventory] + summary: Проверка статуса обмена карты + description: | + Проверяет, выставлена ли карта на обмен. + Возвращает статус карты. + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 200: + description: Статус обмена карты + content: + application/json: + schema: + type: object + properties: + isOnTrade: + type: boolean + example: true + description: "Выставлена ли карта на обмен" + 500: + $ref: '#/components/responses/ServerError' + + /inventory/put-on-trade: + post: + tags: [Inventory] + summary: Выставление карты на обмен + description: | + Выставляет карту на обмен, если: + - У пользователя есть минимум 2 экземпляра этой карты + - Карта еще не выставлена на обмен + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + card_ID: + type: integer + minimum: 1 + example: 501 + required: [card_ID] + responses: + 200: + description: Карта готова к обмену + content: + application/json: + schema: + type: object + properties: + redirectUrl: + type: string + example: "/trades/create?requested_card=123&owner=456" + 400: + description: Невозможно выставить карту на обмен + 500: + $ref: '#/components/responses/ServerError' + + /inventory/card/{card_ID}/trade-cancel: + post: + tags: [Inventory] + summary: Снятие карты с обмена + description: Возвращает карту из раздела "На обмен" в Инвентарь + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 200: + description: Карта успешно снята с обмена + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Карта успешно снята с обмена" + 500: + $ref: '#/components/responses/ServerError' + /home/search: + get: + tags: [Home] + summary: Поиск пользователей + description: | + Поиск пользователей по никнейму или ID + parameters: + - in: query + name: query + description: Никнейм или ID пользователя + schema: + type: string + responses: + 200: + description: Список найденных пользователей + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/User" + 400: + description: Неверный запрос + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Введите минимум 3 символа для поиска" + 404: + description: Пользователь не найден + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Пользователь с введеными данными не найден" + 500: + $ref: '#/components/responses/ServerError' + + /home/notifications: + get: + tags: [Home] + summary: Просмотр уведомлений + description: | + Возвращает список уведомлений пользователя + security: + - bearerAuth: [] + responses: + 200: + description: Список уведомлений + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Notification" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /home/notifications/{notification_ID}: + get: + tags: [Home] + summary: Просмотр уведомления + description: | + Возвращает информацию по конкретному уведомлению + security: + - bearerAuth: [] + parameters: + - in: path + name: notification_ID + required: true + schema: + type: integer + example: 123 + description: "ID уведомления" + responses: + 200: + description: Детальная информация об уведомлении + content: + application/json: + schema: + $ref: "#/components/schemas/Notification" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /home/notifications/{notification_ID}/navigate: + post: + tags: [Home] + summary: Переход по ссылке в уведомлении + description: | + Перенаправляет на страницу обмена, связанного с уведомлением + security: + - bearerAuth: [] + parameters: + - in: path + name: notification_ID + required: true + schema: + type: integer + responses: + 200: + description: Перенаправление на страницу обмена + content: + application/json: + schema: + type: object + properties: + redirectUrl: + type: string + example: "/trades/123" + 404: + description: Предложение обмена не найдено + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Данное предложение обмена уже не существует" + 500: + $ref: '#/components/responses/ServerError' + /home/generate-card/themes: + get: + tags: [Home] + summary: Получение списка тем для генерации карт + description: | + Возвращает список доступных тем для генерации уникальных карт + security: + - bearerAuth: [] + responses: + 200: + description: Список тем + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Theme" + 500: + $ref: '#/components/responses/ServerError' + /home/generate-card: + post: + tags: [Home] + summary: Генерация уникальной карты + description: | + Генерирует уникальную карту по выбранной теме, если на балансе достаточно средств + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + theme_ID: + type: integer + example: 901 + description: "ID выбранной темы" + required: [theme_ID] + responses: + 200: + description: Карта успешно сгенерирована + content: + application/json: + schema: + type: object + properties: + card: + $ref: "#/components/schemas/Card" + newBalance: + type: integer + example: 1500 + 402: + description: Недостаточно средств + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Недостаточно средств для генерации карты" + requiredAmount: + type: integer + example: 1000 + 500: + $ref: '#/components/responses/ServerError' + /home/news: + get: + tags: [Home] + summary: Получение списока новостей + description: | + Возвращает список новостей + responses: + 200: + description: Список новостей + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/News" + 404: + description: Новостей не найдено + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Новостей пока нет" + 500: + $ref: '#/components/responses/ServerError' + /home/news/{news_ID}: + get: + tags: [Home] + summary: Просмотр новости + description: | + Возвращает полную информацию по конкретной новости + parameters: + - in: path + name: news_ID + required: true + schema: + type: integer + responses: + 200: + description: Детальная информация о новости + content: + application/json: + schema: + $ref: "#/components/schemas/News" + 500: + $ref: '#/components/responses/ServerError' + /home/quests: + get: + tags: [Home] + summary: Получение списка квестов + description: | + Возвращает список ежедневных и еженедельных квестов с их статусом + security: + - bearerAuth: [] + responses: + 200: + description: Список квестов + content: + application/json: + schema: + type: object + properties: + dailyQuests: + type: array + items: + $ref: "#/components/schemas/Quest" + weeklyQuests: + type: array + items: + $ref: "#/components/schemas/Quest" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + /home/quests/{quest_ID}/change-status: + post: + tags: [Home] + summary: Изменение статуса выполнения квеста + description: | + Изменение статуса выполнения квеста + security: + - bearerAuth: [] + parameters: + - in: path + name: quest_ID + required: true + schema: + type: integer + example: 123 + description: "ID квеста" + responses: + 200: + description: Статус квеста успешно изменен + content: + application/json: + schema: + type: object + properties: + quest: + $ref: "#/components/schemas/Quest" + message: + type: string + example: "Статус квеста успешно изменен" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /home/quests/claim-reward: + post: + tags: [Home] + summary: Получение награды за выполнение квестов + description: | + Выдает награду за выполнение квестов + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + questType: + type: string + enum: [daily, weekly] + example: "daily" + required: [questType] + responses: + 200: + description: Награда получена + content: + application/json: + schema: + type: object + properties: + receivedCoins: + type: integer + example: 500 + receivedPacks: + type: array + items: + $ref: "#/components/schemas/Pack" + newBalance: + type: integer + example: 2000 + 400: + description: Не все квесты выполнены + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Выполнены не все квесты, необходимые для получения награды" + 500: + $ref: '#/components/responses/ServerError' + /trades: + get: + tags: [Trades] + summary: Получить все доступные предложения обмена + description: | + Возвращает список всех доступных предложений обмена. + Можно провести поиск по названию карты. + parameters: + - in: query + name: search + description: Поиск по названию карты + schema: + type: string + responses: + 200: + description: Список предложений обмена + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Trade" + 500: + $ref: '#/components/responses/ServerError' + /trades/{trade_id}: + get: + tags: [Trades] + summary: Получить детали предложения обмена + description: | + Возвращает полную информацию о конкретном предложении обмена. + parameters: + - in: path + name: trade_id + required: true + schema: + type: integer + responses: + 200: + description: Детали предложения обмена + content: + application/json: + schema: + $ref: "#/components/schemas/Trade" + 404: + description: Предложение обмена не найдено + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Предложение обмена не найдено" + 500: + $ref: '#/components/responses/ServerError' + /trades/initiate: + post: + tags: [Trades] + summary: Создать новое предложение обмена + description: | + Создает новое предложение обмена. + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + offeredCardId: + type: integer + example: 401 + description: ID карты, которую предлагает текущий пользователь + requestedCardId: + type: array + items: + type: integer + description: ID карт, на которые пользователь готов совершить "быстрый обмен" + example: [100, 200] + required: [receivingUserId, requestedCardId, offeredCardId] + responses: + 201: + description: Предложение обмена успешно создано + content: + application/json: + schema: + $ref: "#/components/schemas/Trade" + 400: + description: Невозможно создать предложение обмена + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Недостаточно карт для обмена" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + /trades/my: + get: + tags: [Trades] + summary: Получение моих обменов + description: | + Возвращает список всех обменов текущего пользователя с их статусами. + security: + - bearerAuth: [] + parameters: + - in: query + name: user_id + required: true + schema: + type: integer + example: 123 + description: "ID текущего пользователя" + responses: + 200: + description: Список моих обменов + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Trade" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + /trades/{trade_id}/accept: + post: + tags: [Trades] + summary: Принять предложение обмена + description: | + Принимает предложение обмена, если текущий пользователь - получатель обмена. + security: + - bearerAuth: [] + parameters: + - in: path + name: trade_id + required: true + schema: + type: integer + responses: + 200: + description: Обмен успешно принят + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Обмен успешно завершен" + + 401: + $ref: "#/components/responses/Unauthorized" + 403: + description: Нет прав для принятия этого обмена + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Вы не можете принять этот обмен" + 500: + $ref: '#/components/responses/ServerError' + + /trades/{trade_id}/reject: + post: + tags: [Trades] + summary: Отклонить предложение обмена + description: | + Отклоняет предложение обмена, если текущий пользователь - получатель обмена. + security: + - bearerAuth: [] + parameters: + - in: path + name: trade_id + required: true + schema: + type: integer + responses: + 200: + description: Обмен успешно отклонен + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Обмен отклонен" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /trades/{trade_id}/cancel: + post: + tags: [Trades] + summary: Отменить предложение обмена + description: | + Отменяет предложение обмена, если текущий пользователь является инициатором. + security: + - bearerAuth: [] + parameters: + - in: path + name: trade_id + required: true + schema: + type: integer + responses: + 200: + description: Обмен успешно отменен + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Обмен отменен" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /shop/packs: + get: + tags: [Shop] + summary: Получение списка наборов + description: | + Возвращает список доступных для покупки наборов карт + responses: + 200: + description: Список наборов + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Pack" + 500: + $ref: '#/components/responses/ServerError' + + /shop/packs/{pack_id}: + get: + tags: [Shop] + summary: Просмотр содержимого набора + description: | + Возвращает подробную информацию о наборе и возможных картах + parameters: + - in: path + name: pack_id + required: true + schema: + type: integer + responses: + 200: + description: Информация о наборе + content: + application/json: + schema: + $ref: "#/components/schemas/Pack" + 500: + $ref: '#/components/responses/ServerError' + /shop/packs/{pack_id}/buy: + post: + tags: [Shop] + summary: Покупка набора карт + description: | + Покупает набор карт, если: + - Пользователь авторизован + - На балансе достаточно средств + security: + - bearerAuth: [] + parameters: + - in: path + name: pack_id + required: true + schema: + type: integer + responses: + 200: + description: Успешная покупка + content: + application/json: + schema: + type: object + properties: + receivedCards: + type: array + items: + $ref: "#/components/schemas/Card" + newBalance: + type: integer + 401: + $ref: "#/components/responses/Unauthorized" + 402: + description: Недостаточно средств + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Недостаточно средств на балансе" + requiredAmount: + type: integer + example: 1000 + 500: + $ref: '#/components/responses/ServerError' + /shop/packs/{pack_id}/open: + post: + tags: [Shop] + summary: Открытие купленного набора карт + description: | + Открывает ранее купленный набор карт, показывая выпавшие карты + и добавляя их в инвентарь пользователя. + security: + - bearerAuth: [] + parameters: + - in: path + name: pack_id + required: true + schema: + type: integer + example: 1 + description: "ID набора карт" + responses: + 200: + description: Набор успешно открыт + content: + application/json: + schema: + type: object + properties: + receivedCards: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Карты, полученные из набора" + newCardsAdded: + type: boolean + example: true + description: "Были ли карты успешно добавлены в инвентарь" + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + + /shop/coins/offers: + get: + tags: [Shop] + summary: Получение предложений по монетам + description: | + Возвращает список доступных пакетов монет + responses: + 200: + description: Список предложений + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/CoinOffer" + 500: + $ref: '#/components/responses/ServerError' + /shop/coins/offers/{offer_id}: + get: + tags: [Shop] + summary: Просмотр предложения монет + description: | + Возвращает детализацию предложения по монетам + parameters: + - in: path + name: offer_id + required: true + schema: + type: integer + responses: + 200: + description: Информация о предложении + content: + application/json: + schema: + $ref: "#/components/schemas/CoinOffer" + 500: + $ref: '#/components/responses/ServerError' + /shop/coins/offers/{offer_id}/purchase: + post: + tags: [Shop] + summary: Покупка монет + description: | + Инициирует процесс покупки монет через платежный шлюз + security: + - bearerAuth: [] + parameters: + - in: path + name: offer_id + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + redirectUrl: + type: string + format: uri + example: "https://cardly.ru/shop/payment-callback" + required: [redirectUrl] + responses: + 200: + description: Перенаправление на платежный шлюз + content: + application/json: + schema: + type: object + properties: + paymentUrl: + type: string + format: uri + 401: + $ref: "#/components/responses/Unauthorized" + 500: + $ref: '#/components/responses/ServerError' + /shop/payments/process: + post: + tags: [Shop] + summary: Обработка платежа + description: | + обработка результата платежа от платежного шлюза + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/PaymentCallback" + responses: + 200: + description: Платеж обработан + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + transactionId: + type: string + 500: + $ref: '#/components/responses/ServerError' + /admin/cards: + post: + tags: [Admin] + summary: Создание новой карты + description: Создает новую карту в системе + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Card' + responses: + 201: + description: Карта успешно создана + content: + application/json: + schema: + $ref: '#/components/schemas/Card' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/cards/{card_ID}: + put: + tags: [Admin] + summary: Обновление карты + description: Обновляет информацию о карте + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Card' + responses: + 200: + description: Карта успешно обновлена + content: + application/json: + schema: + $ref: '#/components/schemas/Card' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + delete: + tags: [Admin] + summary: Удаление карты + description: Удаляет карту из системы + security: + - bearerAuth: [] + parameters: + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 204: + description: Карта успешно удалена + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/collections: + post: + tags: [Admin] + summary: Создание новой коллекции + description: Создает новую коллекцию карт + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Collection' + responses: + 201: + description: Коллекция успешно создана + content: + application/json: + schema: + $ref: '#/components/schemas/Collection' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/collections/{collection_ID}: + put: + tags: [Admin] + summary: Обновление коллекции + description: Обновляет информацию о коллекции + security: + - bearerAuth: [] + parameters: + - in: path + name: collection_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Collection' + responses: + 200: + description: Коллекция успешно обновлена + content: + application/json: + schema: + $ref: '#/components/schemas/Collection' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + delete: + tags: [Admin] + summary: Удаление коллекцию + description: Удаляет коллекцию из системы + security: + - bearerAuth: [] + parameters: + - in: path + name: collection_ID + required: true + schema: + type: integer + responses: + 204: + description: Коллекция успешно удалена + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/packs: + post: + tags: [Admin] + summary: Создание нового набора + description: Создает новый набор карт + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Pack' + responses: + 201: + description: Набор успешно создан + content: + application/json: + schema: + $ref: '#/components/schemas/Pack' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/packs/{pack_ID}: + put: + tags: [Admin] + summary: Обновление набора + description: Обновляет информацию о наборе + security: + - bearerAuth: [] + parameters: + - in: path + name: pack_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Pack' + responses: + 200: + description: Набор успешно обновлен + content: + application/json: + schema: + $ref: '#/components/schemas/Pack' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + delete: + tags: [Admin] + summary: Удаление набор + description: Удаляет набор из системы + security: + - bearerAuth: [] + parameters: + - in: path + name: pack_ID + required: true + schema: + type: integer + responses: + 204: + description: Набор успешно удален + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/coin-offers: + post: + tags: [Admin] + summary: Создание предложения покупки монет + description: Создает новое предложение покупки монет в системе + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CoinOffer' + responses: + 201: + description: Предложение успешно создано + content: + application/json: + schema: + $ref: '#/components/schemas/CoinOffer' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + + get: + tags: [Admin] + summary: Получение списка предложений покупки монет + description: Возвращает список всех предложений покупки монет + security: + - bearerAuth: [] + responses: + 200: + description: Список предложений успешно получен + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/CoinOffer' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + + /admin/coin-offers/{offer_id}: + put: + tags: [Admin] + summary: Обновление предложения покупки монет + description: Обновляет информацию о предложении покупки монет + security: + - bearerAuth: [] + parameters: + - in: path + name: offer_id + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CoinOffer' + responses: + 200: + description: Предложение успешно обновлено + content: + application/json: + schema: + $ref: '#/components/schemas/CoinOffer' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + + delete: + tags: [Admin] + summary: Удаление предложения покупки монет + description: Удаляет предложение покупки монет из системы + security: + - bearerAuth: [] + parameters: + - in: path + name: offer_id + required: true + schema: + type: integer + responses: + 204: + description: Предложение успешно удалено + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/news: + post: + tags: [Admin] + summary: Создание новости + description: Создает новую новость в системе + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/News' + responses: + 201: + description: Новость успешно создана + content: + application/json: + schema: + $ref: '#/components/schemas/News' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/news/{news_ID}: + put: + tags: [Admin] + summary: Обновление новости + description: Обновляет информацию о новости + security: + - bearerAuth: [] + parameters: + - in: path + name: news_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/News' + responses: + 200: + description: Новость успешно обновлена + content: + application/json: + schema: + $ref: '#/components/schemas/News' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + delete: + tags: [Admin] + summary: Удаление новости + description: Удаляет новость из системы + security: + - bearerAuth: [] + parameters: + - in: path + name: news_ID + required: true + schema: + type: integer + responses: + 204: + description: Новость успешно удалена + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/achievements: + post: + tags: [Admin] + summary: Создание достижения + description: Создает новое достижение в системе + security: + - bearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Achievement' + responses: + 201: + description: Достижение успешно создано + content: + application/json: + schema: + $ref: '#/components/schemas/Achievement' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/achievements/{achievement_ID}: + put: + tags: [Admin] + summary: Обновление достижения + description: Обновляет информацию о достижении + security: + - bearerAuth: [] + parameters: + - in: path + name: achievement_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Achievement' + responses: + 200: + description: Достижение успешно обновлено + content: + application/json: + schema: + $ref: '#/components/schemas/Achievement' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + delete: + tags: [Admin] + summary: Удаление достижения + description: Удаляет достижение из системы + security: + - bearerAuth: [] + parameters: + - in: path + name: achievement_ID + required: true + schema: + type: integer + responses: + 204: + description: Достижение успешно удалено + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/trades: + get: + tags: [Admin] + summary: Получение списка обменов + description: Возвращает список всех обменов в системе + security: + - bearerAuth: [] + responses: + 200: + description: Список обменов + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Trade' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/trades/{trade_ID}/invalidate: + post: + tags: [Admin] + summary: Признание обмена недействительным + description: | + Помечает обмен как недействительный и возвращает карты участникам + security: + - bearerAuth: [] + parameters: + - in: path + name: trade_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + reason: + type: string + description: Причина аннулирования обмена + required: [reason] + responses: + 200: + description: Обмен аннулирован + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Обмен успешно аннулирован" + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/reports: + get: + tags: [Admin] + summary: Просмотр списка жалоб + description: Возвращает список всех жалоб в системе + security: + - bearerAuth: [] + responses: + 200: + description: Список жалоб + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Report' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/reports/{report_ID}: + get: + tags: [Admin] + summary: Просмотр деталей жалобы + description: Возвращает полную информацию о жалобе + security: + - bearerAuth: [] + parameters: + - in: path + name: report_ID + required: true + schema: + type: integer + responses: + 200: + description: Детали жалобы + content: + application/json: + schema: + $ref: '#/components/schemas/Report' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + put: + tags: [Admin] + summary: Обновление статуса жалобы + description: Обновляет статус жалобы и применяет меры к пользователю + security: + - bearerAuth: [] + parameters: + - in: path + name: report_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + status: + type: string + enum: [pending, reviewed, resolved] + example: "resolved" + action: + type: string + enum: [none, warning, temporary_ban, permanent_ban] + example: "temporary_ban" + banDurationDays: + type: integer + nullable: true + example: 7 + description: "Длительность бана в днях (только для temporary_ban)" + comment: + type: string + nullable: true + example: "Пользователь получил временный бан на 7 дней за нарушение правил" + required: [status, action] + responses: + 200: + description: Статус жалобы обновлен + content: + application/json: + schema: + $ref: '#/components/schemas/Report' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 404: + description: Жалоба не найдена + 500: + $ref: '#/components/responses/ServerError' + /admin/users/{user_ID}/ban: + post: + tags: [Admin] + summary: Блокировка пользователя + description: Блокирует пользователя на указанный срок или навсегда + security: + - bearerAuth: [] + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + banType: + type: string + enum: [temporary, permanent] + example: "temporary" + durationDays: + type: integer + nullable: true + example: 7 + description: "Длительность бана в днях" + reason: + type: string + example: "Нарушение правил сообщества" + required: [banType, reason] + responses: + 200: + description: Пользователь заблокирован + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Пользователь успешно заблокирован" + banEndDate: + type: string + format: date-time + nullable: true + example: "2024-06-20T12:00:00Z" + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 404: + description: Пользователь не найден + 500: + $ref: '#/components/responses/ServerError' + /admin/users/{user_ID}/unban: + post: + tags: [Admin] + summary: Разблокировка пользователя + description: Снимает блокировку с пользователя + security: + - bearerAuth: [] + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + responses: + 200: + description: Пользователь разблокирован + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Пользователь успешно разблокирован" + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 404: + description: Пользователь не найден + 500: + $ref: '#/components/responses/ServerError' + /admin/users/{user_ID}/delete: + delete: + tags: [Admin] + summary: Удаление пользователя + description: Полностью удаляет аккаунт пользователя из системы + security: + - bearerAuth: [] + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + responses: + 204: + description: Пользователь успешно удален + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 404: + description: Пользователь не найден + 500: + $ref: '#/components/responses/ServerError' + /admin/users/{user_ID}/inventory/{card_ID}: + delete: + tags: [Admin] + summary: Удаление карты из инвентаря пользователя + description: Удаляет конкретную карту из коллекции пользователя + security: + - bearerAuth: [] + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + - in: path + name: card_ID + required: true + schema: + type: integer + responses: + 204: + description: Карта успешно удалена из инвентаря + 400: + description: Неверный запрос + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/users/{user_ID}/achievements/{achievement_ID}: + delete: + tags: [Admin] + summary: Отзыв достижения у пользователя + description: Удаляет достижение из списка полученных пользователем + security: + - bearerAuth: [] + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + - in: path + name: achievement_ID + required: true + schema: + type: integer + responses: + 204: + description: Достижение успешно отозвано + 400: + description: Неверный запрос + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/users/{user_ID}/quests/{quest_ID}/reset: + post: + tags: [Admin] + summary: Сброс выполнения квеста + description: Сбрасывает статус выполнения квеста для пользователя + security: + - bearerAuth: [] + parameters: + - in: path + name: user_ID + required: true + schema: + type: integer + - in: path + name: quest_ID + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + reason: + type: string + description: Причина сброса квеста + removeRewards: + type: boolean + default: false + description: Нужно ли удалить награды за квест + required: [reason] + responses: + 200: + description: Квест успешно сброшен + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: "Квест успешно сброшен" + rewardsRemoved: + type: boolean + example: true + 400: + description: Неверный запрос + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /admin/stats: + get: + tags: [Admin] + summary: Получение статистики системы + description: Возвращает статистику по пользователям, картам, обменам и т.д. + security: + - bearerAuth: [] + responses: + 200: + description: Статистика системы + content: + application/json: + schema: + type: object + properties: + totalUsers: + type: integer + example: 1000 + activeUsers: + type: integer + example: 750 + bannedUsers: + type: integer + example: 25 + totalCards: + type: integer + example: 5000 + totalTrades: + type: integer + example: 1200 + completedTrades: + type: integer + example: 1000 + invalidatedTrades: + type: integer + example: 50 + pendingReports: + type: integer + example: 15 + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' +components: + schemas: + News: + type: object + properties: + news_ID: + type: integer + example: 1 + description: "Уникальный идентификатор новости" + title: + type: string + example: "Новое обновление системы" + description: "Заголовок новости" + content: + type: string + example: "Мы добавили новые карты в коллекцию" + description: "Содержание новости" + pictures: + type: array + items: + type: string + format: url + example: ["https://example.com/news1.jpg", "https://example.com/news2.jpg"] + description: "Ссылки на изображения" + datePosted: + type: string + format: date-time + example: "2024-05-20T14:48:00Z" + description: "Дата публикации" + required: + - news_ID + - title + - content + - datePosted + + Achievement: + type: object + properties: + achievement_ID: + type: integer + example: 101 + description: "Уникальный идентификатор достижения" + name: + type: string + example: "Мастер коллекционирования" + description: "Название достижения" + imageURL: + type: string + format: url + example: "https://example.com/achievements/master.png" + description: "Ссылка на изображение" + description: + type: string + example: "Соберите 10 полных коллекций" + description: "Описание достижения" + isUnlocked: + type: boolean + example: false + description: "Статус получения" + required: + - achievement_ID + - name + - imageURL + - description + - isUnlocked + + Notification: + type: object + properties: + notification_ID: + type: integer + example: 201 + description: "Уникальный идентификатор уведомления" + user: + $ref: "#/components/schemas/User" + description: "Пользователь, которому отправлено уведомление" + message: + type: string + example: "Ваша карта была успешно обменяна" + description: "Текст уведомления" + links: + type: array + items: + type: string + format: url + example: ["https://example.com/exchange-details"] + description: "Ссылка на подробности обмена" + notificationDateTime: + type: string + format: date-time + example: "2024-05-20T15:30:00Z" + description: "Дата и время уведомления" + required: + - notification_ID + - user + - message + - notificationDateTime + + Report: + type: object + properties: + report_ID: + type: integer + example: 301 + description: "Уникальный идентификатор жалобы" + reporter: + $ref: "#/components/schemas/User" + description: "Пользователь, отправивший жалобу" + reportedUser: + $ref: "#/components/schemas/User" + description: "Пользователь, на которого пожаловались" + reportDateTime: + type: string + format: date-time + example: "2024-05-20T16:45:00Z" + description: "Дата и время жалобы" + reason: + type: string + example: "Непристойный контент" + description: "непристойный никнейм" + status: + type: string + enum: ["На рассмотрении", "Подтверждено", "Отклонено"] + example: "На расмотрении" + description: "Статус рассмотрения" + required: + - report_ID + - reporter + - reportedUser + - reportDateTime + - reason + - status + + Pack: + type: object + properties: + pack_ID: + type: integer + example: 401 + description: "Уникальный идентификатор набора" + name: + type: string + example: "Стартовый набор" + description: "Название набора" + imageURL: + type: string + format: url + example: "https://example.com/packs/starter.png" + description: "Ссылка на изображение" + cards: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Карты в наборе" + price: + type: integer + example: 1000 + description: "Цена" + required: + - pack_ID + - name + - imageURL + - cards + - price + + Card: + type: object + properties: + card_ID: + type: integer + example: 501 + description: "Уникальный идентификатор карты" + name: + type: string + example: "Ледяной феникс" + description: "Название карты" + imageURL: + type: string + format: url + example: "https://example.com/cards/pheonix.png" + description: "Ссылка на изображение" + description: + type: string + example: "Ледяной Феникс — это мифическое существо, воплощающее силу зимы и вечного обновления. Его перья сверкают как морозный утренний иней, а глаза светятся холодным синим светом." + description: "Описание карты" + rarity: + type: string + enum: ["Обычная", "Редкая", "Эпическая", "Легендарная", "Уникальная"] + example: "Редкая" + description: "Редкость карты" + min_price: + type: integer + example: 50 + description: "Минимальная цена - используется для разбора карточки" + theme: + type: string + nullable: true + example: "Мифическое существо" + description: "Тематика, на которую была сгенерирвана карта (только для уникальных карт)" + isGenerated: + type: boolean + example: false + description: "Флаг показывающий сгенерированная ли карта (true для уникальных, false для остальных)" + required: + - card_ID + - name + - imageURL + - rarity + - min_price + - isGenerated + + User: + type: object + properties: + user_ID: + type: integer + example: 1 + description: "Уникальный идентификатор" + username: + type: string + example: "Коллекционер_123" + description: "Имя пользователя" + email: + type: string + format: email + example: "user@example.com" + description: "Электронная почта" + password: + type: string + format: password + writeOnly: true + description: "Пароль" + favoriteCards: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Избранные карты" + onChange: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Карты на обмен" + inventoryCards: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Карты в инвентаре" + balance: + type: integer + example: 2500 + description: "Баланс" + avatar_url: + type: string + format: url + example: "https://example.com/avatars/user1.png" + description: "Аватар пользователя" + achievements: + type: array + items: + $ref: "#/components/schemas/Achievement" + description: "Достижения" + favoriteAchievements: + type: array + items: + $ref: "#/components/schemas/Achievement" + description: "Избранные достижения" + notifications: + type: array + items: + $ref: "#/components/schemas/Notification" + description: "Уведомления" + required: + - user_ID + - username + - email + - password + - balance + - inventoryCards + - achievements + + Payment: + type: object + properties: + payment_ID: + type: integer + example: 601 + description: "Уникальный идентификатор платежа" + user: + $ref: "#/components/schemas/User" + description: "Пользователь" + paymentSUM: + type: number + format: double + example: 199.99 + description: "Сумма платежа" + bankCardData: + type: array + items: + type: string + writeOnly: true + description: "Данные карты (только для записи)" + paymentStatus: + type: string + enum: ["В обработке", "Оплачено", "Ошибка"] + example: "Оплачено" + description: "Статус платежа" + paymentDateTime: + type: string + format: date-time + example: "2024-05-20T17:30:00Z" + description: "Дата и время платежа" + required: + - payment_ID + - user + - paymentSUM + - paymentStatus + - paymentDateTime + + Trade: + type: object + properties: + trade_ID: + type: integer + example: 701 + description: "Уникальный идентификатор обмена" + offeringUser: + $ref: "#/components/schemas/User" + description: "Пользователь, предлагающий обмен" + offeringCards: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Предлагаемые карты" + receivingUser: + $ref: "#/components/schemas/User" + description: "Пользователь, получающий предложение" + receivingCards: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Запрашиваемые карты" + isConfirmed: + type: boolean + example: false + description: "Статус подтверждения" + tradeDateTime: + type: string + format: date-time + example: "2024-05-20T18:00:00Z" + description: "Дата и время обмена" + required: + - trade_ID + - offeringUser + - offeringCards + - receivingUser + - receivingCards + - isConfirmed + - tradeDateTime + + Collection: + type: object + properties: + collection_ID: + type: integer + example: 801 + description: "Уникальный идентификатор коллекции" + name: + type: string + example: "Драконы" + description: "Название коллекции" + cards: + type: array + items: + $ref: "#/components/schemas/Card" + description: "Карты в коллекции" + imageURL: + type: string + format: url + example: "https://example.com/collections/dragons.png" + description: "Обложка коллекции" + required: + - collection_ID + - name + - cards + - imageURL + + Theme: + type: object + properties: + theme_ID: + type: integer + example: 901 + description: "Уникальный идентификатор темы" + name: + type: string + example: "Мифические существа" + description: "Название темы" + description: + type: string + example: "Создайте изображение мифического существа" + description: "Описание темы" + required: + - theme_ID + - name + + UserStats: + type: object + properties: + totalCards: + type: integer + example: 150 + completedCollections: + type: integer + example: 5 + + CoinOffer: + type: object + properties: + offer_id: + type: integer + example: 1 + name: + type: string + example: "Стартовый набор" + coinsAmount: + type: integer + example: 100 + price: + type: number + format: double + example: 99.90 + imageUrl: + type: string + format: uri + description: + type: string + nullable: true + example: "Стартовый набор. Вы можете получить..." + + PaymentCallback: + type: object + properties: + transactionId: + type: string + status: + type: string + enum: ["Успешно", "Ошибка", "В процессе"] + amount: + type: number + currency: + type: string + offerId: + type: integer + required: + - transactionId + - status + - amount + + + UserSettings: + type: object + properties: + notificationsEnabled: + type: boolean + example: true + description: "Включены ли уведомления" + showInventory: + type: boolean + example: false + description: "Виден ли инвентарь другим пользователям" + autoDeclineTrades: + type: boolean + example: false + description: "Автоматически отклонять все входящие предложения обмена" + required: + - notificationsEnabled + - showInventory + - autoDeclineTrades + + Quest: + type: object + properties: + quest_ID: + type: integer + example: 1 + description: "Уникальный идентификатор квеста" + name: + type: string + example: "Соберите 5 карт" + description: "Название квеста" + description: + type: string + example: "Соберите 5 карт из коллекции Драконы" + description: "Описание квеста" + progress: + type: integer + example: 3 + description: "Текущий прогресс" + target: + type: integer + example: 5 + description: "Целевое значение" + rewardCoins: + type: integer + example: 200 + description: "Награда в монетах" + rewardPacks: + type: array + items: + $ref: "#/components/schemas/Pack" + description: "Награда в наборах" + isCompleted: + type: boolean + example: false + description: "Выполнен ли квест" + isClaimed: + type: boolean + example: false + description: "Получена ли награда" + required: + - quest_ID + - name + - description + - progress + - target + - rewardCoins + - isCompleted + - isClaimed + + responses: + BadRequest: + description: Неверный формат запроса + + Unauthorized: + description: Ошибка аутентификации + + ServerError: + description: Что-то пошло не так + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: "Что-то пошло не так, попробуйте позже" + code: + type: string + example: "INTERNAL_SERVER_ERROR" + timestamp: + type: string + format: date-time + example: "2024-05-20T12:00:00Z" + + + InvalidToken: + description: Невалидный токен + + Forbidden: + description: Доступ запрещен + + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT \ No newline at end of file diff --git "a/Documentation/Testing/\320\237\320\273\320\260\320\275 \321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217 Cardly.docx" "b/Documentation/Testing/\320\237\320\273\320\260\320\275 \321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217 Cardly.docx" new file mode 100644 index 0000000..9361392 Binary files /dev/null and "b/Documentation/Testing/\320\237\320\273\320\260\320\275 \321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217 Cardly.docx" differ diff --git "a/Documentation/Testing/\320\237\320\273\320\260\320\275 \321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217 Cardly.pdf" "b/Documentation/Testing/\320\237\320\273\320\260\320\275 \321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217 Cardly.pdf" new file mode 100644 index 0000000..7ac3de8 Binary files /dev/null and "b/Documentation/Testing/\320\237\320\273\320\260\320\275 \321\202\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217 Cardly.pdf" differ diff --git "a/Documentation/Testing/\320\247\320\265\320\272-\320\273\320\270\321\201\321\202\321\213.xlsx" "b/Documentation/Testing/\320\247\320\265\320\272-\320\273\320\270\321\201\321\202\321\213.xlsx" new file mode 100644 index 0000000..bd86fa5 Binary files /dev/null and "b/Documentation/Testing/\320\247\320\265\320\272-\320\273\320\270\321\201\321\202\321\213.xlsx" differ diff --git a/Documentation/User Stories with Acceptance Criteria.docx b/Documentation/User Stories with Acceptance Criteria.docx new file mode 100644 index 0000000..3e0bd85 Binary files /dev/null and b/Documentation/User Stories with Acceptance Criteria.docx differ diff --git a/Documentation/User Stories with Acceptance Criteria.pdf b/Documentation/User Stories with Acceptance Criteria.pdf new file mode 100644 index 0000000..76b82e3 Binary files /dev/null and b/Documentation/User Stories with Acceptance Criteria.pdf differ diff --git a/Documentation/brandbook.pdf b/Documentation/brandbook.pdf new file mode 100644 index 0000000..641f39e Binary files /dev/null and b/Documentation/brandbook.pdf differ diff --git a/Documentation/roadmap.docx b/Documentation/roadmap.docx new file mode 100644 index 0000000..a9c63e2 Binary files /dev/null and b/Documentation/roadmap.docx differ diff --git a/Documentation/roadmap.pdf b/Documentation/roadmap.pdf new file mode 100644 index 0000000..a65120d Binary files /dev/null and b/Documentation/roadmap.pdf differ diff --git "a/Documentation/\320\230\321\202\320\276\320\263\320\276\320\262\321\213\320\271 \320\276\321\202\321\207\320\265\321\202 \320\237\320\234 1 \320\272\320\276\320\274\320\260\320\275\320\264\321\213 5 \320\263\321\200\321\203\320\277\320\277\321\213 \320\267\320\260 2 \321\215\321\202\320\260\320\277.docx" "b/Documentation/\320\230\321\202\320\276\320\263\320\276\320\262\321\213\320\271 \320\276\321\202\321\207\320\265\321\202 \320\237\320\234 1 \320\272\320\276\320\274\320\260\320\275\320\264\321\213 5 \320\263\321\200\321\203\320\277\320\277\321\213 \320\267\320\260 2 \321\215\321\202\320\260\320\277.docx" new file mode 100644 index 0000000..72c33ae Binary files /dev/null and "b/Documentation/\320\230\321\202\320\276\320\263\320\276\320\262\321\213\320\271 \320\276\321\202\321\207\320\265\321\202 \320\237\320\234 1 \320\272\320\276\320\274\320\260\320\275\320\264\321\213 5 \320\263\321\200\321\203\320\277\320\277\321\213 \320\267\320\260 2 \321\215\321\202\320\260\320\277.docx" differ diff --git "a/Documentation/\320\230\321\202\320\276\320\263\320\276\320\262\321\213\320\271 \320\276\321\202\321\207\320\265\321\202 \320\237\320\234 1 \320\272\320\276\320\274\320\260\320\275\320\264\321\213 5 \320\263\321\200\321\203\320\277\320\277\321\213 \320\267\320\260 2 \321\215\321\202\320\260\320\277.pdf" "b/Documentation/\320\230\321\202\320\276\320\263\320\276\320\262\321\213\320\271 \320\276\321\202\321\207\320\265\321\202 \320\237\320\234 1 \320\272\320\276\320\274\320\260\320\275\320\264\321\213 5 \320\263\321\200\321\203\320\277\320\277\321\213 \320\267\320\260 2 \321\215\321\202\320\260\320\277.pdf" new file mode 100644 index 0000000..e46b341 Binary files /dev/null and "b/Documentation/\320\230\321\202\320\276\320\263\320\276\320\262\321\213\320\271 \320\276\321\202\321\207\320\265\321\202 \320\237\320\234 1 \320\272\320\276\320\274\320\260\320\275\320\264\321\213 5 \320\263\321\200\321\203\320\277\320\277\321\213 \320\267\320\260 2 \321\215\321\202\320\260\320\277.pdf" differ diff --git "a/Documentation/\320\236\320\261\320\276\321\201\320\275\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.docx" "b/Documentation/\320\236\320\261\320\276\321\201\320\275\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.docx" new file mode 100644 index 0000000..b8a6642 Binary files /dev/null and "b/Documentation/\320\236\320\261\320\276\321\201\320\275\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.docx" differ diff --git "a/Documentation/\320\236\320\261\320\276\321\201\320\275\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.pdf" "b/Documentation/\320\236\320\261\320\276\321\201\320\275\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.pdf" new file mode 100644 index 0000000..012ab5f Binary files /dev/null and "b/Documentation/\320\236\320\261\320\276\321\201\320\275\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.pdf" differ diff --git "a/Documentation/\320\236\320\263\321\200\320\260\320\275\320\270\321\207\320\265\320\275\320\270\321\217 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.docx" "b/Documentation/\320\236\320\263\321\200\320\260\320\275\320\270\321\207\320\265\320\275\320\270\321\217 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.docx" new file mode 100644 index 0000000..7ab0456 Binary files /dev/null and "b/Documentation/\320\236\320\263\321\200\320\260\320\275\320\270\321\207\320\265\320\275\320\270\321\217 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.docx" differ diff --git "a/Documentation/\320\236\320\263\321\200\320\260\320\275\320\270\321\207\320\265\320\275\320\270\321\217 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.pdf" "b/Documentation/\320\236\320\263\321\200\320\260\320\275\320\270\321\207\320\265\320\275\320\270\321\217 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.pdf" new file mode 100644 index 0000000..e2e33bb Binary files /dev/null and "b/Documentation/\320\236\320\263\321\200\320\260\320\275\320\270\321\207\320\265\320\275\320\270\321\217 \320\277\321\200\320\276\320\265\320\272\321\202\320\260.pdf" differ diff --git "a/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217 2 \321\215\321\202\320\260\320\277.pdf" "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217 2 \321\215\321\202\320\260\320\277.pdf" new file mode 100644 index 0000000..b46b4e7 Binary files /dev/null and "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217 2 \321\215\321\202\320\260\320\277.pdf" differ diff --git "a/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217 2 \321\215\321\202\320\260\320\277.pptx" "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217 2 \321\215\321\202\320\260\320\277.pptx" new file mode 100644 index 0000000..f01e60e Binary files /dev/null and "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217 2 \321\215\321\202\320\260\320\277.pptx" differ diff --git "a/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pdf" "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pdf" new file mode 100644 index 0000000..977ccd7 Binary files /dev/null and "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pdf" differ diff --git "a/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pptx" "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pptx" new file mode 100644 index 0000000..15c5b9b Binary files /dev/null and "b/Documentation/\320\237\321\200\320\265\320\267\320\265\320\275\321\202\320\260\321\206\320\270\321\217.pptx" differ diff --git "a/Documentation/\320\242\320\237. \320\247\320\265\320\272\320\273\320\270\321\201\321\202 2 \321\215\321\202\320\260\320\277.pdf" "b/Documentation/\320\242\320\237. \320\247\320\265\320\272\320\273\320\270\321\201\321\202 2 \321\215\321\202\320\260\320\277.pdf" new file mode 100644 index 0000000..caae605 Binary files /dev/null and "b/Documentation/\320\242\320\237. \320\247\320\265\320\272\320\273\320\270\321\201\321\202 2 \321\215\321\202\320\260\320\277.pdf" differ diff --git "a/Documentation/\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \320\277\320\273\321\216\321\201\320\276\320\262 \320\270 \320\274\320\270\320\275\321\203\321\201\320\276\320\262.docx" "b/Documentation/\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \320\277\320\273\321\216\321\201\320\276\320\262 \320\270 \320\274\320\270\320\275\321\203\321\201\320\276\320\262.docx" new file mode 100644 index 0000000..f5ede42 Binary files /dev/null and "b/Documentation/\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \320\277\320\273\321\216\321\201\320\276\320\262 \320\270 \320\274\320\270\320\275\321\203\321\201\320\276\320\262.docx" differ diff --git "a/Documentation/\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \320\277\320\273\321\216\321\201\320\276\320\262 \320\270 \320\274\320\270\320\275\321\203\321\201\320\276\320\262.pdf" "b/Documentation/\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \320\277\320\273\321\216\321\201\320\276\320\262 \320\270 \320\274\320\270\320\275\321\203\321\201\320\276\320\262.pdf" new file mode 100644 index 0000000..1991a7e Binary files /dev/null and "b/Documentation/\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \320\277\320\273\321\216\321\201\320\276\320\262 \320\270 \320\274\320\270\320\275\321\203\321\201\320\276\320\262.pdf" differ diff --git "a/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \321\200\320\270\321\201\320\272\320\270.docx" "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \321\200\320\270\321\201\320\272\320\270.docx" new file mode 100644 index 0000000..88a6312 Binary files /dev/null and "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \321\200\320\270\321\201\320\272\320\270.docx" differ diff --git "a/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \321\200\320\270\321\201\320\272\320\270.pdf" "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \321\200\320\270\321\201\320\272\320\270.pdf" new file mode 100644 index 0000000..4b0cbe5 Binary files /dev/null and "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \321\200\320\270\321\201\320\272\320\270.pdf" differ diff --git "a/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265.docx" "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265.docx" new file mode 100644 index 0000000..3d5e7af Binary files /dev/null and "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265.docx" differ diff --git "a/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265.pdf" "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265.pdf" new file mode 100644 index 0000000..9dad69d Binary files /dev/null and "b/Documentation/\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\276\320\265 \320\267\320\260\320\264\320\260\320\275\320\270\320\265.pdf" differ diff --git "a/Documentation/\320\244\320\270\320\264\320\261\321\215\320\272.pdf" "b/Documentation/\320\244\320\270\320\264\320\261\321\215\320\272.pdf" new file mode 100644 index 0000000..21fd967 Binary files /dev/null and "b/Documentation/\320\244\320\270\320\264\320\261\321\215\320\272.pdf" differ diff --git "a/Documentation/\320\246\320\265\320\273\320\265\320\262\320\260\321\217 \320\260\321\203\320\264\320\270\321\202\320\276\321\200\320\270\321\217 \320\270 \321\200\321\213\320\275\320\276\320\272.docx" "b/Documentation/\320\246\320\265\320\273\320\265\320\262\320\260\321\217 \320\260\321\203\320\264\320\270\321\202\320\276\321\200\320\270\321\217 \320\270 \321\200\321\213\320\275\320\276\320\272.docx" new file mode 100644 index 0000000..d3dfa4f Binary files /dev/null and "b/Documentation/\320\246\320\265\320\273\320\265\320\262\320\260\321\217 \320\260\321\203\320\264\320\270\321\202\320\276\321\200\320\270\321\217 \320\270 \321\200\321\213\320\275\320\276\320\272.docx" differ diff --git "a/Documentation/\320\246\320\265\320\273\320\265\320\262\320\260\321\217 \320\260\321\203\320\264\320\270\321\202\320\276\321\200\320\270\321\217 \320\270 \321\200\321\213\320\275\320\276\320\272.pdf" "b/Documentation/\320\246\320\265\320\273\320\265\320\262\320\260\321\217 \320\260\321\203\320\264\320\270\321\202\320\276\321\200\320\270\321\217 \320\270 \321\200\321\213\320\275\320\276\320\272.pdf" new file mode 100644 index 0000000..9ee08f0 Binary files /dev/null and "b/Documentation/\320\246\320\265\320\273\320\265\320\262\320\260\321\217 \320\260\321\203\320\264\320\270\321\202\320\276\321\200\320\270\321\217 \320\270 \321\200\321\213\320\275\320\276\320\272.pdf" differ diff --git a/README.md b/README.md index 8b13789..683892e 100644 --- a/README.md +++ b/README.md @@ -1 +1,69 @@ +# Описание проекта + **Cardly** - это сервис для обмена коллекционными карточками и наборами, включая карточки с изображениями животных, пейзажей и т.д. + +--- + +## Команда (ТП 5-1) + + +- **[Доброва Анна](https://github.com/dobrayAnika)** - *Team Lead, PM* +- **[Чершнев Евгений](https://github.com/floyzzzy)** - *Аналитик* +- **[Григорьев Иван](https://github.com/ChipoDev)** - *Backend-разработчик, Frontend-разработчик* +- **[Папонов Данил](https://github.com/danil13231212341)** - *Дизайнер* +- **[Бирюков Дмитрий](https://github.com/birbik)** - *Тестировщик* +- **[Наумов Никита](https://github.com/capti)** - *DevOps* + +--- + +## Сервисы + +- Miro [Roadmap](https://miro.com/app/board/uXjVINPrEUY=/) +- Figma [User paths](https://www.figma.com/board/s0O3zvAPgI4DXJF2BDwrAS/user-paths?node-id=0-1&p=f&t=3ufcMhcMNEwCXd1o-0) +- Figma [UI-kit](https://www.figma.com/design/JEGceh2Gm2ZW494FGIaT0A/Cardly-Brandbook?node-id=44-59&p=f&t=d6eTvzQ74P8yNRGe-0) | [Design](https://www.figma.com/design/ljUhVgNlQLElUQvEOcWSBz/Makets?node-id=0-1&t=3v5P2D8Ki25GG22M-1) | [BrandBook](https://www.figma.com/design/JEGceh2Gm2ZW494FGIaT0A/Cardly-Brandbook?node-id=0-1&t=OAp4Ihb40HiQLx4m-1) +- Jira [Jira-Task Manager](https://id.atlassian.com/invite/p/jira-software?id=QN1WxX0URg-5Gy9WJ0o66w) + +--- + +## Документация + +- Техническое задание [PDF](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5.pdf) | [DOCX](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5.docx) +- Roadmap [PDF](https://github.com/capti/Cardly/blob/main/Documentation/roadmap.pdf) | [DOCX](https://github.com/capti/Cardly/blob/main/Documentation/roadmap.docx) +- Целевая аудитория и рынок [PDF](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A6%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D0%B0%D1%83%D0%B4%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%20%D0%B8%20%D1%80%D1%8B%D0%BD%D0%BE%D0%BA.pdf) | [DOCX](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A6%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D0%B0%D1%83%D0%B4%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%20%D0%B8%20%D1%80%D1%8B%D0%BD%D0%BE%D0%BA.docx) +- Ограничения проекта [PDF](https://github.com/capti/Cardly/blob/main/Documentation/%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.pdf) | [DOCX](https://github.com/capti/Cardly/blob/main/Documentation/%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.docx) +- SWOT-анализ [PDF](https://github.com/capti/Cardly/blob/main/Documentation/SWOT-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7.pdf) | [DOCX](https://github.com/capti/Cardly/blob/main/Documentation/SWOT-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7.docx) +- Технические риски [PDF](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D1%80%D0%B8%D1%81%D0%BA%D0%B8.pdf) | [DOCX](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D1%80%D0%B8%D1%81%D0%BA%D0%B8.docx) +- BrandBook [PDF](https://github.com/capti/Cardly/blob/main/Documentation/brandbook.pdf) +- [Финансовая модель](https://github.com/capti/Cardly/tree/main/Documentation/Financial%20model) +- [Диаграммы](https://github.com/capti/Cardly/tree/main/Documentation/Diagrams) +- [Пользовательские пути](https://www.figma.com/board/s0O3zvAPgI4DXJF2BDwrAS/user-scenario?node-id=0-1&t=WPJXqXWfhTH9b5QX-1) +- [Swagger API](https://github.com/capti/Cardly/blob/main/Documentation/Swagger/cardly.yaml) + + + +--- + +## Презентация проекта + +- [Презентация технического задания - 1 аттестация](https://github.com/capti/Cardly/blob/main/Documentation/%D0%9F%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F.pdf) +- [Презентация технического задания - 2 аттестация](https://github.com/capti/Cardly/blob/main/Documentation/%D0%9F%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F%202%20%D1%8D%D1%82%D0%B0%D0%BF.pdf) + +## Видео защиты проекта +- [Видеопрезентация технического задания RUTUB](https://rutube.ru/video/private/495ed0d28afb267b57f242186af0053f/?p=t5f3gbQUlFE5zIx2hcnJZQ) +- [Видеопрезентация MVP RUTUB](https://rutube.ru/video/private/abbadde6a376d9174a7dde41d90ad139/?p=KPUl4SrlU9Tk7hcOFwXyZQ) + +--- + +## Проверка + +**Мы оценили** + +- [Наш чек-лист 1](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A4%D0%B8%D0%B4%D0%B1%D1%8D%D0%BA.pdf) +- [Наш чек-лист 2](https://github.com/capti/Cardly/blob/main/Documentation/%D0%A2%D0%9F.%20%D0%A7%D0%B5%D0%BA%D0%BB%D0%B8%D1%81%D1%82%202%20%D1%8D%D1%82%D0%B0%D0%BF.pdf) + +**Нас оценили** + +- [Команда 5-3. 1 аттестация](https://github.com/TrefflyTeam/documentation/blob/main/%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B%20%D0%BE%D1%86%D0%B5%D0%BD%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%BE%D1%82%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%205.3.pdf) +- [Команда 5-4. 1 аттестация](https://github.com/TP-Jobsy/jobsy-docs/blob/main/%D0%A7%D0%B5%D0%BA%D0%BB%D0%B8%D1%81%D1%82%201%20%D1%8D%D1%82%D0%B0%D0%BF.pdf) | +- [Команда 6-1. 1 аттестация](https://gitlab.usr0.ru/tailoredtastes/tailoredtastes-documentation/-/tree/master/%D0%9A%D1%80%D0%BE%D1%81%D1%81-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0?ref_type=heads) | [Команда 6-1. 2 аттестация](https://gitlab.usr0.ru/tailoredtastes/tailoredtastes-documentation/-/blob/master/%D0%9A%D1%80%D0%BE%D1%81%D1%81-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0/%D0%9A%D1%80%D0%BE%D1%81%D1%81-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0%20%D0%A2%D0%9F%206.1%202%20%D1%8D%D1%82%D0%B0%D0%BF.pdf) +- [Команда 6-2. 1 аттестация](https://github.com/AlexanderLaptev/Taskbench/blob/main/docs/%D0%A7%D0%B5%D0%BA%D0%BB%D0%B8%D1%81%D1%82%201%20%D1%8D%D1%82%D0%B0%D0%BF.pdf) | [Команда 6-2. 2 аттестация](https://github.com/AlexanderLaptev/Taskbench/blob/main/docs/%D0%A7%D0%B5%D0%BA%D0%BB%D0%B8%D1%81%D1%82%202%20%D1%8D%D1%82%D0%B0%D0%BF.pdf) diff --git a/frontend/test/widget_test.dart b/frontend/test/widget_test.dart deleted file mode 100644 index 519aeb3..0000000 --- a/frontend/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:cardly/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -}