{"id":28275280,"url":"https://github.com/fshmidt/balance-microservice-api","last_synced_at":"2025-10-11T01:13:41.430Z","repository":{"id":65925071,"uuid":"588318357","full_name":"fshmidt/Balance-Microservice-API","owner":"fshmidt","description":"REST API for Balance Microsevice with Postgres db","archived":false,"fork":false,"pushed_at":"2023-01-23T12:51:39.000Z","size":9957,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-24T23:35:30.830Z","etag":null,"topics":["docker-compose","gin","golang","postgresql","rest-api"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fshmidt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2023-01-12T20:56:15.000Z","updated_at":"2024-02-02T14:37:00.000Z","dependencies_parsed_at":"2023-02-16T15:25:14.504Z","dependency_job_id":null,"html_url":"https://github.com/fshmidt/Balance-Microservice-API","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fshmidt/Balance-Microservice-API","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FBalance-Microservice-API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FBalance-Microservice-API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FBalance-Microservice-API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FBalance-Microservice-API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fshmidt","download_url":"https://codeload.github.com/fshmidt/Balance-Microservice-API/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FBalance-Microservice-API/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279005925,"owners_count":26083983,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker-compose","gin","golang","postgresql","rest-api"],"created_at":"2025-05-21T03:13:52.422Z","updated_at":"2025-10-11T01:13:41.398Z","avatar_url":"https://github.com/fshmidt.png","language":"Go","readme":"# Тестовое задание avitoTech\n\n\u003c!-- ToC start --\u003e\n# Содержание\n\n1. [Описание задачи](#Описание-задачи)\n1. [Реализация](#Реализация)\n1. [Endpoints](#Endpoints)\n1. [Запуск](#Запуск)\n1. [Примеры](#Примеры)\n\u003c!-- ToC end --\u003e\n\n# Описание задачи\n\nРазработать микросервис для работы с балансом пользователей (баланс, зачисление/списание/перевод средств). \nСервис должен предоставлять HTTP API и принимать/отдавать запросы/ответы в формате JSON.\nДополнительно реализовать методы конвертации баланса, приобретения услуг и получения списка транзакций.\nПолное описание в [TASK](https://github.com/avito-tech/job-backend-trainee-assignment/).\n# Реализация\n\n- Следование дизайну REST API.\n- Подход \"Чистой Архитектуры\" и техника внедрения зависимости.\n- Работа с фреймворком [gin-gonic/gin](https://github.com/gin-gonic/gin).\n- Работа с СУБД Postgres с использованием библиотеки [sqlx](https://github.com/jmoiron/sqlx) и написанием SQL запросов.\n- Конфигурация приложения - библиотека [viper](https://github.com/spf13/viper).\n- Запуск из Docker.\n**Структура проекта:**\n```\n.\n├── pkg\n│   ├── handler     // обработчики запросов\n│   ├── service     // бизнес-логика\n│   └── repository  // взаимодействие с БД\n├── cmd             // точка входа в приложение\n├── schema          // SQL файлы с миграциями\n├── configs         // файлы конфигурации\n```\n\n# Endpoints\n\n- GET /api/balance/id - получение баланса пользователя по id\n- GET /api/usdBalance/id - получение баланса пользователя в долларах США по id\n- PUT /api/balance/id - пополнение баланса/списание из баланса пользователя id\n    - Тело запроса:\n        - netto - сумма перевода.\n        - cashflow - направление денежного потока.\n- GET /api/transactions/id - получение списка транзакций пользователя, отсортированного по времени транзакции по id\n- GET /api/trans_by_summ/id - получение списка транзакций пользователя, отсортированного по убыванию суммы по id\n- PUT /api/send/id - перевод средств на баланс другого пользователя со счета id\n    - Тело запроса:\n        - netto - сумма перевода в RUB.\n        - reacherid - идентификатор пользователя, на баланс которого начисляются средства.\n- PUT /api/purchase/id - приобретение одной из предоставляемых услуг пользователем id.\n    - Тело запроса:\n        - service - приобретаемая услуга.\n# Запуск\n\n```\nmake build\nmake run\n```\n\nЕсли приложение запускается впервые, необходимо применить миграции к базе данных:\n\n```\nmigrate -path ./schema -database 'postgres://postgres:qwerty@IP_БАЗЫ_ДАННЫХ:5436/postgres?sslmode=disable' up\nIP базы данных : docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id\nID контейнера можно посмотреть в docker ps\n```\n\n\n# Примеры\n\nЗапросы сгенерированы из Postman.\n\n### 1. GET  /balance/1\n\n**Тело ответа:**\n```\n{\n    \"balance\": 1000\n}\n```\n\n### 2. GET /usdBalance/1\n**Запрос:**\n\n**Тело ответа:**\n```\n{\n    \"usdBalance\": 14.28\n}\n```\n\n### 3. GET /trans_by_summ/2\n\n\n**Тело ответа:**\n```\n{\n    \"transactions\": [\n        {\n            \"id\": 13,\n            \"user_id\": 2,\n            \"netto\": 1000,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:49:11.362805Z\"\n        },\n        {\n            \"id\": 2,\n            \"user_id\": 2,\n            \"netto\": 400,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:11:05.400642Z\"\n        },\n        {\n            \"id\": 1,\n            \"user_id\": 2,\n            \"netto\": 400,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:08:54.206476Z\"\n        },\n        {\n            \"id\": 4,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:13:18.163215Z\"\n        },\n        {\n            \"id\": 5,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:14:05.728221Z\"\n        },\n        {\n            \"id\": 6,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:19:23.398114Z\"\n        },\n        {\n            \"id\": 7,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"массаж\",\n            \"transtime\": \"2023-01-11T20:20:53.601119Z\"\n        },\n        {\n            \"id\": 3,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:11:22.814428Z\"\n        },\n        {\n            \"id\": 9,\n            \"user_id\": 2,\n            \"netto\": 20,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"1\",\n            \"transtime\": \"2023-01-11T20:23:17.591597Z\"\n        },\n        {\n            \"id\": 11,\n            \"user_id\": 2,\n            \"netto\": 20,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"1\",\n            \"transtime\": \"2023-01-11T20:23:45.77365Z\"\n        },\n        {\n            \"id\": 8,\n            \"user_id\": 2,\n            \"netto\": 20,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"1\",\n            \"transtime\": \"2023-01-11T20:21:03.874242Z\"\n        }\n    ]\n}\n```\n\n### 4. GET /transactions/2\n\n**Тело ответа:**\n```\n{\n    \"transactions\": [\n        {\n            \"id\": 1,\n            \"user_id\": 2,\n            \"netto\": 400,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:08:54.206476Z\"\n        },\n        {\n            \"id\": 2,\n            \"user_id\": 2,\n            \"netto\": 400,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:11:05.400642Z\"\n        },\n        {\n            \"id\": 3,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:11:22.814428Z\"\n        },\n        {\n            \"id\": 4,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:13:18.163215Z\"\n        },\n        {\n            \"id\": 5,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:14:05.728221Z\"\n        },\n        {\n            \"id\": 6,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:19:23.398114Z\"\n        },\n        {\n            \"id\": 7,\n            \"user_id\": 2,\n            \"netto\": 100,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"массаж\",\n            \"transtime\": \"2023-01-11T20:20:53.601119Z\"\n        },\n        {\n            \"id\": 8,\n            \"user_id\": 2,\n            \"netto\": 20,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"1\",\n            \"transtime\": \"2023-01-11T20:21:03.874242Z\"\n        },\n        {\n            \"id\": 9,\n            \"user_id\": 2,\n            \"netto\": 20,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"1\",\n            \"transtime\": \"2023-01-11T20:23:17.591597Z\"\n        },\n        {\n            \"id\": 11,\n            \"user_id\": 2,\n            \"netto\": 20,\n            \"cashflow\": false,\n            \"source_or_purpose\": \"1\",\n            \"transtime\": \"2023-01-11T20:23:45.77365Z\"\n        },\n        {\n            \"id\": 13,\n            \"user_id\": 2,\n            \"netto\": 1000,\n            \"cashflow\": true,\n            \"source_or_purpose\": \"developer\",\n            \"transtime\": \"2023-01-11T20:49:11.362805Z\"\n        }\n    ]\n}\n```\n\n### 5. PUT /balance/1\n\n**Тело запроса:**\n```\n{\n    \"netto\" : 1000,\n    \"cashflow\" : true\n}\n```\n**Тело ответа:**\n```\n{\n    \"status\": ok\n}\n```\n\n### 6. PUT /send/2\n\n**Тело запроса:**\n```\n{\n    \"netto\" : 20,\n    \"reacherid\" : 1\n}\n```\n**Тело ответа:**\n```\n{\n    \"status\": ok\n}\n```\n\n### 7. PUT /purchase/2\n\n**Тело запроса:**\n```\n{\n    \"services\" : \"массаж\"\n}\n```\n**Тело ответа:**\n```\n{\n    \"status\": ok\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffshmidt%2Fbalance-microservice-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffshmidt%2Fbalance-microservice-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffshmidt%2Fbalance-microservice-api/lists"}