{"id":28275273,"url":"https://github.com/fshmidt/rassilki","last_synced_at":"2025-08-09T17:11:40.963Z","repository":{"id":211862491,"uuid":"730112960","full_name":"fshmidt/rassilki","owner":"fshmidt","description":"A REST-API for managing multiple distributions to clients depending on theri tags, working asynchronic with external distribution API","archived":false,"fork":false,"pushed_at":"2023-12-11T09:07:19.000Z","size":115,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-21T03:16:37.319Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/fshmidt.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}},"created_at":"2023-12-11T08:31:15.000Z","updated_at":"2023-12-11T09:07:23.000Z","dependencies_parsed_at":"2023-12-11T10:28:52.693Z","dependency_job_id":null,"html_url":"https://github.com/fshmidt/rassilki","commit_stats":null,"previous_names":["fshmidt/rassilki"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fshmidt/rassilki","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2Frassilki","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2Frassilki/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2Frassilki/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2Frassilki/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fshmidt","download_url":"https://codeload.github.com/fshmidt/rassilki/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2Frassilki/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269606235,"owners_count":24446147,"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-08-09T02:00:10.424Z","response_time":111,"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":[],"created_at":"2025-05-21T03:13:52.230Z","updated_at":"2025-08-09T17:11:40.947Z","avatar_url":"https://github.com/fshmidt.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Приложение для управления рассылками\n\n\u003c!-- ToC start --\u003e\n# Содержание\n\n1. [Описание задачи](#Описание-задачи)\n2. [Реализация](#Реализация)\n3. [Endpoints](#Endpoints)\n4. [Запуск](#Запуск)\n5. [Swagger UI](#Swagger UI)\n\u003c!-- ToC end --\u003e\n\n# Описание задачи\n\nРазработать API для управления рассылками и клиентами. Приложение предоставляет функциональность по созданию, редактированию и удалению рассылок, а также добавлению, редактированию и удалению клиентов и осуществляет рассылки пользуясь внешним API.\n\n# Реализация\n\n- Применение принципов REST API.\n- Применение принципов \"Чистой Архитектуры\" и техники внедрения зависимостей.\n- Использование фреймворка [gin-gonic/gin](https://github.com/gin-gonic/gin) для обработки HTTP-запросов.\n- Взаимодействие с СУБД Postgres с использованием библиотеки [sqlx](https://github.com/jmoiron/sqlx) и написание SQL-запросов.\n- Конфигурация приложения осуществляется с использованием библиотеки [viper](https://github.com/spf13/viper).\n- Запуск базы данных в Docker-контейнере.\n- Асинхронная работа рассылок.\n- Swagger UI\n\n**Структура проекта:**\n\n```\n.\n├── pkg\n│   ├── handler     // обработчики запросов\n│   ├── service     // бизнес-логика\n│   └── repository  // взаимодействие с БД\n├── cmd             // точка входа в приложение\n├── server          // серверная часть и логика обращений к внешнему API\n├── schema          // SQL файлы с миграциями\n├── configs         // файлы конфигурации\n```\n\n\n# Endpoints\n\n## Клиенты\n\n- **Создание клиента**\n  - Endpoint: `POST /clients`\n  - Тело запроса:\n    ```json\n    {\n        \"phone\": \"7123456\",\n        \"code\": \"123\",\n        \"tag\": \"important\",\n        \"timezone\": \"UTC\"\n    }\n    ```\n  - Успешный ответ:\n    ```json\n    {\"id\": 1}\n    ```\n\n- **Получение клиента по ID**\n  - Endpoint: `GET /clients/:id`\n  - Успешный ответ:\n    ```json\n    {\n        \"phone\": \"7123456\",\n        \"code\": \"123\",\n        \"tag\": \"important\",\n        \"timezone\": \"UTC\"\n    }\n    ```\n\n- **Обновление клиента по ID**\n  - Endpoint: `PUT /clients/:id`\n  - Тело запроса:\n    ```json\n    {\n        \"phone\": \"7666666\",\n        \"tag\": \"urgent\"\n    }\n    ```\n  - Успешный ответ:\n    ```json\n    {\"status\": \"ok\"}\n    ```\n\n- **Удаление клиента по ID**\n  - Endpoint: `DELETE /clients/:id`\n  - Успешный ответ:\n    ```json\n    {\"status\": \"ok\"}\n    ```\n\n## Рассылки\n\n- **Создание рассылки**\n  - Endpoint: `POST /rassilki`\n  - Тело запроса:\n    ```json\n    {\n        \"start-time\": \"2023-12-31T23:59:59Z\",\n        \"message\": \"Special offer for our clients!\",\n        \"filter\": [\"important\", \"rich\"],\n        \"end-time\": \"2024-01-15T23:59:59Z\"\n    }\n    ```\n  - Успешный ответ:\n    ```json\n    {\"id\": 1}\n    ```\n\n- **Получение статистики рассылки по ID**\n  - Endpoint: `GET /rassilki/:id`\n  - Успешный ответ:\n    ```json\n    {\n    \"ras_id\": 7,\n    \"total\": 20,\n    \"sent\": 20,\n    \"not_sent\": 0\n    }\n    ```\n\n- **Получение статистики рпо всем рассылкам**\n  - Endpoint: `GET /rassilki/`\n  - Успешный ответ:\n    ```\n    [\n        {\n            \"ras_id\": 3,\n            \"total\": 15,\n            \"sent\": 15,\n            \"not_sent\": 0\n        },\n        {\n            \"ras_id\": 7,\n            \"total\": 20,\n            \"sent\": 20,\n            \"not_sent\": 0\n        },\n        {\n            \"ras_id\": 8,\n            \"total\": 20,\n            \"sent\": 0,\n            \"not_sent\": 20\n        }\n    ]\n    ```\n\n- **Обновление рассылки по ID**\n  - Endpoint: `PUT /rassilki/:id`\n  - Тело запроса:\n    ```json\n    {\n        \"start-time\": \"2024-01-01T00:00:00Z\",\n        \"message\": \"Updated special offer!\",\n        \"filter\": [\"important\", \"rich\",\"stupid\"],\n        \"end-time\": \"2024-01-20T23:59:59Z\"\n    }\n    ```\n  - Успешный ответ:\n    ```json\n    {\"status\": \"ok\"}\n    ```\n\n- **Удаление рассылки по ID**\n  - Endpoint: `DELETE /rassilki/:id`\n  - Успешный ответ:\n    ```json\n    {\"status\": \"ok\"}\n    ```\n\n# Запуск\n\n```\n#bash\ngo run cmd/main.go\n\n```\n\nЕсли приложение запускается впервые, необходимо применить миграции к базе данных:\n\n```\ndocker pull postgres\ndocker run --name=rassilki-db -e POSTGRES_PASSWORD='qwerty' -p 5436:5432 -d --rm postgres\nmigrate -path ./schema -database 'postgres://postgres:qwerty@localhost:5436/postgres?sslmode=disable' up\ngo mod tidy\n\n```\nТак же необходимо иметь переменные окружения JWT с JWT-токеном доступа и DB_PASSWORD с паролем от базы данных (для примера и как видно выше это `qwerty`)\n\n# Swagger UI\n\nПо адресу /docs/index.html находится страница со Swagger Ui:\n![Swagger Ui](./docs/swagger.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffshmidt%2Frassilki","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffshmidt%2Frassilki","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffshmidt%2Frassilki/lists"}