{"id":18709630,"url":"https://github.com/devstackq/avito-task","last_synced_at":"2025-11-09T11:30:31.746Z","repository":{"id":114071300,"uuid":"464835889","full_name":"devstackq/avito-task","owner":"devstackq","description":"Микросервис для работы с балансом пользователей.","archived":false,"fork":false,"pushed_at":"2022-03-02T15:26:43.000Z","size":38,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-28T07:43:24.161Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devstackq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-01T09:56:27.000Z","updated_at":"2022-04-11T12:39:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"8264d70d-cef9-439d-9501-af30d3fafec9","html_url":"https://github.com/devstackq/avito-task","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devstackq%2Favito-task","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devstackq%2Favito-task/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devstackq%2Favito-task/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devstackq%2Favito-task/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devstackq","download_url":"https://codeload.github.com/devstackq/avito-task/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239572076,"owners_count":19661284,"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","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":[],"created_at":"2024-11-07T12:28:25.955Z","updated_at":"2025-11-09T11:30:31.716Z","avatar_url":"https://github.com/devstackq.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# avito-task# Тестовое задание на позицию стажера-бекендера\n\n## Микросервис для работы с балансом пользователей.\n\n**Проблема:**\n\nВ нашей компании есть много различных микросервисов. Многие из них так или иначе хотят взаимодействовать с балансом пользователя. На архитектурном комитете приняли решение централизовать работу с балансом пользователя в отдельный сервис. \n\n**Задача:**\n\nНеобходимо реализовать микросервис для работы с балансом пользователей (зачисление средств, списание средств, перевод средств от пользователя к пользователю, а также метод получения баланса пользователя). Сервис должен предоставлять HTTP API и принимать/отдавать запросы/ответы в формате JSON. \n\n**Сценарии использования:**\n\nДалее описаны несколько упрощенных кейсов приближенных к реальности.\n1. Сервис биллинга с помощью внешних мерчантов (аля через visa/mastercard) обработал зачисление денег на наш счет. Теперь биллингу нужно добавить эти деньги на баланс пользователя. \n2. Пользователь хочет купить у нас какую-то услугу. Для этого у нас есть специальный сервис управления услугами, который перед применением услуги проверяет баланс и потом списывает необходимую сумму. \n3. В ближайшем будущем планируется дать пользователям возможность перечислять деньги друг-другу внутри нашей платформы. Мы решили заранее предусмотреть такую возможность и заложить ее в архитектуру нашего сервиса. \n\n**Требования к коду:**\n\n1. Язык разработки: Go. Мы готовы рассматривать решения на PHP/Python/другом языке, но приоритетом для нас является именно golang.\n2. Фреймворки и библиотеки можно использовать любые\n3. Реляционная СУБД: MySQL или PostgreSQL\n4. Весь код должен быть выложен на Github с Readme файлом с инструкцией по запуску и примерами запросов/ответов (можно просто описать в Readme методы, можно через Postman, можно в Readme curl запросы скопировать, вы поняли идею...)\n5. Если есть потребность, можно подключить кеши(Redis) и/или очереди(RabbitMQ, Kafka)\n6. При возникновении вопросов по ТЗ оставляем принятие решения за кандидатом (в таком случае Readme файле к проекту должен быть указан список вопросов с которыми кандидат столкнулся и каким образом он их решил)\n7. Разработка интерфейса в браузере НЕ ТРЕБУЕТСЯ. Взаимодействие с АПИ предполагается посредством запросов из кода другого сервиса. Для тестирования можно использовать любой удобный инструмент. Например: в терминале через curl или Postman.\n\n**Будет плюсом:**\n\n1. Использование docker и docker-compose для поднятия и развертывания dev-среды.\n2. Методы АПИ возвращают человеко-читабельные описания ошибок и соответвующие статус коды при их возникновении.\n3. Все реализовано на GO, все-же мы собеседуем на GO разработчика. HINT: На собеседовании так или иначе будут вопросы по Go. Кто прочитал, тот молодец :)\n4. Написаны unit/интеграционные тесты.\n\n**Основное задание (минимум):**\n\nМетод начисления средств на баланс. Принимает id пользователя и сколько средств зачислить.\n\nМетод списания средств с баланса. Принимает id пользователя и сколько средств списать. \n\nМетод перевода средств от пользователя к пользователю. Принимает id пользователя с которого нужно списать средства, id пользователя которому должны зачислить средства, а также сумму.\n\nМетод получения текущего баланса пользователя. Принимает id пользователя. Баланс всегда в рублях.\n\n**Детали по заданию:**\n\n1. Методы начисления и списания можно объединить в один, если это позволяет общая архитектура.\n2. По умолчанию сервис не содержит в себе никаких данных о балансах (пустая табличка в БД). Данные о балансе появляются при первом зачислении денег. \n3. Валидацию данных и обработку ошибок оставляем на усмотрение кандидата. \n4. Список полей к методам не фиксированный. Перечислен лишь необходимый минимум. В рамках выполнения доп. заданий возможны дополнительные поля.\n5. Механизм миграции не нужен. Достаточно предоставить конечный SQL файл с созданием всех необходимых таблиц в БД. \n6. Баланс пользователя - очень важные данные в которых недопустимы ошибки (фактически мы работаем тут с реальными деньгами). Необходимо всегда держать баланс в актуальном состоянии и не допускать ситуаций когда баланс может уйти в минус. \n7. Валюта баланса по умолчанию всегда рубли.\n\n**Дополнительные задания**\n\nДалее перечислены доп. задания. Они не являются обязательными, но их выполнение даст существенный плюс перед другими кандидатами. \n\n*Доп. задание 1:*\n\nЭффективные менеджеры захотели добавить в наши приложения товары и услуги в различных от рубля валютах. Необходима возможность вывода баланса пользователя в отличной от рубля валюте.\n\nЗадача: добавить к методу получения баланса доп. параметр. Пример: ?currency=USD. \nЕсли этот параметр присутствует, то мы должны конвертировать баланс пользователя с рубля на указанную валюту. Данные по текущему курсу валют можно взять отсюда https://exchangeratesapi.io/ или из любого другого открытого источника. \n\nПримечание: напоминаем, что базовая валюта которая хранится на балансе у нас всегда рубль. В рамках этой задачи конвертация всегда происходит с базовой валюты.\n\n*Доп. задание 2:*\n\nПользователи жалуются, что не понимают за что были списаны (или зачислены) средства. \n\nЗадача: необходимо предоставить метод получения списка транзакций с комментариями откуда и зачем были начислены/списаны средства с баланса. Необходимо предусмотреть пагинацию и сортировку по сумме и дате. \n\n\n\n1 Добавить новую валюту; (для конвертации, еще  и usd)\nPOST: /v1/currency\nbody : {currency_name : rub}\n\n2 Добавить нового пользователя(автоматически открывается счет с валютой(рубль))\nPOST : /v1/user\n{name:\"Lora\", email:\"user@mail.ru\", password:\"123user\"}\n\nПроводить транзакции, пополнить, вычесть баланс по id пользователя\n3.1 POST : /v1/account/add/:{id}, body : {wallet_amount: 100.0}\n3.2 POST : /v1/account/debit/:{id} body : {wallet_amount: 100.0}\n\n3.3 Перевод другому пользователю, по id, нужно создать 2 пользователей\nPOST : /v1/account/transfer/:{id}; body : {receiver_id : 2, wallet_amount: 100.0}\n\n3.4 Проверка баланса по id\nPOST: /v1/account/balance/:{id}, body {currency_type:1}\n\n3.5 Конвертация баланса rub-usd\n3.5.1 Вначале надо создать новую валюту для юзера\nPOST :/v1/account/currency/:{user_id}\nа после произвести конвертацию\nPOST :/v1/account/convert/:{currency}\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevstackq%2Favito-task","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevstackq%2Favito-task","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevstackq%2Favito-task/lists"}