From 01a823caf271ef093e7c45a5668f7f1e6a0c9a35 Mon Sep 17 00:00:00 2001 From: "chub.roman2" Date: Fri, 29 Nov 2024 15:08:20 +0300 Subject: [PATCH] =?UTF-8?q?[MR-1]=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/main.go | 24 ++++++++++++++- go.mod | 1 + go.sum | 1 + internal/model/model.go | 8 +++++ internal/repository/repository.go | 49 +++++++++++++++++++++++++++++++ internal/server/create_cat.go | 18 ++++++++++++ internal/server/get_cat.go | 24 +++++++++++++++ internal/server/grpc.go | 26 ++-------------- internal/server/list_cats.go | 27 +++++++++++++++++ internal/server/server.go | 31 +++++++++++++++++++ 10 files changed, 185 insertions(+), 24 deletions(-) create mode 100644 internal/model/model.go create mode 100644 internal/repository/repository.go create mode 100644 internal/server/create_cat.go create mode 100644 internal/server/get_cat.go create mode 100644 internal/server/list_cats.go create mode 100644 internal/server/server.go diff --git a/cmd/main.go b/cmd/main.go index d213a4b..efa6c0d 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,10 +2,13 @@ package main import ( "context" + "fmt" "log" "net" + "os" "time" + "github.com/rcv911/service_template/internal/repository" "github.com/rcv911/service_template/internal/server" "github.com/rcv911/service_template/pkg/pyroscope" "github.com/rcv911/service_template/pkg/sig" @@ -21,6 +24,11 @@ func main() { httpHost := "localhost:8080" grpcHost := "localhost:8081" + logger, err := initLogger("info") + if err != nil { + log.Fatalf("failed to init logger: %v", err) + } + lis, err := net.Listen("tcp", grpcHost) if err != nil { log.Fatalf("failed to listen: %v", err) @@ -31,7 +39,12 @@ func main() { log.Fatalf("failed dial gRPC client connection: %v", err) } - grpcServer := server.NewGRPCSServer() + repo := repository.New(logger) + + catService := server.NewCatServiceServer(repo) + catAdminService := server.NewCatAdminServiceServer(repo) + + grpcServer := server.NewGRPCSServer(catService, catAdminService) httpServerCfg := server.Config{ Addr: httpHost, @@ -79,3 +92,12 @@ func main() { log.Fatalf("failed to shutdown http server: %v", err) } } + +func initLogger(level string) (zerolog.Logger, error) { + l, err := zerolog.ParseLevel(level) + if err != nil { + return zerolog.Logger{}, fmt.Errorf("getting log level error [%w]", err) + } + + return zerolog.New(os.Stdout).Level(l).With().Timestamp().Logger(), nil +} diff --git a/go.mod b/go.mod index 6481447..1e28239 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/gin-gonic/gin v1.10.0 github.com/grafana/pyroscope-go v1.2.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 + github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.20.5 github.com/rs/zerolog v1.33.0 github.com/swaggo/files v1.0.1 diff --git a/go.sum b/go.sum index d2e01a2..6fe8b4f 100644 --- a/go.sum +++ b/go.sum @@ -90,6 +90,7 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/internal/model/model.go b/internal/model/model.go new file mode 100644 index 0000000..0c8cdd8 --- /dev/null +++ b/internal/model/model.go @@ -0,0 +1,8 @@ +package model + +type Cat struct { + ID int64 `json:"id"` + Age int64 `json:"age"` + Name string `json:"name"` + Color string `json:"color"` +} diff --git a/internal/repository/repository.go b/internal/repository/repository.go new file mode 100644 index 0000000..6d9b716 --- /dev/null +++ b/internal/repository/repository.go @@ -0,0 +1,49 @@ +package repository + +import ( + "github.com/pkg/errors" + "github.com/rcv911/service_template/internal/model" + "github.com/rs/zerolog" +) + +type Repository struct { + logger zerolog.Logger + storage map[int64]model.Cat +} + +func New(logger zerolog.Logger) *Repository { + return &Repository{ + logger: logger, + } +} + +func (r *Repository) GetCat(id int64) (*model.Cat, error) { + cat, ok := r.storage[id] + if !ok { + return nil, errors.New("cat not found") + } + + return &cat, nil +} + +func (r *Repository) CreateCat(age int64, name, color string) error { + newCat := model.Cat{ + Age: age, + Name: name, + Color: color, + } + + r.storage[newCat.ID] = newCat + + return nil +} + +func (r *Repository) ListCats() []model.Cat { + var cats []model.Cat + + for _, cat := range r.storage { + cats = append(cats, cat) + } + + return cats +} diff --git a/internal/server/create_cat.go b/internal/server/create_cat.go new file mode 100644 index 0000000..9a7c720 --- /dev/null +++ b/internal/server/create_cat.go @@ -0,0 +1,18 @@ +package server + +import ( + "context" + + "github.com/rcv911/service_template/pkg/cat_admin_v1" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (s *CatAdminServiceServer) CreateCat(ctx context.Context, req *cat_admin_v1.CreateCatRequest) (*cat_admin_v1.CatResponse, error) { + err := s.repo.CreateCat(int64(req.GetAge()), req.GetName(), req.GetColor()) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return &cat_admin_v1.CatResponse{}, nil +} diff --git a/internal/server/get_cat.go b/internal/server/get_cat.go new file mode 100644 index 0000000..003b503 --- /dev/null +++ b/internal/server/get_cat.go @@ -0,0 +1,24 @@ +package server + +import ( + "context" + + "github.com/rcv911/service_template/pkg/cat_admin_v1" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// GetCat получение кота +func (s *CatAdminServiceServer) GetCat(ctx context.Context, req *cat_admin_v1.GetCatRequest) (*cat_admin_v1.CatResponse, error) { + cat, err := s.repo.GetCat(req.GetId()) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed get cat: %v", err) + } + + return &cat_admin_v1.CatResponse{ + Id: cat.ID, + Name: cat.Name, + Age: int32(cat.Age), + Color: cat.Color, + }, nil +} diff --git a/internal/server/grpc.go b/internal/server/grpc.go index 5e63f90..9286d05 100644 --- a/internal/server/grpc.go +++ b/internal/server/grpc.go @@ -1,36 +1,16 @@ package server import ( - "context" - "github.com/rcv911/service_template/pkg/cat_admin_v1" "github.com/rcv911/service_template/pkg/cat_v1" "google.golang.org/grpc" ) -type CatAdminServiceServer struct { - cat_admin_v1.UnimplementedCatAdminServiceServer -} - -type CatServiceServer struct { - cat_v1.UnimplementedCatServiceServer -} - -func NewGRPCSServer() *grpc.Server { +func NewGRPCSServer(catService *CatServiceServer, catAdminService *CatAdminServiceServer) *grpc.Server { grpcServer := grpc.NewServer() - cat_admin_v1.RegisterCatAdminServiceServer(grpcServer, &CatAdminServiceServer{}) - cat_v1.RegisterCatServiceServer(grpcServer, &CatServiceServer{}) + cat_admin_v1.RegisterCatAdminServiceServer(grpcServer, catAdminService) + cat_v1.RegisterCatServiceServer(grpcServer, catService) return grpcServer } - -// GetCat получение кота -func (s *CatAdminServiceServer) GetCat(ctx context.Context, req *cat_admin_v1.GetCatRequest) (*cat_admin_v1.CatResponse, error) { - return &cat_admin_v1.CatResponse{ - Id: req.Id, - Name: "Барсик", - Age: 3, - Color: "Черный", - }, nil -} diff --git a/internal/server/list_cats.go b/internal/server/list_cats.go new file mode 100644 index 0000000..7ed9bcb --- /dev/null +++ b/internal/server/list_cats.go @@ -0,0 +1,27 @@ +package server + +import ( + "context" + + "github.com/rcv911/service_template/pkg/cat_admin_v1" +) + +func (s *CatAdminServiceServer) ListCats(ctx context.Context, req *cat_admin_v1.ListCatsRequest) (*cat_admin_v1.ListCatsResponse, error) { + cats := s.repo.ListCats() + + var resp []*cat_admin_v1.CatResponse + + for _, cat := range cats { + resp = append(resp, &cat_admin_v1.CatResponse{ + Id: cat.ID, + Name: cat.Name, + Age: int32(cat.Age), + Color: cat.Color, + }) + } + + return &cat_admin_v1.ListCatsResponse{ + Cats: resp, + TotalCount: int32(len(cats)), + }, nil +} diff --git a/internal/server/server.go b/internal/server/server.go new file mode 100644 index 0000000..9c6b99b --- /dev/null +++ b/internal/server/server.go @@ -0,0 +1,31 @@ +package server + +import ( + "github.com/rcv911/service_template/internal/model" + "github.com/rcv911/service_template/pkg/cat_admin_v1" + "github.com/rcv911/service_template/pkg/cat_v1" +) + +type Repository interface { + ListCats() []model.Cat + CreateCat(age int64, name, color string) error + GetCat(id int64) (*model.Cat, error) +} + +type CatAdminServiceServer struct { + cat_admin_v1.UnimplementedCatAdminServiceServer + repo Repository +} + +type CatServiceServer struct { + cat_v1.UnimplementedCatServiceServer + repo Repository +} + +func NewCatServiceServer(repo Repository) *CatServiceServer { + return &CatServiceServer{repo: repo} +} + +func NewCatAdminServiceServer(repo Repository) *CatAdminServiceServer { + return &CatAdminServiceServer{repo: repo} +}