From d93a0d970705d9ac453e0a68abae40ff45ba3e70 Mon Sep 17 00:00:00 2001 From: Yonathan Setiadi Date: Tue, 25 May 2021 09:22:49 +0700 Subject: [PATCH 1/2] update config using os.env and update dockerfile command --- Dockerfile | 19 ++++--------------- config/config.go | 35 ++++++++++++++++++++++------------- docker-compose.yml | 4 ++-- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/Dockerfile b/Dockerfile index c3823f9..0bdab62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,28 +11,17 @@ WORKDIR /build COPY go.mod . COPY go.sum . -COPY .env.example ./.env -RUN go mod download +RUN go mod download -x COPY . . RUN CGO_ENABLED=0 go test -v ./... RUN make build -FROM alpine:3.11.3 as run-image +FROM gcr.io/distroless/base-debian10 LABEL maintainer="GoSapawarga " -ENV PROJECT_PATH=/build +COPY --from=compile-image /build / -WORKDIR /app - -RUN apk --update add tzdata ca-certificates && \ - update-ca-certificates 2>/dev/null || true - -COPY --from=compile-image ${PROJECT_PATH}/userpost-service /app/userpost-service -COPY --from=compile-image ${PROJECT_PATH}/.env /app/.env - -EXPOSE 3002 3003 - -ENTRYPOINT [ "/app/userpost-service" ] +ENTRYPOINT [ "/userpost-service" ] diff --git a/config/config.go b/config/config.go index b56cd2b..b9feedc 100644 --- a/config/config.go +++ b/config/config.go @@ -2,6 +2,8 @@ package config import ( "fmt" + "os" + "strconv" _ "github.com/go-sql-driver/mysql" "github.com/spf13/viper" @@ -22,26 +24,33 @@ func init() { //NewConfig ... func NewConfig() (defConfig *Config, err error) { defConfig = &Config{} - appEnv := viper.GetString(`APP_ENV`) - appGrpcPort := viper.GetInt(`APP_GRPC_PORT`) - appHttpPort := viper.GetInt(`APP_HTTP_PORT`) - debug := viper.GetBool(`APP_DEBUG`) + appEnv := os.Getenv(`APP_ENV`) + appGRPCPort, _ := strconv.Atoi(os.Getenv(`APP_GRPC_PORT`)) + // appGRPCPort := 9005 + appHTTPPort, _ := strconv.Atoi(os.Getenv(`APP_HTTP_PORT`)) + // appHTTPPort := 9006 + debugString := os.Getenv(`APP_DEBUG`) + debug := false - dbHost := viper.GetString(`DB_HOST`) - dbPort := viper.GetInt(`DB_PORT`) - dbUser := viper.GetString(`DB_USER`) - dbPassword := viper.GetString(`DB_PASS`) - dbName := viper.GetString(`DB_NAME`) - driverName := viper.GetString(`DB_DRIVER_NAME`) + if debugString == "true" { + debug = true + } + + dbHost := os.Getenv(`DB_HOST`) + dbPort, _ := strconv.Atoi(os.Getenv(`DB_PORT`)) + dbUser := os.Getenv(`DB_USER`) + dbPassword := os.Getenv(`DB_PASS`) + dbName := os.Getenv(`DB_NAME`) + driverName := os.Getenv(`DB_DRIVER_NAME`) - if appEnv == "" || appGrpcPort == 0 || appHttpPort == 0 { + if appEnv == "" || appGRPCPort == 0 || appHTTPPort == 0 { err = fmt.Errorf("[CONFIG][Critical] Please check section APP on %s", envFileName) return defConfig, err } defConfig.AppEnv = appEnv - defConfig.AppGRPCPort = appGrpcPort - defConfig.AppHTTPPort = appHttpPort + defConfig.AppGRPCPort = appGRPCPort + defConfig.AppHTTPPort = appHTTPPort defConfig.Debug = debug if dbHost == "" || dbPort == 0 || dbUser == "" || dbName == "" || driverName == "" { diff --git a/docker-compose.yml b/docker-compose.yml index b900e82..79b05ac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,8 +11,8 @@ services: env_file: - .env ports: - - 3002:3002 - - 3003:3003 + - 9005:9005 + - 9006:9006 # database: # image: registry.gitlab.com/jdsteam/sapa-warga/sapawarga-app/sapawarga-backend-database:dev From d1f2bfb4483bb6dcbb711a3bd6347882e7e5a7f7 Mon Sep 17 00:00:00 2001 From: Yonathan Setiadi Date: Tue, 25 May 2021 11:34:29 +0700 Subject: [PATCH 2/2] update usecase for now not use authorization and update query on repository --- config/config.go | 8 ++++---- endpoint/endpoint.go | 27 ------------------------ mocks/testcases/create-new-post.go | 2 +- mocks/testcases/likeordislike.go | 2 +- model/repository_response.go | 2 +- repository/mysql/userpost.go | 33 ++++++++++++++---------------- usecase/usecase.go | 24 +++++++++++++--------- 7 files changed, 36 insertions(+), 62 deletions(-) diff --git a/config/config.go b/config/config.go index b9feedc..80338b2 100644 --- a/config/config.go +++ b/config/config.go @@ -25,10 +25,10 @@ func init() { func NewConfig() (defConfig *Config, err error) { defConfig = &Config{} appEnv := os.Getenv(`APP_ENV`) - appGRPCPort, _ := strconv.Atoi(os.Getenv(`APP_GRPC_PORT`)) - // appGRPCPort := 9005 - appHTTPPort, _ := strconv.Atoi(os.Getenv(`APP_HTTP_PORT`)) - // appHTTPPort := 9006 + // appGRPCPort, _ := strconv.Atoi(os.Getenv(`APP_GRPC_PORT`)) + appGRPCPort := 9005 + // appHTTPPort, _ := strconv.Atoi(os.Getenv(`APP_HTTP_PORT`)) + appHTTPPort := 9006 debugString := os.Getenv(`APP_DEBUG`) debug := false diff --git a/endpoint/endpoint.go b/endpoint/endpoint.go index 4a63f52..8b87e7a 100644 --- a/endpoint/endpoint.go +++ b/endpoint/endpoint.go @@ -3,26 +3,17 @@ package endpoint import ( "context" "encoding/json" - "errors" "github.com/go-kit/kit/endpoint" "github.com/sapawarga/userpost-service/helper" "github.com/sapawarga/userpost-service/model" "github.com/sapawarga/userpost-service/usecase" - "google.golang.org/grpc/metadata" ) 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 - headers, ok := metadata.FromIncomingContext(ctx) - if !ok { - return nil, errors.New("invalid_metadata") - } - actor := headers["Actor"] - ctx = context.WithValue(ctx, helper.ACTORKEY, actor) - resp, err := usecase.GetListPost(ctx, &model.GetListRequest{ ActivityName: req.ActivityName, Username: req.Username, @@ -52,12 +43,6 @@ func MakeGetDetailUserPost(ctx context.Context, usecase usecase.UsecaseI) endpoi 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 - headers, ok := metadata.FromIncomingContext(ctx) - if !ok { - return nil, errors.New("invalid_metadata") - } - actor := headers["Actor"] - ctx = context.WithValue(ctx, helper.ACTORKEY, actor) resp, err := usecase.GetDetailPost(ctx, req.ID) if err != nil { return nil, err @@ -70,12 +55,6 @@ func MakeGetListUserPostByMe(ctx context.Context, usecase usecase.UsecaseI) endp 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 - headers, ok := metadata.FromIncomingContext(ctx) - if !ok { - return nil, errors.New("invalid_metadata") - } - actor := headers["Actor"] - ctx = context.WithValue(ctx, helper.ACTORKEY, actor) response, err = usecase.GetListPostByMe(ctx, &model.GetListRequest{ ActivityName: req.ActivityName, Username: req.Username, @@ -185,12 +164,6 @@ func MakeLikeOrDislikePost(ctx context.Context, usecase usecase.UsecaseI) endpoi 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 - headers, ok := metadata.FromIncomingContext(ctx) - if !ok { - return nil, errors.New("invalid_metadata") - } - actor := headers["Actor"] - ctx = context.WithValue(ctx, helper.ACTORKEY, actor) if err = usecase.LikeOrDislikePost(ctx, req.ID); err != nil { return nil, err } diff --git a/mocks/testcases/create-new-post.go b/mocks/testcases/create-new-post.go index b3887d7..dae92f2 100644 --- a/mocks/testcases/create-new-post.go +++ b/mocks/testcases/create-new-post.go @@ -23,7 +23,7 @@ var newRepositoryRequest = &model.CreateNewPostRequestRepository{ Images: "[{\"path\":\"http://localhost\"}]", Tags: tags, Status: helper.ACTIVED, - ActorID: 1, + // ActorID: 1, } type CreateNewUserPost struct { diff --git a/mocks/testcases/likeordislike.go b/mocks/testcases/likeordislike.go index 225bb88..26a1db0 100644 --- a/mocks/testcases/likeordislike.go +++ b/mocks/testcases/likeordislike.go @@ -8,7 +8,7 @@ import ( var requestLikeOnPost = &model.AddOrRemoveLikeOnPostRequest{ UserPostID: 1, - ActorID: 1, + // ActorID: 1, TypeEntity: "user_post", } diff --git a/model/repository_response.go b/model/repository_response.go index a299fce..bd3a9c7 100644 --- a/model/repository_response.go +++ b/model/repository_response.go @@ -13,7 +13,7 @@ type PostResponse struct { Images sql.NullString `db:"images"` LastUserPostCommentID sql.NullInt64 `db:"last_user_post_comment_id"` LikesCount int64 `db:"likes_count"` - CommentCounts int64 `db:"comment_counts"` + CommentCounts int64 `db:"comments_count"` Status int64 `db:"status"` CreatedBy sql.NullInt64 `db:"created_by"` UpdatedBy sql.NullInt64 `db:"updated_by"` diff --git a/repository/mysql/userpost.go b/repository/mysql/userpost.go index 302d101..484bfe7 100644 --- a/repository/mysql/userpost.go +++ b/repository/mysql/userpost.go @@ -26,7 +26,7 @@ func (r *UserPost) GetListPost(ctx context.Context, request *model.UserPostReque var result = make([]*model.PostResponse, 0) var err error - query.WriteString("SELECT id, text, tags. image_path, images, last_user_post_comment_id, likes_count, comment_counts, status, created_by, updated_by, create_at, updated_at FROM userposts") + query.WriteString("SELECT id, text, tags, image_path, images, last_user_post_comment_id, likes_count, comments_count, status, created_by, updated_by, FROM_UNIXTIME(created_at) as created_at, FROM_UNIXTIME(updated_at) as updated_at FROM user_posts") query, params := querySelectParams(ctx, query, request) if request.Limit != nil && request.Offset != nil { query.WriteString("LIMIT ?, ?") @@ -37,9 +37,9 @@ func (r *UserPost) GetListPost(ctx context.Context, request *model.UserPostReque params = append(params, request.OrderBy, request.SortBy) } if ctx != nil { - err = r.conn.SelectContext(ctx, result, query.String(), params...) + err = r.conn.SelectContext(ctx, &result, query.String(), params...) } else { - err = r.conn.Select(result, query.String(), params...) + err = r.conn.Select(&result, query.String(), params...) } if err != nil { @@ -54,9 +54,9 @@ func (r *UserPost) GetMetadataPost(ctx context.Context, request *model.UserPostR var total *int64 var err error - query.WriteString("SELECT COUNT(1) FROM userposts") + query.WriteString("SELECT COUNT(1) FROM user_posts") query, params := querySelectParams(ctx, query, request) - query.WriteString("FROM userposts") + query.WriteString("FROM user_posts") if ctx != nil { err = r.conn.GetContext(ctx, total, query.String(), params...) } else { @@ -75,7 +75,7 @@ func (r *UserPost) GetListPostByMe(ctx context.Context, request *model.UserPostB var result = make([]*model.PostResponse, 0) var err error - query.WriteString("SELECT id, text, tags. image_path, images, last_user_post_comment_id, likes_count, comment_counts, status, created_by, updated_by, create_at, updated_at FROM userposts") + query.WriteString("SELECT id, text, tags. image_path, images, last_user_post_comment_id, likes_count, comments_count, status, created_by, updated_by, FROM_UNIXTIME(created_at) as created_at, FROM_UNIXTIME(updated_at) as updated_at FROM user_posts") query, params := querySelectParams(ctx, query, request.UserPostRequest) query.WriteString("AND created_by = ? ") params = append(params, request.ActorID) @@ -89,9 +89,9 @@ func (r *UserPost) GetListPostByMe(ctx context.Context, request *model.UserPostB } if ctx != nil { - err = r.conn.SelectContext(ctx, result, query.String(), params...) + err = r.conn.SelectContext(ctx, &result, query.String(), params...) } else { - err = r.conn.Select(result, query.String(), params...) + err = r.conn.Select(&result, query.String(), params...) } if err != nil { @@ -106,10 +106,10 @@ func (r *UserPost) GetMetadataPostByMe(ctx context.Context, request *model.UserP var total *int64 var err error - query.WriteString("SELECT COUNT(1) FROM userposts") + query.WriteString("SELECT COUNT(1) FROM user_posts") query, params := querySelectParams(ctx, query, request.UserPostRequest) query.WriteString("AND created_by = ? ") - query.WriteString("FROM userposts") + query.WriteString("FROM user_posts") params = append(params, request.ActorID) if ctx != nil { @@ -158,7 +158,7 @@ func (r *UserPost) GetDetailPost(ctx context.Context, id int64) (*model.PostResp var result *model.PostResponse var err error - query.WriteString("SELECT id, text, tags. image_path, images, last_user_post_comment_id, likes_count, comment_counts, status, created_by, updated_by, create_at, updated_at FROM userposts") + query.WriteString("SELECT id, text, tags, image_path, images, last_user_post_comment_id, likes_count, comments_count, status, created_by, updated_by, FROM_UNIXTIME(created_at) as created_at, FROM_UNIXTIME(updated_at) as updated_at FROM user_posts") query.WriteString("WHERE id = ?") if ctx != nil { err = r.conn.GetContext(ctx, result, query.String(), id) @@ -204,13 +204,12 @@ func (r *UserPost) CheckIsExistLikeOnPostBy(ctx context.Context, request *model. func (r *UserPost) InsertPost(ctx context.Context, request *model.CreateNewPostRequestRepository) error { var query bytes.Buffer - var params = make(map[string]interface{}) var err error _, unixTime := helper.GetCurrentTimeUTC() - query.WriteString("INSERT INTO userposts (`text`, tags, image_path, images, status, created_by, updated_by, created_at, updated_at)") + query.WriteString("INSERT INTO user_posts (`text`, tags, image_path, images, status, created_by, updated_by, created_at, updated_at)") query.WriteString("VALUES (:title, :tags, :image_path, :images, :status, :actor, :actor, :created_at, :created_at)") - params = map[string]interface{}{ + params := map[string]interface{}{ "title": request.Title, "tags": request.Tags, "image_path": request.ImagePathURL, @@ -234,13 +233,12 @@ func (r *UserPost) InsertPost(ctx context.Context, request *model.CreateNewPostR func (r *UserPost) AddLikeOnPost(ctx context.Context, request *model.AddOrRemoveLikeOnPostRequest) error { var query bytes.Buffer - var params = make(map[string]interface{}) var err error _, unixTime := helper.GetCurrentTimeUTC() query.WriteString("INSERT INTO likes (`type`, user_id, entity_id, created_at, updated_at) ") query.WriteString("VALUES(:type_entity, :user_id, :entity_id, :current, :current)") - params = map[string]interface{}{ + params := map[string]interface{}{ "type_entity": request.TypeEntity, "user_id": request.ActorID, "entity_id": request.UserPostID, @@ -267,7 +265,7 @@ func (r *UserPost) UpdateStatusOrTitle(ctx context.Context, request *model.Updat var err error _, unixTime := helper.GetCurrentTimeUTC() - query.WriteString("UPDATE userposts") + query.WriteString("UPDATE user_posts") if request.Status != nil { query.WriteString("status` = :status") params["status"] = request.Status @@ -343,7 +341,6 @@ func querySelectParams(ctx context.Context, query bytes.Buffer, params *model.Us query.WriteString(qBuffer.String()) query.WriteString(" status = ?") queryParams = append(queryParams, params.Status) - first = false } return query, queryParams diff --git a/usecase/usecase.go b/usecase/usecase.go index 0547d6e..5860438 100644 --- a/usecase/usecase.go +++ b/usecase/usecase.go @@ -82,7 +82,7 @@ func (p *Post) GetListPostByMe(ctx context.Context, params *model.GetListRequest } req := &model.UserPostByMeRequest{ - ActorID: ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Get("id").(int64), + // ActorID: ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Get("id").(int64), UserPostRequest: &model.UserPostRequest{ ActivityName: params.ActivityName, Username: params.Username, @@ -121,8 +121,9 @@ func (p *Post) GetListPostByMe(ctx context.Context, params *model.GetListRequest } func (p *Post) GetDetailPost(ctx context.Context, id int64) (*model.UserPostResponse, error) { + // TODO: add actor logger := kitlog.With(p.logger, "method", "GetDetailPost") - actor := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Data + // actor := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Data resp, err := p.repoPost.GetDetailPost(ctx, id) if err != nil { level.Error(logger).Log("error_get_detail", err) @@ -137,7 +138,7 @@ func (p *Post) GetDetailPost(ctx context.Context, id int64) (*model.UserPostResp isLiked, err := p.repoPost.CheckIsExistLikeOnPostBy(ctx, &model.AddOrRemoveLikeOnPostRequest{ UserPostID: id, - ActorID: actor["id"].(int64), + // ActorID: actor["id"].(int64), TypeEntity: helper.TYPE_USERPOST, }) if err != nil { @@ -153,16 +154,16 @@ func (p *Post) GetDetailPost(ctx context.Context, id int64) (*model.UserPostResp } func (p *Post) CreateNewPost(ctx context.Context, requestBody *model.CreateNewPostRequest) error { - // TODO: add checker tags + // TODO: add checker tags, Add Actor logger := kitlog.With(p.logger, "method", "CreateNewPost") - actor := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Data + // actor := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Data if err := p.repoPost.InsertPost(ctx, &model.CreateNewPostRequestRepository{ Title: requestBody.Title, ImagePathURL: requestBody.ImagePathURL, Images: requestBody.Images, Tags: requestBody.Tags, Status: requestBody.Status, - ActorID: actor["id"].(int64), + // ActorID: actor["id"].(int64), }); err != nil { level.Error(logger).Log("error_create_post", err) return err @@ -237,13 +238,14 @@ func (p *Post) CreateCommentOnPost(ctx context.Context, req *model.CreateComment } func (p *Post) LikeOrDislikePost(ctx context.Context, id int64) error { + // TODO: context actor logger := kitlog.With(p.logger, "method", "LikeOrDislikePost") - actorID := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Get("id").(int64) + // actorID := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Get("id").(int64) var err error request := &model.AddOrRemoveLikeOnPostRequest{ UserPostID: id, - ActorID: actorID, + // ActorID: actorID, TypeEntity: helper.TYPE_USERPOST, } isExist, err := p.repoPost.CheckIsExistLikeOnPostBy(ctx, request) @@ -331,7 +333,9 @@ func (p *Post) getDetailComment(ctx context.Context, comment *model.CommentRespo } func (p *Post) appendListUserPost(ctx context.Context, resp []*model.PostResponse) (userPosts []*model.UserPostResponse, err error) { - actorID := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Get("id").(int64) + // TODO: using actor TODO + + // actorID := ctx.Value(helper.ACTORKEY).(*model.ActorFromContext).Get("id").(int64) for _, v := range resp { userPost, err := p.getDetailOfUserPost(ctx, v) if err != nil { @@ -339,7 +343,7 @@ func (p *Post) appendListUserPost(ctx context.Context, resp []*model.PostRespons } isLiked, err := p.repoPost.CheckIsExistLikeOnPostBy(ctx, &model.AddOrRemoveLikeOnPostRequest{ UserPostID: v.ID, - ActorID: actorID, + // ActorID: actorID, TypeEntity: helper.TYPE_USERPOST, }) if err != nil {