mirror of
https://github.com/3ybactuk/marketplace-go-service-project.git
synced 2025-10-30 05:53:45 +03:00
134 lines
3.5 KiB
Go
134 lines
3.5 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"route256/comments/internal/domain/entity"
|
|
"route256/comments/internal/domain/model"
|
|
|
|
pb "route256/pkg/api/comments/v1"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
"google.golang.org/protobuf/types/known/emptypb"
|
|
"google.golang.org/protobuf/types/known/timestamppb"
|
|
)
|
|
|
|
var _ pb.CommentsServer = (*Server)(nil)
|
|
|
|
type CommentsService interface {
|
|
CommentGetByID(ctx context.Context, id int64) (*entity.Comment, error)
|
|
CommentCreate(ctx context.Context, comment *entity.Comment) (int64, error)
|
|
CommentListBySKU(ctx context.Context, sku int64) ([]*entity.Comment, error)
|
|
CommentListByUser(ctx context.Context, userID int64) ([]*entity.Comment, error)
|
|
CommentEdit(ctx context.Context, comment *entity.Comment) error
|
|
}
|
|
|
|
type Server struct {
|
|
pb.UnimplementedCommentsServer
|
|
|
|
service CommentsService
|
|
}
|
|
|
|
func NewServer(commentsService CommentsService) *Server {
|
|
return &Server{
|
|
service: commentsService,
|
|
}
|
|
}
|
|
|
|
func (s *Server) CommentAdd(ctx context.Context, req *pb.CreateCommentRequest) (*pb.CreateCommentResponse, error) {
|
|
id, err := s.service.CommentCreate(ctx, &entity.Comment{
|
|
UserID: req.UserId,
|
|
SKU: req.Sku,
|
|
Text: req.Comment,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("service.InsertComment: %w", err)
|
|
}
|
|
|
|
return &pb.CreateCommentResponse{
|
|
Id: id,
|
|
}, nil
|
|
}
|
|
|
|
func (s *Server) CommentEdit(ctx context.Context, req *pb.EditCommentRequest) (*emptypb.Empty, error) {
|
|
err := s.service.CommentEdit(ctx, &entity.Comment{
|
|
ID: req.CommentId,
|
|
UserID: req.UserId,
|
|
Text: req.NewComment,
|
|
})
|
|
switch {
|
|
case errors.Is(err, model.ErrCommentEditUserMismatch):
|
|
return &emptypb.Empty{}, status.Error(codes.PermissionDenied, err.Error())
|
|
case errors.Is(err, model.ErrCommentEditTimeout):
|
|
return &emptypb.Empty{}, status.Error(codes.FailedPrecondition, err.Error())
|
|
case err != nil:
|
|
return &emptypb.Empty{}, status.Error(codes.Internal, err.Error())
|
|
}
|
|
|
|
return &emptypb.Empty{}, nil
|
|
}
|
|
|
|
func (s *Server) CommentGetByID(ctx context.Context, req *pb.GetCommentRequest) (*pb.GetCommentResponse, error) {
|
|
comm, err := s.service.CommentGetByID(ctx, req.Id)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("service.GetCommentByID: %w", err)
|
|
}
|
|
|
|
return &pb.GetCommentResponse{
|
|
Comment: &pb.Comment{
|
|
Id: comm.ID,
|
|
UserId: comm.UserID,
|
|
Sku: comm.SKU,
|
|
Text: comm.Text,
|
|
CreatedAt: timestamppb.New(comm.CreatedAt),
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (s *Server) CommentListBySKU(ctx context.Context, req *pb.ListBySkuRequest) (*pb.ListBySkuResponse, error) {
|
|
comms, err := s.service.CommentListBySKU(ctx, req.Sku)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("service.ListCommentsBySku: %w", err)
|
|
}
|
|
|
|
comments := make([]*pb.Comment, len(comms))
|
|
for i, comm := range comms {
|
|
comments[i] = &pb.Comment{
|
|
Id: comm.ID,
|
|
UserId: comm.UserID,
|
|
Sku: comm.SKU,
|
|
Text: comm.Text,
|
|
CreatedAt: timestamppb.New(comm.CreatedAt),
|
|
}
|
|
}
|
|
|
|
return &pb.ListBySkuResponse{
|
|
Comments: comments,
|
|
}, nil
|
|
}
|
|
|
|
func (s *Server) CommentListByUser(ctx context.Context, req *pb.ListByUserRequest) (*pb.ListByUserResponse, error) {
|
|
comms, err := s.service.CommentListByUser(ctx, req.UserId)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("service.ListCommentsByUser: %w", err)
|
|
}
|
|
|
|
comments := make([]*pb.Comment, len(comms))
|
|
for i, comm := range comms {
|
|
comments[i] = &pb.Comment{
|
|
Id: comm.ID,
|
|
UserId: comm.UserID,
|
|
Sku: comm.SKU,
|
|
Text: comm.Text,
|
|
CreatedAt: timestamppb.New(comm.CreatedAt),
|
|
}
|
|
}
|
|
|
|
return &pb.ListByUserResponse{
|
|
Comments: comments,
|
|
}, nil
|
|
}
|