- Описание задачи
- Реализация
- Endpoints
- Запуск
- [Swagger UI](#Swagger UI)
Разработать API для управления рассылками и клиентами. Приложение предоставляет функциональность по созданию, редактированию и удалению рассылок, а также добавлению, редактированию и удалению клиентов и осуществляет рассылки пользуясь внешним API.
- Применение принципов REST API.
- Применение принципов "Чистой Архитектуры" и техники внедрения зависимостей.
- Использование фреймворка gin-gonic/gin для обработки HTTP-запросов.
- Взаимодействие с СУБД Postgres с использованием библиотеки sqlx и написание SQL-запросов.
- Конфигурация приложения осуществляется с использованием библиотеки viper.
- Запуск базы данных в Docker-контейнере.
- Асинхронная работа рассылок.
- Swagger UI
Структура проекта:
.
├── pkg
│ ├── handler // обработчики запросов
│ ├── service // бизнес-логика
│ └── repository // взаимодействие с БД
├── cmd // точка входа в приложение
├── server // серверная часть и логика обращений к внешнему API
├── schema // SQL файлы с миграциями
├── configs // файлы конфигурации
-
Создание клиента
- Endpoint:
POST /clients
- Тело запроса:
{ "phone": "7123456", "code": "123", "tag": "important", "timezone": "UTC" }
- Успешный ответ:
{"id": 1}
- Endpoint:
-
Получение клиента по ID
- Endpoint:
GET /clients/:id
- Успешный ответ:
{ "phone": "7123456", "code": "123", "tag": "important", "timezone": "UTC" }
- Endpoint:
-
Обновление клиента по ID
- Endpoint:
PUT /clients/:id
- Тело запроса:
{ "phone": "7666666", "tag": "urgent" }
- Успешный ответ:
{"status": "ok"}
- Endpoint:
-
Удаление клиента по ID
- Endpoint:
DELETE /clients/:id
- Успешный ответ:
{"status": "ok"}
- Endpoint:
-
Создание рассылки
- Endpoint:
POST /rassilki
- Тело запроса:
{ "start-time": "2023-12-31T23:59:59Z", "message": "Special offer for our clients!", "filter": ["important", "rich"], "end-time": "2024-01-15T23:59:59Z" }
- Успешный ответ:
{"id": 1}
- Endpoint:
-
Получение статистики рассылки по ID
- Endpoint:
GET /rassilki/:id
- Успешный ответ:
{ "ras_id": 7, "total": 20, "sent": 20, "not_sent": 0 }
- Endpoint:
-
Получение статистики рпо всем рассылкам
- Endpoint:
GET /rassilki/
- Успешный ответ:
[ { "ras_id": 3, "total": 15, "sent": 15, "not_sent": 0 }, { "ras_id": 7, "total": 20, "sent": 20, "not_sent": 0 }, { "ras_id": 8, "total": 20, "sent": 0, "not_sent": 20 } ]
- Endpoint:
-
Обновление рассылки по ID
- Endpoint:
PUT /rassilki/:id
- Тело запроса:
{ "start-time": "2024-01-01T00:00:00Z", "message": "Updated special offer!", "filter": ["important", "rich","stupid"], "end-time": "2024-01-20T23:59:59Z" }
- Успешный ответ:
{"status": "ok"}
- Endpoint:
-
Удаление рассылки по ID
- Endpoint:
DELETE /rassilki/:id
- Успешный ответ:
{"status": "ok"}
- Endpoint:
#bash
go run cmd/main.go
Если приложение запускается впервые, необходимо применить миграции к базе данных:
docker pull postgres
docker run --name=rassilki-db -e POSTGRES_PASSWORD='qwerty' -p 5436:5432 -d --rm postgres
migrate -path ./schema -database 'postgres://postgres:qwerty@localhost:5436/postgres?sslmode=disable' up
go mod tidy
Так же необходимо иметь переменные окружения JWT с JWT-токеном доступа и DB_PASSWORD с паролем от базы данных (для примера и как видно выше это qwerty
)
По адресу /docs/index.html находится страница со Swagger Ui: