/SpringDockerTemplate

:globe_with_meridians: Spring boot + PostgreSQL + Redis + Docker autodeploy backend template (Changellenge Qiwi hackathon winner)

Primary LanguageKotlin

Проект команды "Котята фон Неймана"

Участники команды

  • Албатов Константин
  • Подворный Артем
  • Суслов Илья
  • Горлов Артем

Стэк технологий

  • Spring - основной веб фреймворк
  • Redis - использование внешней базы данных для кэширования с интеграцией Spring Cache
  • Postgres - база данных для хранения данных о форматах и полях кэширования партнеров
  • Swagger - создание автоматической документации для упрощения тестирования и демонстрации веб-приложения
  • Docker - для удобного развертывания на локальных или удаленных хостингах (ссылка). В данный момент используется Render, так как исппользуется Free-tier, сервер засыпает после бездействия, необходимо подождать от 3 до 5 минут после первого запроса, после обновить страницу.
  • Spring WebSocket - для будущей возможной интеграции с ISO8583
  • Detekt и Ktlint - статические анализаторы Kotlin-кода, которые ускоряли и упрощали процесс разработки и отлаживания сервиса
  • Beeceptor - создание удаленного Mock Api для тестирования приложения и имитации загруженности системы

Структура проекта

Взаимодействие между компонентами

Структура веб-сервиса

Видео-демонстрация функционала

Ссылка ня яндекс-диск

Список эндпоинтов

Коллекция Postman для тестирования API

{
  "info": {
    "_postman_id": "b299db74-7851-44c3-8655-668972a35c53",
    "name": "Qiwi-Hackathon",
    "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json",
    "_exporter_id": "20739883"
  },
  "item": [
    {
      "name": "Visa Json Payment",
      "request": {
        "method": "PUT",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "// Проверка эндпоинта /visa\n\n{\n    \"method\": \"\",\n    \"params\": {\n        \"card_holder_name\": \"CARDHOLDER NAME\",\n        \"card_number\": \"4278011111275400\",\n        \"card_expire\": \"2702\",\n        \"card_cvc\": \"067\",\n        \"amount\": \"1000\",\n        \"description\": \"Month subscription\",\n        \"redirect_url\": \"https://shop.merchant.com/order/23\"\n    },\n    \"id\": \"4mu_id\"\n}"
        },
        "url": "https://springdockertemplate.onrender.com/visa"
      },
      "response": []
    },
    {
      "name": "Master xml Payment",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/xml",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n  <request><!--Проверка эндпоинта /master -->\n\t<pg_card_number>5266886676134311</pg_card_number>\n\t<pg_description>Оплата брони</pg_description>\n\t<pg_cardholder>Ivan Ivanov</pg_cardholder>\n    <pg_expire_date>0128</pg_expire_date>\n    <pg_cvv>55551</pg_cvv>\n  </request>"
        },
        "url": "https://springdockertemplate.onrender.com/master/{{$randomUUID}}"
      },
      "response": []
    },
    {
      "name": "Master Xml Payment",
      "request": {
        "method": "DELETE",
        "header": [],
        "body": {
          "mode": "raw",
          "raw": ""
        },
        "url": "https://springdockertemplate.onrender.com/"
      },
      "response": []
    },
    {
      "name": "Random Structure Test",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Accept",
            "value": "application/xml",
            "type": "text"
          },
          {
            "key": "Content-Type",
            "value": "application/json",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "// Проверка метода с любой структурой тестовых запросов, в данном случае определяется по заголовком Accept и Content-type\r\n\r\n{\r\n    \"a\": {\r\n        \"b\": {\r\n            \"c\": {\r\n\r\n            }\r\n        }\r\n    },\r\n    \"method\": \"payment\",\r\n    \"params\": {\r\n        \"card_holder_name\": \"CARDHOLDER NAME\",\r\n        \"card_number\": \"4278011111275400\",\r\n        \"card_expire\": \"2702\",\r\n        \"description\": \"Month subscription\",\r\n        \"redirect_url\": \"https://shop.merchant.com/order/23\"\r\n    },\r\n    \"description\": {\r\n        \"b\": null\r\n    },\r\n    \"id\": \"4490d1a0-fd21-44b6-84cc-a72d17b1c962\"\r\n}"
        },
        "url": "https://springdockertemplate.onrender.com/test"
      },
      "response": []
    },
    {
      "name": "Random Structure Test Copy",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Accept",
            "value": "application/json",
            "type": "text"
          },
          {
            "key": "Content-Type",
            "value": "application/xml",
            "type": "text"
          }
        ],
        "body": {
          "mode": "raw",
          "raw": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<request>\r\n    <a>\r\n        <b>Helllo</b>\r\n    </a><!-- Проверка метода с любой структурой тестовых запросов, в данном случае определяется по заголовком Accept и Content-type -->\r\n    <pg_description>\r\n        <client>\r\n            <name>Name</name>\r\n            <surname>Surname</surname>\r\n        </client>\r\n    </pg_description>\r\n    <pg_cardholder>Ivan Ivanov</pg_cardholder>\r\n</request>"
        },
        "url": "https://springdockertemplate.onrender.com/test"
      },
      "response": []
    }
  ]
}