Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions .github/workflows/branch_merges.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: '1.25'
cache: true
go-version: '1.25.4'
cache: false

- name: Run golangci-lint
uses: golangci/golangci-lint-action@v8
uses: golangci/golangci-lint-action@v9
with:
#install-mode: goinstall
version: latest
Expand All @@ -74,7 +74,7 @@ jobs:

strategy:
matrix:
go-version: ['1.25']
go-version: ['1.25.4']
os: [ubuntu-latest]

steps:
Expand All @@ -91,7 +91,7 @@ jobs:

- name: Run comprehensive tests
run: |
go test -v -race -coverprofile=coverage.out ./...
go test -v -race -coverprofile=coverage.out ./internal/...
go tool cover -func=coverage.out
go tool cover -html=coverage.out -o coverage.html

Expand All @@ -110,7 +110,7 @@ jobs:

strategy:
matrix:
go-version: ['1.25']
go-version: ['1.25.4']
os: [ubuntu-latest]

steps:
Expand All @@ -123,7 +123,7 @@ jobs:
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go-version }}
cache: true
cache: false

- name: Build application
run: |
Expand All @@ -132,10 +132,12 @@ jobs:

# Собираем основное приложение
echo "🔨 Building main application..."
go build -o dist/notes -v -ldflags="-s -w" ./cmd/notes
go build -o dist/grpc-client -v -ldflags="-s -w" ./cmd/grpc-client
go build -o dist/grpc-server -v -ldflags="-s -w" ./cmd/grpc-server
go build -o dist/web-server -v -ldflags="-s -w" ./cmd/web-server

# Проверяем что бинарник создан
if [ -f dist/notes ]; then
# Проверяем что все бинарники созданы
if [ -f dist/grpc-client ] && [ -f dist/grpc-server ] && [ -f dist/web-server ]; then
echo "✅ Build successful!"
ls -la dist/
else
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ coverage.html
bin/
dist/

# Local data for testing
data/

# OS specific
.DS_Store
Thumbs.db
Expand Down
69 changes: 69 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
.DEFAULT_GOAL := help

.PHONY: proto
proto: check-deps
@echo "🚀 Launch script for Protocol Buffer code generation..."
@chmod +x scripts/generate-proto.sh
@./scripts/generate-proto.sh

.PHONY: proto-deps
proto-deps:
@echo "🛠️ Installing protobuf dependencies..."
@which protoc > /dev/null || (echo "⚠️ Note: protoc not found. Please install protobuf-compiler" && sleep 2)
@go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
@go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

.PHONY: check-deps
check-deps:
@echo "🔍 Checking build dependencies..."
@which protoc > /dev/null || (echo "❌ Error: protoc not installed.\n On Ubuntu: sudo apt-get install protobuf-compiler\n On macOS: brew install protobuf" && exit 1)
@[ -f "$(shell go env GOPATH)/bin/protoc-gen-go" ] || (echo "❌ Error: protoc-gen-go not installed. Run 'make proto-deps'" && exit 1)
@[ -f "$(shell go env GOPATH)/bin/protoc-gen-go-grpc" ] || (echo "❌ Error: protoc-gen-go-grpc not installed. Run 'make proto-deps'" && exit 1)
@echo "✅ All dependencies are satisfied"

.PHONY: all
all: proto-deps proto
@echo "✅ Build setup completed!"

