Coder Social home page Coder Social logo

microservicebalance-api's Introduction

Содержание

  1. Описание задачи
  2. Реализация
  3. Endpoints
  4. Запуск
  5. Примеры

Описание задачи

Разработать микросервис для работы с балансом пользователей (баланс, зачисление/списание/перевод средств). Сервис должен предоставлять HTTP API и принимать/отдавать запросы/ответы в формате JSON. Дополнительно реализовать методы конвертации баланса, приобретения услуг и получения списка транзакций.

Реализация

  • Следование дизайну REST API.
  • Подход "Чистой Архитектуры" и техника внедрения зависимости.
  • Работа с фреймворком gin-gonic/gin.
  • Работа с СУБД Postgres с использованием библиотеки sqlx и написанием SQL запросов.
  • Конфигурация приложения - библиотека viper.
  • Запуск из Docker. Структура проекта:
.
├── pkg
│   ├── handler     // обработчики запросов
│   ├── service     // бизнес-логика
│   └── repository  // взаимодействие с БД
├── cmd             // точка входа в приложение
├── schema          // SQL файлы с миграциями
├── configs         // файлы конфигурации

Endpoints

  • GET /api/balance/id - получение баланса пользователя по id
  • GET /api/usdBalance/id - получение баланса пользователя в долларах США по id
  • PUT /api/balance/id - пополнение баланса/списание из баланса пользователя id
    • Тело запроса:
      • netto - сумма перевода.
      • cashflow - направление денежного потока.
  • GET /api/transactions/id - получение списка транзакций пользователя, отсортированного по времени транзакции по id
  • GET /api/trans_by_summ/id - получение списка транзакций пользователя, отсортированного по убыванию суммы по id
  • PUT /api/send/id - перевод средств на баланс другого пользователя со счета id
    • Тело запроса:
      • netto - сумма перевода в RUB.
      • reacherid - идентификатор пользователя, на баланс которого начисляются средства.
  • PUT /api/purchase/id - приобретение одной из предоставляемых услуг пользователем id.
    • Тело запроса:
      • service - приобретаемая услуга.

Запуск

make build
make run

Если приложение запускается впервые, необходимо применить миграции к базе данных:

migrate -path ./schema -database 'postgres://postgres:qwerty@IP_БАЗЫ_ДАННЫХ:5436/postgres?sslmode=disable' up
IP базы данных : docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
ID контейнера можно посмотреть в docker ps

Примеры

Запросы сгенерированы из Postman.

1. GET /balance/1

Тело ответа:

{
    "balance": 1000
}

2. GET /usdBalance/1

Запрос:

Тело ответа:

{
    "usdBalance": 14.28
}

3. GET /trans_by_summ/2

Тело ответа:

{
    "transactions": [
        {
            "id": 13,
            "user_id": 2,
            "netto": 1000,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:49:11.362805Z"
        },
        {
            "id": 2,
            "user_id": 2,
            "netto": 400,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:11:05.400642Z"
        },
        {
            "id": 1,
            "user_id": 2,
            "netto": 400,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:08:54.206476Z"
        },
        {
            "id": 4,
            "user_id": 2,
            "netto": 100,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:13:18.163215Z"
        },
        {
            "id": 5,
            "user_id": 2,
            "netto": 100,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:14:05.728221Z"
        },
        {
            "id": 6,
            "user_id": 2,
            "netto": 100,
            "cashflow": false,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:19:23.398114Z"
        },
        {
            "id": 7,
            "user_id": 2,
            "netto": 100,
            "cashflow": false,
            "source_or_purpose": "массаж",
            "transtime": "2023-01-11T20:20:53.601119Z"
        },
        {
            "id": 3,
            "user_id": 2,
            "netto": 100,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:11:22.814428Z"
        },
        {
            "id": 9,
            "user_id": 2,
            "netto": 20,
            "cashflow": false,
            "source_or_purpose": "1",
            "transtime": "2023-01-11T20:23:17.591597Z"
        },
        {
            "id": 11,
            "user_id": 2,
            "netto": 20,
            "cashflow": false,
            "source_or_purpose": "1",
            "transtime": "2023-01-11T20:23:45.77365Z"
        },
        {
            "id": 8,
            "user_id": 2,
            "netto": 20,
            "cashflow": false,
            "source_or_purpose": "1",
            "transtime": "2023-01-11T20:21:03.874242Z"
        }
    ]
}

4. GET /transactions/2

Тело ответа:

{
    "transactions": [
        {
            "id": 1,
            "user_id": 2,
            "netto": 400,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:08:54.206476Z"
        },
        {
            "id": 2,
            "user_id": 2,
            "netto": 400,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:11:05.400642Z"
        },
        {
            "id": 3,
            "user_id": 2,
            "netto": 100,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:11:22.814428Z"
        },
        {
            "id": 4,
            "user_id": 2,
            "netto": 100,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:13:18.163215Z"
        },
        {
            "id": 5,
            "user_id": 2,
            "netto": 100,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:14:05.728221Z"
        },
        {
            "id": 6,
            "user_id": 2,
            "netto": 100,
            "cashflow": false,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:19:23.398114Z"
        },
        {
            "id": 7,
            "user_id": 2,
            "netto": 100,
            "cashflow": false,
            "source_or_purpose": "массаж",
            "transtime": "2023-01-11T20:20:53.601119Z"
        },
        {
            "id": 8,
            "user_id": 2,
            "netto": 20,
            "cashflow": false,
            "source_or_purpose": "1",
            "transtime": "2023-01-11T20:21:03.874242Z"
        },
        {
            "id": 9,
            "user_id": 2,
            "netto": 20,
            "cashflow": false,
            "source_or_purpose": "1",
            "transtime": "2023-01-11T20:23:17.591597Z"
        },
        {
            "id": 11,
            "user_id": 2,
            "netto": 20,
            "cashflow": false,
            "source_or_purpose": "1",
            "transtime": "2023-01-11T20:23:45.77365Z"
        },
        {
            "id": 13,
            "user_id": 2,
            "netto": 1000,
            "cashflow": true,
            "source_or_purpose": "developer",
            "transtime": "2023-01-11T20:49:11.362805Z"
        }
    ]
}

5. PUT /balance/1

Тело запроса:

{
    "netto" : 1000,
    "cashflow" : true
}

Тело ответа:

{
    "status": ok
}

6. PUT /send/2

Тело запроса:

{
    "netto" : 20,
    "reacherid" : 1
}

Тело ответа:

{
    "status": ok
}

7. PUT /purchase/2

Тело запроса:

{
    "services" : "массаж"
}

Тело ответа:

{
    "status": ok
}

microservicebalance-api's People

Contributors

proninigorr avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.