Skip to content

Backend (Go + Postgres + Redis) for the Merch Shop + tests

License

Notifications You must be signed in to change notification settings

Optoed/merch-shop

Repository files navigation

merch-shop

Backend (Go + Postgres) for the Merch Shop + tests

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

Необходимо реализовать сервис, который позволит сотрудникам обмениваться монетками и приобретать на них мерч.

Каждый сотрудник должен иметь возможность видеть:

  • Список купленных им мерчовых товаров

  • Сгруппированную информацию о перемещении монеток в его кошельке, включая:

    • Кто ему передавал монетки и в каком количестве

    • Кому сотрудник передавал монетки и в каком количестве

Количество монеток не может быть отрицательным, запрещено уходить в минус при операциях с монетками.

Запуск

1. Запуск через Docker

Для того чтобы запустить проект через Docker, следуйте следующим шагам:

  1. Склонируйте репозиторий:

    git clone https://github.com/Optoed/merch-shop.git
    cd merch-shop
  2. Запуск контейнеров:

    docker compose up --build

Это создаст и запустит необходимые контейнеры. API будет доступно по адресу http://localhost:8080.

2. Запуск локально

Если вы хотите запустить проект локально, выполните следующие шаги:

  • Убедитесь, что у вас установлен Go (версия 1.18 или выше).

  • Установите необходимые зависимости:

    go mod tidy
  • Запустите приложение:

    go run main.go

API будет доступно по адресу http://localhost:8080.

Примеры использования API

[Протестировать можно в Postman]

Регистрация / авторизация:

Метод: POST

URL: /api/auth

В теле запроса:

{
    "username": "user",
    "password": "123"
}

Ответ:

{
    "description": "Успешная аутентификация.",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mzk4MjA0MjksInVzZXJfaWQiOjEsInVzZXJuYW1lIjoib3B0b2VkIn0.bBusn2R11h4QR5w0A9HEXDkCzmhotSlGrh3BmEhqzyQ"
}

Покупка мерча

Метод: POST

URL: /api/buy/:item

Authorization: Bearer Token

Пример:

http://localhost:8080/api/buy/cup

Ответ:

{
    "description": "Успешный ответ."
}

Отправка монет

Метод: POST

URL: /api/sendCoin

Authorization: Bearer Token

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

{
  "toUser" : "user2",
  "amount" : 100
}

Ответ:

{
    "description": "Успешный ответ."
}

Получение информации

Метод: GET

URL: /api/info

Authorization: Bearer Token

Ответ:

{
  "description": "Успешный ответ.",
  "schema": {
    "coinHistory": {
      "received": [
        {
          "fromUser": "optoed2",
          "amount": 101
        }
      ],
      "sent": [
        {
          "toUser": "optoed2",
          "amount": 10
        },
        {
          "toUser": "optoed1",
          "amount": 12
        },
        {
          "toUser": "optoed1",
          "amount": 357
        }
      ]
    },
    "coins": 1332,
    "inventory": [
      {
        "type": "cup",
        "quantity": 4
      },
      {
        "type": "pen",
        "quantity": 1
      }
    ]
  }
}

Пояснения

  1. Хранение информации о мерче было реализовано посредством структуры map. Такое решение было предпринято по следующим причинам:

    • всего 10 товаров, их состояние не изменяется
    • map работает гораздо быстрее Postgres и даже Redis
    • гораздо более простая логика, меньше накладок на систему
  2. Для ускорения чтения данных из таблиц базы данных были применены hash_index.

  3. Аутентификация включила в себя и регистрацию (если указанный пользователь не существует в бд) и логин (если существует). Сразу же выдается jwt token.

  4. Было проведено тестирование - представлено в виде unit- и интеграционных тестов.

    Также была создана база данных для тестов, интеграционные тесты работают именно с ней.

  5. .golangci.yaml - файл с конфигурацией линтера.

  6. Приложение способно работать локально.

  7. Приложение способно работать через docker-контейнеры.

About

Backend (Go + Postgres + Redis) for the Merch Shop + tests

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published