.PHONY: clean-proto
clean-proto:
@echo "🧹 Cleaning generated protobuf code..."
@rm -rf pkg/proto/*

.PHONY: swag
swag: check-swag-deps
@echo "🚀 Launch script for Swagger documentation generation..."
@chmod +x scripts/generate-swag.sh
@./scripts/generate-swag.sh

.PHONY: swag-deps
swag-deps:
@echo "🛠️ Installing Swaggo dependencies..."
@go install github.com/swaggo/swag/cmd/swag@latest

.PHONY: check-swag-deps
check-swag-deps:
@echo "🔍 Checking Swaggo dependencies..."
@which swag > /dev/null || (echo "❌ Error: swag not installed. Run 'make swag-deps'" && exit 1)
@echo "✅ Swaggo dependencies are satisfied"

.PHONY: test
test:
@go test ./...

.PHONY: build
build: proto swag
@go build ./...

.PHONY: help
help:
@echo "Available targets:"
@echo " proto - Generate protobuf code"
@echo " proto-deps - Install Go protobuf dependencies (requires protoc)"
@echo " swag - Generate Swagger documentation"
@echo " swag-deps - Install Swaggo dependencies"
@echo " all - Install proto-deps and generate proto"
@echo " test - Run tests"
@echo " clean-proto - Remove generated protobuf code"
@echo ""
@echo "⚠️ Note: protoc must be installed separately via system package manager"
203 changes: 201 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,201 @@
# go-notes
Golang learning repo
# Go Notes

Репозиторий для изучения языка Go, демонстрирующий создание веб-сервера и gRPC-сервера с возможностью управления заметками и пользователями.

[![Go Version](https://img.shields.io/badge/Go-1.25+-blue.svg)](https://golang.org)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)

## Особенности проекта

- **Веб-API**: RESTful API с использованием фреймворка Gin
- **gRPC-сервер**: Реализация gRPC-сервисов для заметок и пользователей
- **Аутентификация**: JWT-токены для защиты маршрутов
- **Хранение данных**: Поддержка различных хранилищ (в памяти и в JSON-файлах)
- **Документация API**: Swagger UI для веб-API
- **Protocol Buffers**: Для определения gRPC-сервисов
- **Тестирование**: Модульные тесты

## Структура проекта

```
go-notes/
├── api/ # Определения API (protobuf)
├── cmd/ # Основные приложения
│ ├── grpc-client/ # Клиент gRPC
│ ├── grpc-server/ # Сервер gRPC
│ └── web-server/ # Веб-сервер (REST API)
├── docs/ # Документация Swagger
├── internal/ # Внутренний код приложения
│ ├── grpc/ # Реализация gRPC-сервера
│ ├── handler/ # Обработчики HTTP-запросов
│ ├── middleware/ # HTTP-мидлвары (например, аутентификация)
│ ├── model/ # Определения структур данных
│ ├── repository/ # Интерфейсы и фабрики репозиториев
│ └── util/ # Вспомогательные утилиты
├── pkg/ # Публичные пакеты (сгенерированный protobuf-код)
├── scripts/ # Скрипты для генерации кода
└── Makefile # Сборочные команды
```

## Функциональность

### Веб-сервер (REST API)
- Аутентификация пользователей через JWT
- CRUD-операции для заметок и пользователей
- Swagger UI доступен по адресу `/swagger/index.html`
- Защищенные маршруты для изменения данных
- Открытые маршруты для чтения данных

### gRPC-сервер
- Сервис для управления заметками
- Сервис для управления пользователями
- Поддержка всех CRUD-операций через gRPC

### Хранение данных
- RAM-хранилище для временных данных
- JSON-хранилище для сохранения данных между запусками

## Запуск приложения

### Предварительные требования
- Go 1.25.4 или выше
- protoc (компилятор Protocol Buffers)
- make

### Установка зависимостей

```bash
# Установка зависимостей для protobuf
make proto-deps

# Генерация protobuf-кода
make proto

# Установка зависимостей для Swagger
make swag-deps

# Генерация документации Swagger
make swag
```

### Запуск веб-сервера

```bash
go run cmd/web-server/main.go
```

Сервер будет доступен по адресу `http://localhost:8080`, Swagger UI по адресу `http://localhost:8080/swagger/index.html`.

### Запуск gRPC-сервера

```bash
go run cmd/grpc-server/main.go
```

Сервер будет доступен по адресу `localhost:50051`.

### Запуск gRPC-клиента

```bash
go run cmd/grpc-client/main.go
```

Клиент выполнит тестовые операции с gRPC-сервером.

## Примеры использования API

### Работа с пользователями

#### Регистрация пользователя
```bash
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{"username": "testuser", "email": "test@example.com", "password": "password123"}'
```

#### Аутентификация пользователя (получение JWT-токена)
```bash
curl -X POST http://localhost:8080/api/login \
-H "Content-Type: application/json" \
-d '{"username": "testuser", "password": "password123"}'
```

После успешной аутентификации вы получите JWT-токен. При использовании токена в других запросах не включайте фигурные скобки `{}` - они используются только для обозначения плейсхолдера в примерах.

#### Получение всех пользователей
```bash
curl -X GET http://localhost:8080/api/users
```

#### Получение пользователя по ID
```bash
curl -X GET http://localhost:8080/api/users/{user_id}
```

#### Обновление пользователя (требует JWT-токен)
```bash
curl -X PUT http://localhost:8080/api/users/{user_id} \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {jwt_token}" \
-d '{"username": "updateduser", "email": "updated@example.com", "password": ""}'
```

#### Удаление пользователя (требует JWT-токен)
```bash
curl -X DELETE http://localhost:8080/api/users/{user_id} \
-H "Authorization: Bearer {jwt_token}"
```

### Работа с заметками

#### Создание заметки (требует JWT-токен)
```bash
curl -X POST http://localhost:8080/api/notes \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {jwt_token}" \
-d '{"title": "Моя заметка", "content": "Содержимое заметки"}'
```

#### Получение всех заметок (открытый маршрут)
```bash
curl -X GET http://localhost:8080/api/notes
```

#### Получение заметки по ID (требует JWT-токен)
```bash
curl -X GET http://localhost:8080/api/notes/{note_id} \
-H "Authorization: Bearer {jwt_token}"
```

#### Обновление заметки (требует JWT-токен)
```bash
curl -X PUT http://localhost:8080/api/notes/{note_id} \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {jwt_token}" \
-d '{"id": "{note_id}", "title": "Обновленная заметка", "content": "Обновленное содержимое"}'
```

#### Удаление заметки (требует JWT-токен)
```bash
curl -X DELETE http://localhost:8080/api/notes/{note_id} \
-H "Authorization: Bearer {jwt_token}"
```

## Используемые технологии

- [Gin](https://github.com/gin-gonic/gin) - веб-фреймворк
- [gRPC](https://grpc.io/) - фреймворк для RPC
- [Protocol Buffers](https://developers.google.com/protocol-buffers) - язык описания схемы данных
- [JWT](https://jwt.io/) - токены для аутентификации
- [Swaggo](https://github.com/swaggo/swag) - генерация документации Swagger
- [Testify](https://github.com/stretchr/testify) - библиотека для тестирования

## Make-цели

- `make proto` - генерация protobuf-кода
- `make proto-deps` - установка зависимостей protobuf
- `make swag` - генерация документации Swagger
- `make swag-deps` - установка зависимостей Swagger
- `make test` - запуск тестов
- `make build` - сборка приложения
- `make help` - список всех целей
Loading