sapawarga/userpost-service

View on GitHub
endpoint/endpoint.go

Summary

Maintainability
A
0 mins
Test Coverage
package endpoint

import (
    "context"
    "encoding/json"
    "math"

    "github.com/go-kit/kit/endpoint"
    "github.com/sapawarga/userpost-service/lib/constant"
    "github.com/sapawarga/userpost-service/lib/convert"
    "github.com/sapawarga/userpost-service/model"
    "github.com/sapawarga/userpost-service/usecase"
)

func MakeGetListUserPost(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*GetListUserPostRequest)
        // TODO: for get metadata from headers grpc needs to update when using authorization
        resp, err := usecase.GetListPost(ctx, &model.GetListRequest{
            ActivityName: req.ActivityName,
            Username:     req.Username,
            Category:     req.Category,
            Status:       req.Status,
            Page:         req.Page,
            Limit:        req.Limit,
            SortBy:       req.SortBy,
            OrderBy:      req.OrderBy,
            Search:       req.Search,
            DistrictID:   req.DistrictID,
        })
        if err != nil {
            return nil, err
        }

        totalPage := math.Ceil(float64(resp.Metadata.Total) / float64(*req.Limit))

        data := &UserPostWithMetadata{
            Data: resp.Data,
            Metadata: &Metadata{
                PerPage:     convert.GetInt64FromPointer(req.Limit),
                TotalPage:   totalPage,
                Total:       resp.Metadata.Total,
                CurrentPage: convert.GetInt64FromPointer(req.Page),
            },
        }
        return map[string]interface{}{
            "data": data,
        }, nil
    }
}

func MakeGetDetailUserPost(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*GetByID)
        // TODO: for get metadata from headers grpc needs to update when using authorization
        resp, err := usecase.GetDetailPost(ctx, req.ID)
        if err != nil {
            return nil, err
        }
        return map[string]interface{}{
            "data": resp}, nil
    }
}

func MakeGetListUserPostByMe(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*GetListUserPostRequest)
        // TODO: for get metadata from headers grpc needs to update when using authorization
        resp, err := usecase.GetListPostByMe(ctx, &model.GetListRequest{
            ActivityName: req.ActivityName,
            Username:     req.Username,
            Category:     req.Category,
            Status:       req.Status,
            Page:         req.Page,
            Limit:        req.Limit,
            SortBy:       req.SortBy,
            OrderBy:      req.OrderBy,
            Search:       req.Search,
            DistrictID:   req.DistrictID,
        })
        if err != nil {
            return nil, err
        }
        totalPage := math.Ceil(float64(resp.Metadata.Total) / float64(*req.Limit))

        data := &UserPostWithMetadata{
            Data: resp.Data,
            Metadata: &Metadata{
                PerPage:     convert.GetInt64FromPointer(req.Limit),
                TotalPage:   totalPage,
                Total:       resp.Metadata.Total,
                CurrentPage: convert.GetInt64FromPointer(req.Page),
            },
        }
        return map[string]interface{}{
            "data": data}, nil
    }
}

func MakeCreateNewPost(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*CreateNewPostRequest)
        if err := Validate(req); err != nil {
            return nil, err
        }

        imagePathURL := req.Images[0]
        imagesFormatted, err := json.Marshal(req.Images)
        if err != nil {
            return nil, err
        }

        bodyRequest := &model.CreateNewPostRequest{
            Title:        convert.GetStringFromPointer(req.Title),
            ImagePathURL: imagePathURL.Path,
            Images:       string(imagesFormatted),
            Tags:         req.Tags,
            Status:       convert.GetInt64FromPointer(req.Status),
        }

        if err = usecase.CreateNewPost(ctx, bodyRequest); err != nil {
            return nil, err
        }

        return &StatusResponse{
            Code:    constant.STATUS_CREATED,
            Message: "a_post_has_been_created",
        }, nil
    }
}

func MakeUpdateStatusOrTitle(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*CreateCommentRequest)
        if err := Validate(req); err != nil {
            return nil, err
        }

        if err = usecase.UpdateTitleOrStatus(ctx, &model.UpdatePostRequest{
            ID:     req.UserPostID,
            Status: req.Status,
            Title:  convert.SetPointerString(req.Text),
        }); err != nil {
            return nil, err
        }
        return &StatusResponse{
            Code:    constant.STATUS_UPDATED,
            Message: "post_has_been_updated",
        }, nil
    }
}

func MakeGetCommentsByID(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*GetByID)
        resp, err := usecase.GetCommentsByPostID(ctx, &model.GetCommentRequest{
            ID: req.ID,
        })
        if err != nil {
            return nil, err
        }

        data := &CommentsResponse{
            Data: resp.Data,
            Metadata: &Metadata{
                PerPage:     constant.DEFAULT_LIMIT,
                Total:       resp.Metadata.Total,
                TotalPage:   math.Ceil(float64(resp.Metadata.Total) / float64(20)),
                CurrentPage: resp.Metadata.Page,
            },
        }

        return map[string]interface{}{
            "data": data}, nil
    }
}

func MakeCreateComment(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*CreateCommentRequest)
        if err := Validate(req); err != nil {
            return nil, err
        }

        if err = usecase.CreateCommentOnPost(ctx, &model.CreateCommentRequest{
            UserPostID: req.UserPostID,
            Text:       req.Text,
            Status:     convert.GetInt64FromPointer(req.Status),
        }); err != nil {
            return nil, err
        }

        return &StatusResponse{
            Code:    constant.STATUS_CREATED,
            Message: "success_post_comment",
        }, nil
    }
}

func MakeLikeOrDislikePost(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        req := request.(*GetByID)
        // TODO: for get metadata from headers grpc needs to update when using authorization
        if err = usecase.LikeOrDislikePost(ctx, req.ID); err != nil {
            return nil, err
        }

        return &StatusResponse{
            Code:    constant.STATUS_UPDATED,
            Message: "success_like_or_dislike_a_post",
        }, nil
    }
}

func MakeCheckHealthy(ctx context.Context) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        return &StatusResponse{
            Code:    constant.STATUS_OK,
            Message: "service_is_ok",
        }, nil
    }
}

func MakeCheckReadiness(ctx context.Context, usecase usecase.UsecaseI) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        if err := usecase.CheckHealthReadiness(ctx); err != nil {
            return nil, err
        }
        return &StatusResponse{
            Code:    constant.STATUS_OK,
            Message: "service_is_ready",
        }, nil
    }
}