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