{"id":28275265,"url":"https://github.com/fshmidt/mytodoapp","last_synced_at":"2026-05-07T03:38:42.861Z","repository":{"id":65925188,"uuid":"574081502","full_name":"fshmidt/MyTodoApp","owner":"fshmidt","description":"REST API for Todo Application with Postgres db and Swagger","archived":false,"fork":false,"pushed_at":"2023-02-20T11:38:00.000Z","size":45,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-28T08:04:02.073Z","etag":null,"topics":["docker","gin","go","golang","jwt","migration","postgresql","rest-api","swagger"],"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/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}},"created_at":"2022-12-04T11:24:13.000Z","updated_at":"2023-02-16T14:53:18.000Z","dependencies_parsed_at":"2023-02-16T15:25:14.112Z","dependency_job_id":null,"html_url":"https://github.com/fshmidt/MyTodoApp","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fshmidt/MyTodoApp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FMyTodoApp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FMyTodoApp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FMyTodoApp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FMyTodoApp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fshmidt","download_url":"https://codeload.github.com/fshmidt/MyTodoApp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fshmidt%2FMyTodoApp/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260162008,"owners_count":22967952,"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":["docker","gin","go","golang","jwt","migration","postgresql","rest-api","swagger"],"created_at":"2025-05-21T03:13:48.189Z","updated_at":"2026-05-07T03:38:42.819Z","avatar_url":"https://github.com/fshmidt.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Приложение для ведения списков дел/покупок\n\n\u003c!-- ToC start --\u003e\n# Содержание\n\n1. [Описание задачи](#Описание-задачи)\n1. [Реализация](#Реализация)\n1. [Endpoints](#Endpoints)\n1. [Запуск](#Запуск)\n1. [Примеры](#Примеры)\n\u003c!-- ToC end --\u003e\n\n# Описание задачи\n\nРазработать API для авторизации, аутентификации, создания, редактирования и удаления списков дел/покупок по id пользователя, а так же редактирования и удаления самих списков.\n\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- POST   /auth/sign-up       - авторизация пользователя по имени, логину и паролю.\n    - Тело запроса:\n        - name               - имя пользователя.\n        - login              - логин пользователя.\n        - password           - пароль.\n- POST   /auth/sign-in       - аутентификация пользователя по логину и паролю. Пользователь получает bearer токен сроком действия 24 часа.\n    - Тело запроса:\n        - login              - логин пользователя.\n        - password           - пароль.\n\n- POST   /api/lists          - создание списка дел.\n    - Тело запроса:\n        - title              - название.\n        - description        - описание.\n- GET    /api/lists          - получение всех списков дел.\n- GET    /api/lists/id       - получение списка дел по id.\n- PUT    /api/lists/id       - изменение списка дел по id.\n    - Тело запроса:\n        - title              - название.\n        - description        - описание.\n- DELETE /api/lists/id       - удаление списка дел по id.\n\n- POST   /api/lists/id/items - создание дел внутри списка.\n    - Тело запроса:\n        - title              - название.\n        - description        - описание.\n- GET    /api/list/id/items  - получение дел списка.\n\n- GET    /api/items/:id      - получение конкретного дела по id.\n- PUT    /api/items/:id      - редактирование дела по id.\n    - Тело запроса:\n        - title              - название.\n        - description        - описание.\n        -  done              - статус выполнения.\n- DELETE /api/items/:id      - удаление дела по id.\n\n# Запуск\n\n```\ngo run cmd/main.go\n```\n\nЕсли приложение запускается впервые, необходимо применить миграции к базе данных:\n\n```\ndocker pull postgres\ndocker run --name=balance-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\n# Примеры\n\nЗапросы сгенерированы из Postman.\n\n### 1. POST  /auth/sign-up\n**Запрос:**\n```\n{\n    \"name\" : \"fedor\",\n    \"username\" : \"fshmidt\",\n    \"password\" : \"qwerty\"\n}\n```\n**Тело ответа:**\n```\n{\"id\":1}\n```\n\n### 2. POST  /auth/sign-in\n**Запрос:**\n```\n{\n    \"username\" : \"fshmidt\",\n    \"password\" : \"qwerty\"\n}\n```\n**Тело ответа:**\n```\n{\"token\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzM5NzcxMzcsImlhdCI6MTY3MzkzMzkzNywidXNlcl9pZCI6M30.FueN9GuYJPgbcIJLPxxk6X0gkzb5QFh7faxF9Ch2Dak\"}\n```\n\n### 3. POST   /api/lists\n**Запрос:**\n```\n{\n    \"title\" : \"Купить\",\n    \"description\" : \"до пятницы\"\n}\n```\n**Тело ответа:**\n```\n{\"id\": 1}\n```\n### 3.  GET  /api/lists\n**Тело ответа:**\n```\n{\n    \"data\": [\n        {\n            \"id\": 2,\n            \"title\": \"Купить\",\n            \"description\": \"до пятницы\"\n        },\n        {\n            \"id\": 1,\n            \"title\": \"Продать\",\n            \"description\": \"до субботы\"\n        }\n    ]\n}\n```\n### 4. GET  /api/lists/id\n**Тело ответа:**\n```\n{\n    \"id\": 2,\n    \"title\": \"Купить\",\n    \"description\": \"до пятницы\"\n}\n\n```\n\n### 5. PUT   /api/lists/id\n**Запрос:**\n```\n{\n    \"title\" : \"Продать\",\n    \"description\" : \"до субботы\"\n}\n```\n**Тело ответа:**\n```\n{\"status\": \"ok\"}\n```\n\n### 6. DELETE /api/lists/id\n**Тело ответа:**\n```\n{\"status\": \"ok\"}\n```\n\n### 7. POST   /api/lists/id/items\n\n**Тело запроса:**\n```\n{\n    \"title\" : \"квартира\",\n    \"description\" : \"3-комнатная\"\n}\n```\n**Тело ответа:**\n```\n{\n    \"id\": 1\n}\n```\n\n### 8. GET    /api/list/id/items\n**Тело ответа:**\n```\n[\n    {\n        \"id\": 1,\n        \"title\": \"квартира\",\n        \"description\": \"3-комнатная\",\n        \"done\": false\n    },\n    {\n        \"id\": 2,\n        \"title\": \"магнитола\",\n        \"description\": \"импортная\",\n        \"done\": false\n    }\n]\n```\n\n### 9. GET    /api/items/id\n**Тело ответа:**\n```\n{\n    \"id\": 1,\n    \"title\": \"квартира\",\n    \"description\": \"3-комнатная\",\n    \"done\": false\n}\n```\n### 10. PUT    /api/items/id\n**Запрос:**\n```\n{\n    \"title\": \"квартира\",\n    \"done\": true\n}\n```\n**Тело ответа:**\n```\n{\n    \"status\": \"ok\"\n}\n```\n### 10. DELETE  /api/items/id\n**Тело ответа:**\n```\n{\n    \"status\": \"ok\"\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffshmidt%2Fmytodoapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffshmidt%2Fmytodoapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffshmidt%2Fmytodoapp/lists"}