Categorygithub.com/Go-CT-ITMO/library
module
0.0.0-20250117184540-1068178528e1
Repository: https://github.com/go-ct-itmo/library.git
Documentation: pkg.go.dev

# README

Library

Задание

В этом домашнем задании вам предстоит реализовать свой собственный сервис library. В последующих домашних заданиях вы будете его развивать.

Ваш сервис должен поддерживать следующее API:

syntax = "proto3";

package library;

option go_package = "github.com/Go-CT-ITMO/library-yourname;library";

service Library {
  rpc AddBook(AddBookRequest) returns (AddBookResponse) {}
  
  rpc UpdateBook(UpdateBookRequest) returns (UpdateBookResponse) {}

  rpc GetBookInfo(GetBookInfoRequest) returns (GetBookInfoResponse) {}

  rpc RegisterAuthor(RegisterAuthorRequest) returns (RegisterAuthorResponse) {}

  rpc ChangeAuthorInfo(ChangeAuthorInfoRequest) returns (ChangeAuthorInfoResponse) {}

  rpc GetAuthorInfo(GetAuthorInfoRequest) returns (GetAuthorInfoResponse) {}

  rpc GetAuthorBooks(GetAuthorBooksRequest) returns (stream Book) {}
}

message Book {
  string id = 1;
  string name = 2;
  repeated string author_id = 3;
}

message AddBookRequest {
  string name = 1;
  repeated string author_id = 2;
}

message AddBookResponse {
  Book book = 1;
}

message UpdateBookRequest {
  string id = 1;
  string name = 2;
}

message UpdateBookResponse {}

message GetBookInfoRequest {
  string id = 1;
}

message GetBookInfoResponse {
  Book book = 1;
}

message RegisterAuthorRequest {
  string name = 1;
}

message RegisterAuthorResponse {
  string id = 1;
}

message ChangeAuthorInfoRequest {
  string id = 1;
  string name = 2;
}

message ChangeAuthorInfoResponse {}

message GetAuthorInfoRequest {
  string id = 1;
}

message GetAuthorInfoResponse {
  string id = 1;
  string name = 2;
}

message GetAuthorBooksRequest {
  string author_id = 1;
}

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

  • Код тестов можно посмотреть в файле integration_test.go.
  • В рамках CI вам необходимо реализовать метку run для запуска вашего сервиса.
  • В рамках CI вы можете реализовать метку generate, чтобы не пушить сгенерированный код.
  • gRPC сервис и gRPC gateway должны быть подняты на портах, указанных в соответствующих переменных окружения GRPC_PORT и GRPC_GATEWAY_PORT.
  • Для gRPC сервиса и gRPC gateway необходимо реализовать health checks.
// library.yaml
make generate
make run &
echo $! > service_pid.txt

// Makefile
run:
  echo "OK"
# TODO: not implemented

generate:
  echo "OK"
# TODO: not implemented
mux.HandlePath("GET", "/health", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintln(w, "OK")
})

s := grpc.NewServer()
grpc_health_v1.RegisterHealthServer(s, health.NewServer())
reflection.Register(s)

Требования

  • Необходимо сгенерировать моки и написать свои тесты, степень покрытия будет проверяться в CI.
  • Некоторые пути для gRPC gateway явно указаны в тестах, это необходимо учитывать.
  • Должна быть настроена генерация с использованием Makefile.
  • Должна быть реализована поддержка валидации.

Рекомендации

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

  • Используйте тесты, чтобы осознать недосказанности.
  • В этом домашнем задании вы сами организовываете структуру проекта, что будет оцениваться во время ревью.
  • В данном домашнем задании необходимо реализовать in-memory хранилище, которое потом будет заменено на базу данных.

Сдача

  • Открыть pull request из ветки hw в ветку main вашего репозитория.
  • В описании PR заполнить количество часов, которые вы потратили на это задание.
  • Отправить заявку на ревью в соответствующей форме.
  • Время дедлайна фиксируется отправкой формы.
  • Изменять файлы в ветке main без PR запрещено.
  • Изменять файл CI workflow запрещено.

Makefile

Для удобств локальной разработки сделан Makefile. Имеются следующие команды:

Запустить полный цикл (линтер, тесты):

make all

Запустить только тесты:

make test

Запустить линтер:

make lint

Подтянуть новые тесты:

make update

При разработке на Windows рекомендуется использовать WSL, чтобы была возможность пользоваться вспомогательными скриптами.

# Packages

No description provided by the author