https://github.com/fshmidt/mytodoapp
REST API for Todo Application with Postgres db and Swagger
https://github.com/fshmidt/mytodoapp
docker gin go golang jwt migration postgresql rest-api swagger
Last synced: about 2 months ago
JSON representation
REST API for Todo Application with Postgres db and Swagger
- Host: GitHub
- URL: https://github.com/fshmidt/mytodoapp
- Owner: fshmidt
- Created: 2022-12-04T11:24:13.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2023-02-20T11:38:00.000Z (over 3 years ago)
- Last Synced: 2025-05-28T08:04:02.073Z (about 1 year ago)
- Topics: docker, gin, go, golang, jwt, migration, postgresql, rest-api, swagger
- Language: Go
- Homepage:
- Size: 43.9 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Приложение для ведения списков дел/покупок
# Содержание
1. [Описание задачи](#Описание-задачи)
1. [Реализация](#Реализация)
1. [Endpoints](#Endpoints)
1. [Запуск](#Запуск)
1. [Примеры](#Примеры)
# Описание задачи
Разработать API для авторизации, аутентификации, создания, редактирования и удаления списков дел/покупок по id пользователя, а так же редактирования и удаления самих списков.
# Реализация
- Следование дизайну REST API.
- Подход "Чистой Архитектуры" и техника внедрения зависимости.
- Работа с фреймворком [gin-gonic/gin](https://github.com/gin-gonic/gin).
- Работа с СУБД Postgres с использованием библиотеки [sqlx](https://github.com/jmoiron/sqlx) и написанием SQL запросов.
- Конфигурация приложения - библиотека [viper](https://github.com/spf13/viper).
- Запуск бд из Docker.
**Структура проекта:**
```
.
├── pkg
│ ├── handler // обработчики запросов
│ ├── service // бизнес-логика
│ └── repository // взаимодействие с БД
├── cmd // точка входа в приложение
├── schema // SQL файлы с миграциями
├── configs // файлы конфигурации
```
# Endpoints
- POST /auth/sign-up - авторизация пользователя по имени, логину и паролю.
- Тело запроса:
- name - имя пользователя.
- login - логин пользователя.
- password - пароль.
- POST /auth/sign-in - аутентификация пользователя по логину и паролю. Пользователь получает bearer токен сроком действия 24 часа.
- Тело запроса:
- login - логин пользователя.
- password - пароль.
- POST /api/lists - создание списка дел.
- Тело запроса:
- title - название.
- description - описание.
- GET /api/lists - получение всех списков дел.
- GET /api/lists/id - получение списка дел по id.
- PUT /api/lists/id - изменение списка дел по id.
- Тело запроса:
- title - название.
- description - описание.
- DELETE /api/lists/id - удаление списка дел по id.
- POST /api/lists/id/items - создание дел внутри списка.
- Тело запроса:
- title - название.
- description - описание.
- GET /api/list/id/items - получение дел списка.
- GET /api/items/:id - получение конкретного дела по id.
- PUT /api/items/:id - редактирование дела по id.
- Тело запроса:
- title - название.
- description - описание.
- done - статус выполнения.
- DELETE /api/items/:id - удаление дела по id.
# Запуск
```
go run cmd/main.go
```
Если приложение запускается впервые, необходимо применить миграции к базе данных:
```
docker pull postgres
docker run --name=balance-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
```
# Примеры
Запросы сгенерированы из Postman.
### 1. POST /auth/sign-up
**Запрос:**
```
{
"name" : "fedor",
"username" : "fshmidt",
"password" : "qwerty"
}
```
**Тело ответа:**
```
{"id":1}
```
### 2. POST /auth/sign-in
**Запрос:**
```
{
"username" : "fshmidt",
"password" : "qwerty"
}
```
**Тело ответа:**
```
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzM5NzcxMzcsImlhdCI6MTY3MzkzMzkzNywidXNlcl9pZCI6M30.FueN9GuYJPgbcIJLPxxk6X0gkzb5QFh7faxF9Ch2Dak"}
```
### 3. POST /api/lists
**Запрос:**
```
{
"title" : "Купить",
"description" : "до пятницы"
}
```
**Тело ответа:**
```
{"id": 1}
```
### 3. GET /api/lists
**Тело ответа:**
```
{
"data": [
{
"id": 2,
"title": "Купить",
"description": "до пятницы"
},
{
"id": 1,
"title": "Продать",
"description": "до субботы"
}
]
}
```
### 4. GET /api/lists/id
**Тело ответа:**
```
{
"id": 2,
"title": "Купить",
"description": "до пятницы"
}
```
### 5. PUT /api/lists/id
**Запрос:**
```
{
"title" : "Продать",
"description" : "до субботы"
}
```
**Тело ответа:**
```
{"status": "ok"}
```
### 6. DELETE /api/lists/id
**Тело ответа:**
```
{"status": "ok"}
```
### 7. POST /api/lists/id/items
**Тело запроса:**
```
{
"title" : "квартира",
"description" : "3-комнатная"
}
```
**Тело ответа:**
```
{
"id": 1
}
```
### 8. GET /api/list/id/items
**Тело ответа:**
```
[
{
"id": 1,
"title": "квартира",
"description": "3-комнатная",
"done": false
},
{
"id": 2,
"title": "магнитола",
"description": "импортная",
"done": false
}
]
```
### 9. GET /api/items/id
**Тело ответа:**
```
{
"id": 1,
"title": "квартира",
"description": "3-комнатная",
"done": false
}
```
### 10. PUT /api/items/id
**Запрос:**
```
{
"title": "квартира",
"done": true
}
```
**Тело ответа:**
```
{
"status": "ok"
}
```
### 10. DELETE /api/items/id
**Тело ответа:**
```
{
"status": "ok"
}
```