// Copyright 2023 Declan Teevan // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package rpc import ( "context" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" emptypb "google.golang.org/protobuf/types/known/emptypb" "github.com/hexolan/panels/post-service/internal" pb "github.com/hexolan/panels/post-service/internal/rpc/postv1" ) type postServer struct { pb.UnimplementedPostServiceServer service internal.PostService } func NewPostServer(service internal.PostService) postServer { return postServer{service: service} } func (svr *postServer) CreatePost(ctx context.Context, request *pb.CreatePostRequest) (*pb.Post, error) { // Ensure the required args are provided if request.GetData() == nil { return nil, status.Error(codes.InvalidArgument, "malformed request") } if request.GetPanelId() == "" { return nil, status.Error(codes.InvalidArgument, "panel id not provided") } if request.GetUserId() == "" { return nil, status.Error(codes.InvalidArgument, "user id not provided") } // Convert to service model data := pb.PostCreateFromProto(request.GetData()) // Pass to service method for creation post, err := svr.service.CreatePost(ctx, request.GetPanelId(), request.GetUserId(), data) if err != nil { return nil, err } return pb.PostToProto(post), nil } func (svr *postServer) GetPost(ctx context.Context, request *pb.GetPostRequest) (*pb.Post, error) { // Ensure the required args are provided if request.GetId() == "" { return nil, status.Error(codes.InvalidArgument, "post id not provided") } // Convert to business model id, err := internal.NewPostIdFromRepr(request.GetId()) if err != nil { return nil, status.Error(codes.InvalidArgument, "invalid post id") } // Pass to service method for retrieval post, err := svr.service.GetPost(ctx, *id) if err != nil { return nil, err } return pb.PostToProto(post), nil } func (svr *postServer) GetPanelPost(ctx context.Context, request *pb.GetPanelPostRequest) (*pb.Post, error) { // Ensure the required args are provided if request.GetId() == "" { return nil, status.Error(codes.InvalidArgument, "post id not provided") } if request.GetPanelId() == "" { return nil, status.Error(codes.InvalidArgument, "panel id not provided") } // Convert to service model id, err := internal.NewPostIdFromRepr(request.GetId()) if err != nil { return nil, status.Error(codes.InvalidArgument, "invalid post id") } // Pass to service method for retrieval post, err := svr.service.GetPanelPost(ctx, *id, request.GetPanelId()) if err != nil { return nil, err } return pb.PostToProto(post), nil } func (svr *postServer) UpdatePost(ctx context.Context, request *pb.UpdatePostRequest) (*pb.Post, error) { // Ensure the required args are provided if request.GetId() == "" { return nil, status.Error(codes.InvalidArgument, "post id not provided") } if request.GetData() == nil { return nil, status.Error(codes.InvalidArgument, "malformed request") } // Convert to service models id, err := internal.NewPostIdFromRepr(request.GetId()) if err != nil { return nil, status.Error(codes.InvalidArgument, "invalid post id") } data := pb.PostUpdateFromProto(request.GetData()) // Pass to service method for update post, err := svr.service.UpdatePost(ctx, *id, data) if err != nil { return nil, err } return pb.PostToProto(post), nil } func (svr *postServer) DeletePost(ctx context.Context, request *pb.DeletePostRequest) (*emptypb.Empty, error) { // Ensure the required args are provided if request.GetId() == "" { return nil, status.Error(codes.InvalidArgument, "post id not provided") } // Convert to service model id, err := internal.NewPostIdFromRepr(request.GetId()) if err != nil { return nil, status.Error(codes.InvalidArgument, "invalid post id") } // Pass to service method for deletion err = svr.service.DeletePost(ctx, *id) if err != nil { return nil, err } return &emptypb.Empty{}, nil } func (svr *postServer) GetFeedPosts(ctx context.Context, request *pb.GetFeedPostsRequest) (*pb.FeedPosts, error) { // Get the posts posts, err := svr.service.GetFeedPosts(ctx) if err != nil { return nil, err } return &pb.FeedPosts{Posts: pb.PostsToProto(posts)}, nil } func (svr *postServer) GetUserPosts(ctx context.Context, request *pb.GetUserPostsRequest) (*pb.UserPosts, error) { // Ensure the required args are provided if request.GetUserId() == "" { return nil, status.Error(codes.InvalidArgument, "user id not provided") } // Get the posts posts, err := svr.service.GetUserPosts(ctx, request.GetUserId()) if err != nil { return nil, err } return &pb.UserPosts{Posts: pb.PostsToProto(posts)}, nil } func (svr *postServer) GetPanelPosts(ctx context.Context, request *pb.GetPanelPostsRequest) (*pb.PanelPosts, error) { // Ensure the required args are provided if request.GetPanelId() == "" { return nil, status.Error(codes.InvalidArgument, "panel id not provided") } // Get the posts posts, err := svr.service.GetPanelPosts(ctx, request.GetPanelId()) if err != nil { return nil, err } return &pb.PanelPosts{Posts: pb.PostsToProto(posts)}, nil }