Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HiTalent Test Task - API для вопросов и ответов

API-сервис для управления вопросами и ответами, построенный на Go с использованием GORM, PostgreSQL и Docker.

Технологии

  • Go 1.25
  • GORM - ORM для работы с базой данных
  • PostgreSQL - реляционная база данных
  • Goose - миграции базы данных
  • net/http - стандартная библиотека HTTP (без внешних роутеров)
  • Zap - структурированное логирование
  • testify - библиотека для тестирования
  • Docker - контейнеризация

Архитектура

Проект следует Clean Architecture принципам:

backend/
├── cmd/main.go              # Точка входа
├── config/                  # Конфигурация
├── internal/
│   ├── entity/             # Сущности домена
│   ├── port/               # Интерфейсы (порты)
│   │   ├── repo/           # Интерфейсы репозиториев
│   │   └── service/        # Интерфейсы сервисов
│   ├── cases/              # Бизнес-логика (use cases)
│   ├── adapter/            # Адаптеры
│   │   └── repo/           # Реализация репозиториев
│   └── input/              # Входные точки
│       └── http/           # HTTP handlers
└── pkg/
    └── migration/          # Миграции базы данных

API Endpoints

Вопросы (Questions)

  • GET /questions/ - получить список всех вопросов
  • POST /questions/ - создать новый вопрос
  • GET /questions/{id} - получить вопрос и все ответы на него
  • DELETE /questions/{id} - удалить вопрос (вместе с ответами)

Ответы (Answers)

  • POST /questions/{id}/answers/ - добавить ответ к вопросу
  • GET /answers/{id} - получить конкретный ответ
  • DELETE /answers/{id} - удалить ответ

Запуск с помощью Docker

  1. Клонируйте репозиторий:
git clone <repository-url>
cd HiTalent_TestTask
  1. Запустите приложение через docker-compose:
docker-compose up --build

Приложение будет доступно по адресу http://localhost:8080

Запуск локально

  1. Убедитесь, что у вас установлены Go 1.21+ и PostgreSQL

  2. Установите зависимости:

go mod download
  1. Создайте файл .env в корне проекта:
POSTGRES_CONNECTION_STRING=host=localhost user=your_user password=your_password dbname=your_db sslmode=disable port=5432
HTTP_PORT=8080
  1. Запустите миграции (они применяются автоматически при старте приложения)

  2. Запустите приложение:

go run backend/cmd/main.go

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

Создать вопрос

curl -X POST http://localhost:8080/questions/ \
  -H "Content-Type: application/json" \
  -d '{"text": "Что такое Go?"}'

Получить список вопросов

curl http://localhost:8080/questions/

Получить вопрос с ответами

curl http://localhost:8080/questions/1

Добавить ответ к вопросу

curl -X POST http://localhost:8080/questions/1/answers \
  -H "Content-Type: application/json" \
  -d '{"user_id": "user-123", "text": "Go - это язык программирования"}'

Получить ответ

curl http://localhost:8080/answers/1

Удалить вопрос

curl -X DELETE http://localhost:8080/questions/1

Удалить ответ

curl -X DELETE http://localhost:8080/answers/1

Особенности реализации

  • Каскадное удаление: при удалении вопроса автоматически удаляются все его ответы
  • Валидация: нельзя создать ответ к несуществующему вопросу
  • Множественные ответы: один пользователь может оставлять несколько ответов на один вопрос
  • Структурированное логирование с использованием Zap
  • Автоматические миграции при запуске приложения

Структура базы данных

Таблица questions

  • id - первичный ключ (SERIAL)
  • text - текст вопроса (TEXT, NOT NULL)
  • created_at - время создания (TIMESTAMP, DEFAULT NOW())

Таблица answers

  • id - первичный ключ (SERIAL)
  • question_id - внешний ключ на questions (INTEGER, NOT NULL)
  • user_id - идентификатор пользователя (VARCHAR(255), NOT NULL)
  • text - текст ответа (TEXT, NOT NULL)
  • created_at - время создания (TIMESTAMP, DEFAULT NOW())

Тестирование

Unit-тесты

Проект включает комплексные unit-тесты с использованием httptest и testify:

  • Покрытие кода: 71.5%
  • Количество тестов: 28
  • Технологии: httptest, testify/assert, testify/require

Запуск тестов

# Запустить все тесты
go test ./backend/...

# Запустить тесты с выводом подробной информации
go test ./backend/... -v

# Запустить тесты с покрытием кода
go test ./backend/... -cover

# Запустить тесты для конкретного пакета
go test ./backend/internal/input/http/server/... -v

Что покрыто тестами

Вопросы (Questions):

  • Получение списка вопросов (включая пустой список)
  • Создание вопроса
  • Валидация при создании (пустой текст)
  • Получение вопроса по ID
  • Получение вопроса с ответами
  • Обработка несуществующего вопроса
  • Удаление вопроса
  • Проверка CreatedAt

Ответы (Answers):

  • Создание ответа
  • Валидация при создании (пустой текст, пустой UserId)
  • Создание ответа к несуществующему вопросу
  • Получение ответа по ID
  • Обработка несуществующего ответа
  • Удаление ответа
  • Несколько ответов от одного пользователя
  • Проверка CreatedAt

Дополнительные тесты:

  • Обработка невалидных HTTP методов
  • Обработка невалидных ID
  • Обработка невалидного JSON
  • Получение вопроса с несколькими ответами

In-memory репозитории

Для изоляции тестов от базы данных используются in-memory репозитории:

  • memory.QuestionRepo - реализация репозитория вопросов в памяти
  • memory.AnswerRepo - реализация репозитория ответов в памяти

Это позволяет запускать тесты быстро и независимо от внешних зависимостей.

Логирование

Приложение использует структурированное логирование через Zap. Все операции (создание, чтение, удаление) логируются с соответствующим уровнем детализации.

About

Test task for "Хайталент" company (go developer)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages