From cc8027d859052b2917ff6bb18262fff1823a339b Mon Sep 17 00:00:00 2001 From: Anton Sattarov <dirty.mew@gmail.com> Date: Fri, 29 Nov 2024 11:33:51 +0100 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20gPRC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/templates/transport/grpc_server.tmpl | 60 +++++++++ perxis-proto | 2 +- pkg/invitations/conv.go | 138 ++++++++++++++++++++ pkg/invitations/server.go | 68 ++++++++++ 4 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 assets/templates/transport/grpc_server.tmpl create mode 100644 pkg/invitations/conv.go create mode 100644 pkg/invitations/server.go diff --git a/assets/templates/transport/grpc_server.tmpl b/assets/templates/transport/grpc_server.tmpl new file mode 100644 index 00000000..800868a4 --- /dev/null +++ b/assets/templates/transport/grpc_server.tmpl @@ -0,0 +1,60 @@ +import ( + pb "git.perx.ru/perxis/perxis-go/proto/{{lower .Interface.Name}}" + grpc "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/emptypb" +) + + +type Server struct { + pb.Unimplemented{{.Interface.Name}}Server + service {{.Interface.Name}} +} + +func NewServer(svc {{.Interface.Name}}) *Server { + return &Server{service: svc} +} + +func RegisterServer(grpcSrv *grpc.Server, srv *Server) { + pb.Register{{.Interface.Name}}Server(grpcSrv, srv) +} + + +{{range $method := .Interface.Methods}} + {{- if $method.ReturnsError}} + {{ $resList := list }} + {{ $resListLen := add 0 }} + {{- range $param := $method.Results -}} + {{- if not ( and $method.ReturnsError (eq $param.Name "err")) -}} + {{- $resList = append $resList $param.Name -}} + {{- $resListLen = add $resListLen 1 -}} + {{- end -}} + {{- end -}} + + {{- $response := (printf "*pb.%sResponse" $method.Name) -}} + {{- if eq $resListLen 0 -}} + {{- $response = (print "*emptypb.Empty") -}} + {{- end -}} + + // {{$method.Name}} implements {{$.Interface.Name}} + func (s *Server) {{$method.Name}}(ctx context.Context, request *pb.{{$method.Name}}Request) (response {{ $response }}, err error) { + req := {{$method.Name}}RequestFromPB(request) + {{- $paramList := list -}} + {{- range $param := $method.Params -}} + {{- if not ( and $method.AcceptsContext (eq $param.Name "ctx")) -}} + {{- $paramList = append $paramList (printf "req.%s" $param.Name ) -}} + {{- end -}} + {{- end }} + + {{ if gt $resListLen 0 }} + {{- $method.ResultsNames | join `,` -}} := s.service.{{- $method.Name -}}(ctx, {{- $paramList | join `, ` -}}) + {{- else }} + err = s.service.{{- $method.Name -}}(ctx, {{- $paramList | join `, ` -}}) + {{- end }} + + {{ if gt $resListLen 0 -}} + response = {{- $method.Name -}}ResponseToPB({{- $resList | join `,` -}}) + {{- end }} + return + } + {{ end }} +{{ end }} \ No newline at end of file diff --git a/perxis-proto b/perxis-proto index e86c1f43..0a04737a 160000 --- a/perxis-proto +++ b/perxis-proto @@ -1 +1 @@ -Subproject commit e86c1f4304bde0094f870346f4ba3bf4a7e8858f +Subproject commit 0a04737abf1e4f779ad1319b80721482f7af91cd diff --git a/pkg/invitations/conv.go b/pkg/invitations/conv.go new file mode 100644 index 00000000..2bdd3be4 --- /dev/null +++ b/pkg/invitations/conv.go @@ -0,0 +1,138 @@ +package invitations + +import ( + "git.perx.ru/perxis/perxis-go/pkg/options" + pb "git.perx.ru/perxis/perxis-go/proto/invitations" + timestamp "google.golang.org/protobuf/types/known/timestamppb" +) + +type AcceptRequest struct { + invitationId string + userId string +} + +func AcceptRequestFromPB(request *pb.AcceptRequest) *AcceptRequest { + return &AcceptRequest{invitationId: request.InvitationId, userId: request.UserId} +} + +type CreateRequest struct { + invitation *Invitation +} + +func CreateRequestFromPB(request *pb.CreateRequest) *CreateRequest { + + return &CreateRequest{invitation: InvitationFromProto(request.Invitation)} +} + +func CreateResponseToPB(invitation *Invitation) *pb.CreateResponse { + + return nil +} + +type DeleteRequest struct { + invitationId string +} + +func DeleteRequestFromPB(request *pb.DeleteRequest) *DeleteRequest { + return &DeleteRequest{invitationId: request.InvitationId} +} + +type FindRequest struct { + filter *Filter + opts *options.FindOptions +} + +func FindRequestFromPB(request *pb.FindRequest) *FindRequest { + if request == nil { + return nil + } + + req := &FindRequest{} + + if request.Filter != nil { + req.filter = &Filter{ + ID: request.Filter.Id, + Email: request.Filter.Email, + OrgID: request.Filter.OrgId, + SpaceID: request.Filter.SpaceId, + OwnerID: request.Filter.OwnerId, + Role: request.Filter.Role, + } + } + + if request.Options != nil { + req.opts = options.FindOptionsFromPB(request.Options) + } + + return nil +} + +func FindResponseToPB(invitations []*Invitation, total int) *pb.FindResponse { + protoInvitations := make([]*pb.Invitation, 0, len(invitations)) + for _, i := range invitations { + protoInvitations = append(protoInvitations, InvitationToProto(i)) + } + return &pb.FindResponse{ + Invitations: protoInvitations, + Total: int64(total), + } +} + +type GetRequest struct { + invitationId string +} + +func GetRequestFromPB(request *pb.GetRequest) *GetRequest { + if request == nil { + return nil + } + return &GetRequest{invitationId: request.InvitationId} +} + +func GetResponseToPB(invitation *Invitation) *pb.GetResponse { + return &pb.GetResponse{Invitation: InvitationToProto(invitation)} +} + +func InvitationToProto(invitation *Invitation) *pb.Invitation { + if invitation == nil { + return nil + } + pi := &pb.Invitation{ + Id: invitation.ID, + Email: invitation.Email, + OrgId: invitation.OrgID, + SpaceId: invitation.SpaceID, + OwnerId: invitation.OwnerID, + Role: invitation.Role, + } + if invitation.CreatedAt != nil && !invitation.CreatedAt.IsZero() { + pi.CreatedAt = timestamp.New(*invitation.CreatedAt) + } + if invitation.ValidUntil != nil && !invitation.ValidUntil.IsZero() { + pi.ValidUntil = timestamp.New(*invitation.ValidUntil) + } + return pi +} + +func InvitationFromProto(protoInvitation *pb.Invitation) *Invitation { + if protoInvitation == nil { + return nil + } + i := &Invitation{ + ID: protoInvitation.Id, + Email: protoInvitation.Email, + OrgID: protoInvitation.OrgId, + SpaceID: protoInvitation.SpaceId, + OwnerID: protoInvitation.OwnerId, + Role: protoInvitation.Role, + } + if protoInvitation.CreatedAt != nil { + t := protoInvitation.CreatedAt.AsTime() + i.CreatedAt = &t + } + if protoInvitation.ValidUntil != nil { + t := protoInvitation.ValidUntil.AsTime() + i.ValidUntil = &t + } + return i +} diff --git a/pkg/invitations/server.go b/pkg/invitations/server.go new file mode 100644 index 00000000..28360662 --- /dev/null +++ b/pkg/invitations/server.go @@ -0,0 +1,68 @@ +// Code generated by gowrap. DO NOT EDIT. +// template: ../../assets/templates/transport/grpc_server.tmpl +// gowrap: http://github.com/hexdigest/gowrap + +package invitations + +//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/invitations -i Invitations -t ../../assets/templates/transport/grpc_server.tmpl -o server.go -l "" + +import ( + "context" + + pb "git.perx.ru/perxis/perxis-go/proto/invitations" + grpc "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/emptypb" +) + +type Server struct { + pb.UnimplementedInvitationsServer + service Invitations +} + +func NewServer(svc Invitations) *Server { + return &Server{service: svc} +} + +func RegisterServer(grpcSrv *grpc.Server, srv *Server) { + pb.RegisterInvitationsServer(grpcSrv, srv) +} + +// Accept implements Invitations +func (s *Server) Accept(ctx context.Context, request *pb.AcceptRequest) (response *emptypb.Empty, err error) { + req := AcceptRequestFromPB(request) + + err = s.service.Accept(ctx, req.invitationId, req.userId) + return +} + +// Create implements Invitations +func (s *Server) Create(ctx context.Context, request *pb.CreateRequest) (response *pb.CreateResponse, err error) { + req := CreateRequestFromPB(request) + created, err := s.service.Create(ctx, req.invitation) + response = CreateResponseToPB(created) + return +} + +// Delete implements Invitations +func (s *Server) Delete(ctx context.Context, request *pb.DeleteRequest) (response *emptypb.Empty, err error) { + req := DeleteRequestFromPB(request) + + err = s.service.Delete(ctx, req.invitationId) + return +} + +// Find implements Invitations +func (s *Server) Find(ctx context.Context, request *pb.FindRequest) (response *pb.FindResponse, err error) { + req := FindRequestFromPB(request) + invitations, total, err := s.service.Find(ctx, req.filter, req.opts) + response = FindResponseToPB(invitations, total) + return +} + +// Get implements Invitations +func (s *Server) Get(ctx context.Context, request *pb.GetRequest) (response *pb.GetResponse, err error) { + req := GetRequestFromPB(request) + invitation, err := s.service.Get(ctx, req.invitationId) + response = GetResponseToPB(invitation) + return +} -- GitLab