{"id":38834226,"url":"https://github.com/tmrrwnxtsn/const-payments-api","last_synced_at":"2026-01-17T13:54:46.191Z","repository":{"id":37994975,"uuid":"499568237","full_name":"tmrrwnxtsn/const-payments-api","owner":"tmrrwnxtsn","description":":money_with_wings: RESTful API эмулятора платёжного сервиса","archived":false,"fork":false,"pushed_at":"2022-06-22T20:54:50.000Z","size":4590,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-11-15T00:51:37.333Z","etag":null,"topics":["docker-compose","go","golang","migrations","postgresql","restful-api","swagger-codegen"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tmrrwnxtsn.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":"2022-06-03T15:52:28.000Z","updated_at":"2022-06-24T20:48:04.000Z","dependencies_parsed_at":"2022-08-24T10:40:31.847Z","dependency_job_id":null,"html_url":"https://github.com/tmrrwnxtsn/const-payments-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tmrrwnxtsn/const-payments-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmrrwnxtsn%2Fconst-payments-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmrrwnxtsn%2Fconst-payments-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmrrwnxtsn%2Fconst-payments-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmrrwnxtsn%2Fconst-payments-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmrrwnxtsn","download_url":"https://codeload.github.com/tmrrwnxtsn/const-payments-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmrrwnxtsn%2Fconst-payments-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28509477,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T13:38:16.342Z","status":"ssl_error","status_checked_at":"2026-01-17T13:37:44.060Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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","go","golang","migrations","postgresql","restful-api","swagger-codegen"],"created_at":"2026-01-17T13:54:46.101Z","updated_at":"2026-01-17T13:54:46.181Z","avatar_url":"https://github.com/tmrrwnxtsn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Эмулятор платёжного сервиса\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/tmrrwnxtsn/const-payments-api)](https://goreportcard.com/report/github.com/tmrrwnxtsn/const-payments-api)\n[![codebeat badge](https://codebeat.co/badges/71e2f5e5-9e6b-405d-baf9-7cc8b5037330)](https://codebeat.co/projects/github-com-tmrrwnxtsn-const-payments-api-master)\n[![Go Reference](https://pkg.go.dev/badge/github.com/tmrrwnxtsn/const-payments-api.svg)](https://pkg.go.dev/github.com/tmrrwnxtsn/const-payments-api)\n\nТестовое задание на стажировку в [Константу](https://const.tech/).\n\n## Содержание\n\n- [Задание](#Задание)\n- [Подготовка](#Подготовка)\n- [Запуск](#Запуск)\n- [Эндпойнты](#Эндпойнты)\n- [Тесты](#Тесты)\n- [Структура](#Структура)\n- [Зависимости](#Зависимости)\n\n## Задание\n\nСервис должен принимать запросы через REST API, сохранять/изменять состояния платежей в базе данных. Код должен быть\nнаписан на Go. В качестве базы данных, пожалуйста, используй любую реляционную.\n\nМы будем работать с двумя сущностями: пользователь и транзакция. Для простоты допустим, что база пользователей хранится\nвне нашего сервиса. О пользователе мы можем знать только его ID (число) и email. Транзакции хранятся в нашем сервисе.\nВот что нам надо хранить о каждой транзакции\n\n- ID транзакции (число)\n- ID пользователя\n- email пользователя\n- сумма\n- валюта\n- дата и время создания\n- дата и время последнего изменения\n- статус\n\nСтатус может принимать одно из следующих значений: НОВЫЙ, УСПЕХ, НЕУСПЕХ, ОШИБКА. Цикл жизни платежа выглядит следующим\nобразом: пользователь создает платеж, он создается в статусе НОВЫЙ. После платежная система должна уведомить нас о том,\nпрошел ли платеж на ее стороне (п. 2 ниже), после чего мы меняем статус в нашей базе. Статусы УСПЕХ и НЕУСПЕХ являются\nтерминальными - если платеж находится в них, его статус должно быть невозможно поменять. Переход в статусы УСПЕХ и\nНЕУСПЕХ должен осуществляться только после получения запроса из п.2 ОШИБКА - это статус, когда в момент создания платежа\nчто-то пошло не так. Будет хорошо, если сделаешь, чтобы случайное количество платежей при создании переходили в этот\nстатус.\n\nAPI должно поддерживать следующие действия:\n\n- Создание платежа (на вход принимает id пользователя, email пользователя, сумму и валюту платежа);\n- Изменение статуса платежа платежной системой (хорошо, если будет к этому запросу будет применяться авторизация);\n- Проверка статуса платежа по ID;\n- Получение списка всех платежей пользователя по его ID;\n- Получение списка всех платежей пользователя по его e-mail;\n- Отмена платежа по его ID. API должно вернуть ошибку, если отмена невозможна (например потому что платеж в том статусе,\n  в котором отменить нельзя).\n\n## Подготовка\n\nСервис состоит из двух компонентов: API сервер и база данных PostgreSQL, поэтому для его успешной работы необходимо\nустановить следующее ПО:\n\n- [Go](https://golang.org/doc/install) \u003e=1.17;\n- [PostgreSQL](https://www.postgresql.org/docs/current/tutorial-start.html) \u003e=13 при запуске API сервера с\n  использованием собственного сервера БД или [Docker](https://www.docker.com/get-started) \u003e=20.10.14, если собственный\n  сервер БД отсутствует.\n\n## Запуск\n\nПосле установки необходимого ПО необходимо скачать исходный код сервиса и перейти в директорию с исходным кодом:\n\n```shell\ngit clone https://github.com/tmrrwnxtsn/const-payments-api.git\ncd const-payments-api\n```\n\nЕсть несколько вариантов запуска системы, все из которых происходят\nблагодаря [Makefile](https://github.com/tmrrwnxtsn/const-payments-api/blob/master/Makefile). **Перед запуском\nрекомендуется обратить внимание на переменные, указанные в этом файле, и изменить их, если потребуется**. Также следует\nобратить внимание на конфигурационный\nфайл [configs/local.yml](https://github.com/tmrrwnxtsn/const-payments-api/blob/master/configs/local.yml) и внести\nнеобходимые правки. Если возникнет необходимость задать соответствующие переменные среды окружения, то они должны\nдобавляться с префиксом *APP_*, например, *APP_BIND_ADDR* (\nсм. [docker-compose.yml](https://github.com/tmrrwnxtsn/const-payments-api/blob/master/docker-compose.yml)).\n\n### 1. [Docker Compose](https://docs.docker.com/compose/gettingstarted/)\n\nПожалуй, самый \"безболезненный\" и простой способ. Оба компонента системы (API сервер и БД) разворачиваются в отдельных\nDocker-контейнерах. Настройки компонентов указываются в\n[docker-compose.yml](https://github.com/tmrrwnxtsn/const-payments-api/blob/master/docker-compose.yml).\n\n```shell\n# запуск компонентов в отдельных Docker-контейнерах (без тестовых данных)\nmake compose-up\n```\n\n### 2. Docker\n\nИмеется возможность разворачивать в Docker-контейнерах как API сервер, так и БД.\n\n```shell\n# запуск БД в Docker-контейнере\nmake db-start\n\n# применение миграций к БД\nmake migrate-up-docker\n\n# загрузка тестовых данных в БД \nmake testdata-docker\n\n# сборка образа API сервера\nmake build-docker\n\n# запуск API сервера в Docker-контейнере на основе собранного образа\nmake run-docker\n```\n\n### 3. Local\n\nТакже есть возможность запустить API сервер локально (у себя на хосте), используя различные подключения к БД (\nлокальная/внешняя/Docker).\n\n```shell\n# применение миграций к БД\nmake migrate-up\n\n# загрузка тестовых данных в БД \nmake testdata\n\n# компиляция и запуск бинарника с API сервером на хосте \nmake run\n\n# компиляция\nmake build\n\n# запуск бинарника API сервера\nmake run\n```\n\n*Рекомендуется проверить настройки сервиса в соответствующих конфигурационных файлах перед запуском любым из\nвышеописанных способов.*\n\n## Эндпойнты\n\nПосле успешного запуска сервиса одним из представленных способов, RESTful API сервер будет доступен по\nадресу `http://localhost:8080` (если были использованы настройки по умолчанию, указанные\nв [configs/local.yml](https://github.com/tmrrwnxtsn/const-payments-api/blob/master/configs/local.yml)). Сервер\nподдерживает следующие эндпойнты:\n\n* `POST /api/transactions/`: создание платежа (транзакции)\n* `GET /api/transactions/`: получение списка всех платежей (транзакций) пользователя по его ID или e-mail.\n* `GET /api/transactions/:id/status/`: проверка статуса платежа (транзакции) по ID\n* `PATCH /api/transactions/:id/status/`: изменение статуса платежа (транзакции) системой\n* `DELETE /api/transactions/:id`: отмена платежа (транзакции) по ID\n* `GET /swagger/index.html`: Swagger-документация\n\n## Тесты\n\nПеред запуском тестов на хосте необходимо создать тестовую БД, применить к ней миграции и указать соответствующий URL\nв [internal/store/sqlstore/store_test.go](https://github.com/tmrrwnxtsn/const-payments-api/blob/master/internal/store/sqlstore/store_test.go)\n, либо задать в переменных среды (*APP_DSN_TEST*):\n\n```go\n// internal/store/sqlstore/store_test.go\n\npackage sqlstore_test\n\nimport (\n\t\"github.com/tmrrwnxtsn/const-payments-api/internal/config\"\n\t\"os\"\n\t\"testing\"\n)\n\nvar dsn string\n\nfunc TestMain(m *testing.M) {\n\tdsn = os.Getenv(config.EnvVariablesPrefix + \"DSN_TEST\")\n\tif dsn == \"\" {\n\t\tdsn = \"postgres://127.0.0.1/const_payments_db_test?sslmode=disable\u0026user=postgres\u0026password=qwerty\"\n\t}\n\n\tos.Exit(m.Run())\n}\n```\n\nПосле этого можно переходить к запуску тестов:\n\n```shell\n# выполнение тестов сервиса (с информацией о покрытии в %)\nmake test\n\n# получить детальную информацию о покрытии участков кода тестами (cover.out, cover.html)\nmake test-cover\n```\n\n## Структура\n\nНиже представлена структура сервиса (по папкам) с кратким описанием.\n\n```\n├── cmd                 основные приложения проекта\n│   └── server          приложение API сервера\n├── configs             конфигурационные файлы для различных сред развёртывания\n├── docs                сгенерированная Swagger-документация \n├── internal            внутренний код приложения\n│   ├── config          работа с конфигурационными данными\n│   ├── handler         маршрутизация HTTP-запросов\n│   ├── model           модели/сущности приложения\n│   ├── server          HTTP-сервер, используемый для обработки запросов\n│   ├── service         слой бизнес-логики для работы с платежами (транзакциями)\n│   │   └── mocks       моки бизнес-логики работы с платежами (транзакциями)\n│   └── store           слой хранения данных\n│       ├── sqlstore    хранилище данных\n│       └── teststore   тестовое хранилище данных (проверка логики хранения данных)\n├── migrations          миграции базы данных\n├── scripts             скрипты для операций над сервисом\n└── testdata            тестовые данные для БД\n```\n\nКомпоновка пакетов в данном проекте осуществлялась в соответствии с популярным макетом организации Go-проектов\n– [Standard Go Project Layout](https://github.com/golang-standards/project-layout/blob/master/README_ru.md).\n\n## Зависимости\n\n* Маршрутизация: [gin](https://github.com/gin-gonic/gin)\n* Доступ к базе данных: [sqlx](https://github.com/jmoiron/sqlx)\n* Драйвер PostgreSQL: [pgx](https://github.com/jackc/pgx)\n* Миграции базы данных: [golang-migrate](https://github.com/golang-migrate/migrate)\n* Валидация данных: [ozzo-validation](https://github.com/go-ozzo/ozzo-validation)\n* Логгирование: [logrus](https://github.com/sirupsen/logrus)\n* Генерация Swagger-документации: [swag](https://github.com/swaggo/swag)\n* Генерация моков: [golang/mock](https://github.com/golang/mock)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmrrwnxtsn%2Fconst-payments-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmrrwnxtsn%2Fconst-payments-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmrrwnxtsn%2Fconst-payments-api/lists"}