From ac5ab7c6ed924ebe4f86696e11d5cb2bbae897cc Mon Sep 17 00:00:00 2001 From: Andrey Ivanov Date: Fri, 9 Oct 2020 12:30:17 +0300 Subject: [PATCH] HW13 WIP 008 --- hw12_13_14_15_calendar/cmd/calendar/main.go | 43 ++++++++----------- hw12_13_14_15_calendar/go.mod | 2 +- .../internal/grpc/converters.go | 21 +++++++++ .../internal/grpc/handlers.go | 30 +++++++++++-- .../internal/grpc/server.go | 31 +++++++++++++ 5 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 hw12_13_14_15_calendar/internal/grpc/server.go diff --git a/hw12_13_14_15_calendar/cmd/calendar/main.go b/hw12_13_14_15_calendar/cmd/calendar/main.go index 27b1e5c..f206138 100644 --- a/hw12_13_14_15_calendar/cmd/calendar/main.go +++ b/hw12_13_14_15_calendar/cmd/calendar/main.go @@ -3,7 +3,6 @@ package main import ( "flag" oslog "log" - "net" "os" "os/signal" @@ -14,7 +13,6 @@ import ( "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/logger" internalhttp "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/server/http" store "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/storage" - googrpc "google.golang.org/grpc" ) var configFile string @@ -46,32 +44,27 @@ func main() { calendar := app.New(log, st) serverHTTP := internalhttp.NewServer(calendar, conf.Server.Address, conf.Server.Port) - - listnGrpc, err := net.Listen("tcp", net.JoinHostPort(conf.Grpc.Address, conf.Grpc.Port)) - if err != nil { - log.Fatalf("failed to listen %v", err) - } - serverGRPC := googrpc.NewServer() - grpc.RegisterGrpcServer(serverGRPC, grpc.Service{App: *calendar}) - if err := serverGRPC.Serve(listnGrpc); err != nil { - log.Errorf("failed to start grpc server: " + err.Error()) - os.Exit(1) - } - go func() { - signals := make(chan os.Signal, 1) - signal.Notify(signals) - - <-signals - signal.Stop(signals) - - if err := serverHTTP.Stop(); err != nil { - log.Errorf("failed to stop http server: " + err.Error()) + if err := serverHTTP.Start(); err != nil { + log.Errorf("failed to start http server: " + err.Error()) + os.Exit(1) } }() - if err := serverHTTP.Start(); err != nil { - log.Errorf("failed to start http server: " + err.Error()) - os.Exit(1) + serverGRPC := grpc.New(calendar) + go func() { + if err := serverGRPC.Start(conf); err != nil { + log.Errorf("failed to start grpc server: " + err.Error()) + os.Exit(1) + } + }() + + signals := make(chan os.Signal, 1) + signal.Notify(signals) + <-signals + signal.Stop(signals) + serverGRPC.Stop() + if err := serverHTTP.Stop(); err != nil { + log.Errorf("failed to stop http server: " + err.Error()) } } diff --git a/hw12_13_14_15_calendar/go.mod b/hw12_13_14_15_calendar/go.mod index 1e4228f..3a5d371 100644 --- a/hw12_13_14_15_calendar/go.mod +++ b/hw12_13_14_15_calendar/go.mod @@ -5,13 +5,13 @@ go 1.14 require ( github.com/BurntSushi/toml v0.3.1 github.com/amitrai48/logger v0.0.0-20190214092904-448001c055ec - github.com/daixiang0/gci v0.2.4 // indirect github.com/go-sql-driver/mysql v1.5.0 github.com/golang/protobuf v1.4.2 github.com/grpc-ecosystem/grpc-gateway v1.15.0 github.com/stretchr/testify v1.4.0 go.uber.org/zap v1.15.0 // indirect golang.org/x/net v0.0.0-20200625001655-4c5254603344 + golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305 // indirect google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 google.golang.org/grpc v1.32.0 google.golang.org/protobuf v1.25.0 // indirect diff --git a/hw12_13_14_15_calendar/internal/grpc/converters.go b/hw12_13_14_15_calendar/internal/grpc/converters.go index 0a12180..8e424e7 100644 --- a/hw12_13_14_15_calendar/internal/grpc/converters.go +++ b/hw12_13_14_15_calendar/internal/grpc/converters.go @@ -1,6 +1,8 @@ package grpc import ( + "time" + "github.com/golang/protobuf/ptypes" "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/storage/event" ) @@ -38,3 +40,22 @@ func pbeventWitID2eventAndID(pbe *EventWthID) (id event.ID, evt event.Event, err } return event.ID(pbe.ID), evt, nil } + +func evtMap2pbEventList(evtMap map[event.ID]event.Event) (*EventList, error) { + var events = &EventList{} + var err error + for k, v := range evtMap { + evt := Event{ID: int64(k), Title: v.Title, Latency: ptypes.DurationProto(v.Latency), Note: v.Note, UserID: v.UserID, NotifyTime: ptypes.DurationProto(v.NotifyTime)} + evt.Date, err = ptypes.TimestampProto(v.Date) + if err != nil { + return nil, err + } + events.Events = append(events.Events, &evt) + } + return events, err +} + +func pbDate2Time(e *Date) (start time.Time, qrange string, err error) { + date, err := ptypes.Timestamp(e.Date) + return date, string(e.Range), err +} diff --git a/hw12_13_14_15_calendar/internal/grpc/handlers.go b/hw12_13_14_15_calendar/internal/grpc/handlers.go index fac483a..11509bc 100644 --- a/hw12_13_14_15_calendar/internal/grpc/handlers.go +++ b/hw12_13_14_15_calendar/internal/grpc/handlers.go @@ -2,9 +2,11 @@ package grpc import ( "context" + "errors" "github.com/golang/protobuf/ptypes/empty" "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/app" + "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/storage/event" ) type Service struct { @@ -33,18 +35,38 @@ func (s Service) Update(ctx context.Context, e *EventWthID) (*empty.Empty, error return nil, s.App.Storage.Update(cid, ce) } +// TODO: Implement func (s Service) Delete(ctx context.Context, e *EventID) (*empty.Empty, error) { - return nil, nil + return nil, s.App.Storage.Delete(event.ID(e.ID)) } +// TODO: Implement func (s Service) List(ctx context.Context, e *empty.Empty) (*EventList, error) { - return nil, nil + tmp, err := s.App.Storage.List() + if err != nil { + return nil, err + } + return evtMap2pbEventList(tmp) } +// TODO: Implement func (s Service) GetByID(ctx context.Context, e *EventID) (*EventList, error) { - return nil, nil + tmp, ok := s.App.Storage.GetByID(event.ID(e.ID)) + if !ok { + return nil, errors.New("event not found") + } + return evtMap2pbEventList(map[event.ID]event.Event{event.ID(e.ID): tmp}) } +// TODO: Implement func (s Service) GetByDate(ctx context.Context, e *Date) (*EventList, error) { - return nil, nil + d, r, err := pbDate2Time(e) + if err != nil { + return nil, err + } + tmp, err := s.App.Storage.GetByDate(d, r) + if err != nil { + return nil, err + } + return evtMap2pbEventList(tmp) } diff --git a/hw12_13_14_15_calendar/internal/grpc/server.go b/hw12_13_14_15_calendar/internal/grpc/server.go new file mode 100644 index 0000000..1076a1f --- /dev/null +++ b/hw12_13_14_15_calendar/internal/grpc/server.go @@ -0,0 +1,31 @@ +package grpc + +import ( + "net" + + "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/app" + "github.com/tiburon-777/HW_OTUS/hw12_13_14_15_calendar/internal/config" + googrpc "google.golang.org/grpc" +) + +type Server struct { + s *googrpc.Server + app app.App +} + +func New(app *app.App) Server { + return Server{s: googrpc.NewServer(), app: *app} +} + +func (s *Server) Start(conf config.Config) error { + s.app.Logger.Infof("GRPC server starting") + listnGrpc, err := net.Listen("tcp", net.JoinHostPort(conf.Grpc.Address, conf.Grpc.Port)) + if err != nil { + return err + } + return s.s.Serve(listnGrpc) +} + +func (s *Server) Stop() { + s.s.GracefulStop() +}