Разработал REST API сервис заметок на Go: signup/login, bearer-token sessions, защищённые эндпоинты, PostgreSQL, миграции и Docker Compose. Реализовал middleware для логирования и авторизации, graceful shutdown.
- Go
- Docker + Docker Compose
- migrate (golang-migrate)
- Запустить PostgreSQL:
make up- Установить переменную окружения для подключения к БД:
export DATABASE_URL='postgres://app:app@localhost:5432/gopher_notes?sslmode=disable'или положить в окружение любым способом.
- Применить миграции:
make migrate-up- Запустить сервер:
make runServer будет доступен на http://localhost:8080.
curl -i http://localhost:8080/healthcurl -i -X POST http://localhost:8080/signup \
-H 'Content-Type: application/json' \
-d '{"email":"a@b.com","password":"123"}'curl -i -X POST http://localhost:8080/login \
-H 'Content-Type: application/json' \
-d '{"email":"a@b.com","password":"123"}'curl -i -X POST http://localhost:8080/logout \
-H "Authorization: Bearer <TOKEN>"curl -i http://localhost:8080/me \
-H "Authorization: Bearer <TOKEN>"Create:
curl -i -X POST http://localhost:8080/notes \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer <TOKEN>" \
-d '{"title":"t1","body":"b1"}'List:
curl -i http://localhost:8080/notes \
-H "Authorization: Bearer <TOKEN>"Get by id:
curl -i http://localhost:8080/notes/1 \
-H "Authorization: Bearer <TOKEN>"Delete:
curl -i -X DELETE http://localhost:8080/notes/1 \
-H "Authorization: Bearer <TOKEN>"cmd/api— entrypointinternal/app— wiring (db, http server, graceful shutdown)internal/http— handlers, middleware, router, dtointernal/repository— работа с PostgreSQL (users/sessions/notes)migrations— миграции базы данных
Все ошибки возвращаются в JSON, например:
{"error":"..."}- Config struct + env validation
- Cleanup expired sessions (cron / background job)
- Pagination for notes list