Skip to content

Commit

Permalink
Merge pull request #15 from PickHD/feat/like-comments
Browse files Browse the repository at this point in the history
Feature Like & Comments, Improvement Code
  • Loading branch information
PickHD committed May 1, 2022
2 parents 8948130 + 70f09e6 commit b56fda3
Show file tree
Hide file tree
Showing 11 changed files with 1,089 additions and 27 deletions.
30 changes: 30 additions & 0 deletions application/dependency.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package application

import (
"sync"

"github.com/PickHD/pickablog/controller"
"github.com/PickHD/pickablog/repository"
"github.com/PickHD/pickablog/requester"
Expand Down Expand Up @@ -146,18 +148,46 @@ func setupUserDependency(app *App) *controller.UserController {

// setupBlogDependency is a function to set up dependencies to be used inside blog controller layer
func setupBlogDependency(app *App) *controller.BlogController {
//init mutex
mutex := &sync.RWMutex{}

blogRepo := &repository.BlogRepository{
Context: app.Context,
Config: app.Config,
Logger: app.Logger,
DB: app.DB,
}

commentRepo := &repository.CommentRepository{
Context: app.Context,
Config: app.Config,
Logger: app.Logger,
DB: app.DB,
}

likeRepo := &repository.LikeRepository{
Context: app.Context,
Config: app.Config,
Logger: app.Logger,
DB: app.DB,
}

userRepo := &repository.UserRepository{
Context: app.Context,
Config: app.Config,
Logger: app.Logger,
DB: app.DB,
}

blogSvc := &service.BlogService{
Context: app.Context,
Config: app.Config,
Logger: app.Logger,
BlogRepo: blogRepo,
CommentRepo: commentRepo,
LikeRepo: likeRepo,
UserRepo: userRepo,
Mutex: mutex,
}

blogCtrl := &controller.BlogController{
Expand Down
284 changes: 282 additions & 2 deletions controller/blog.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ type (
DetailBlog(ctx *fiber.Ctx) error
UpdateBlog(ctx *fiber.Ctx) error
DeleteBlog(ctx *fiber.Ctx) error

CreateComment(ctx *fiber.Ctx) error
UpdateComment(ctx *fiber.Ctx) error
ListComment(ctx *fiber.Ctx) error
DeleteComment(ctx *fiber.Ctx) error

Like(ctx *fiber.Ctx) error
UnLike(ctx *fiber.Ctx) error
}

// BlogController is an app blog struct that consists of all the dependencies needed for blog controller
Expand Down Expand Up @@ -163,6 +171,10 @@ func (bc *BlogController) UpdateBlog(ctx *fiber.Ctx) error {

err = bc.BlogSvc.UpdateBlogSvc(id,blogReq,extData.FullName)
if err != nil {
if errors.Is(err,model.ErrForbiddenUpdate) {
return helper.ResponseFormatter[any](ctx,fiber.StatusForbidden,err,err.Error(),nil,nil)
}

if errors.Is(err,model.ErrBlogNotFound) {
return helper.ResponseFormatter[any](ctx,fiber.StatusNotFound,err,err.Error(),nil,nil)
}
Expand All @@ -188,8 +200,18 @@ func (bc *BlogController) DeleteBlog(ctx *fiber.Ctx) error {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrBlogNotFound.Error(),nil,nil)
}

err = bc.BlogSvc.DeleteBlogSvc(id)
data := ctx.Locals(model.KeyJWTValidAccess)
extData,err := util.ExtractPayloadJWT(data)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

err = bc.BlogSvc.DeleteBlogSvc(id,extData.UserID)
if err != nil {
if errors.Is(err,model.ErrForbiddenDelete) {
return helper.ResponseFormatter[any](ctx,fiber.StatusForbidden,err,err.Error(),nil,nil)
}

if errors.Is(err,model.ErrBlogNotFound) {
return helper.ResponseFormatter[any](ctx,fiber.StatusNotFound,err,err.Error(),nil,nil)
}
Expand All @@ -198,4 +220,262 @@ func (bc *BlogController) DeleteBlog(ctx *fiber.Ctx) error {
}

return helper.ResponseFormatter[any](ctx,fiber.StatusOK,nil,"Success Delete Blog",nil,nil)
}
}

// CreateComment responsible to creating a comment from controller layer
func (bc *BlogController) CreateComment(ctx *fiber.Ctx) error {
var commentReq model.CommentRequest

id,err := ctx.ParamsInt("id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if id == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrBlogNotFound.Error(),nil,nil)
}

data := ctx.Locals(model.KeyJWTValidAccess)
extData,err := util.ExtractPayloadJWT(data)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

if err := ctx.BodyParser(&commentReq); err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

commentReq.UserID = extData.UserID

err = bc.BlogSvc.CreateCommentSvc(id,commentReq,extData.FullName)
if err != nil {

if errors.Is(err,model.ErrUserNotFound) || errors.Is(err,model.ErrBlogNotFound) {
return helper.ResponseFormatter[any](ctx,fiber.StatusNotFound,err,err.Error(),nil,nil)
}

if errors.Is(err,model.ErrInvalidRequest) {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusCreated,nil,"Success Create Comment",nil,nil)
}

// UpdateComment responsible to updating a comment by id from controller layer
func (bc *BlogController) UpdateComment(ctx *fiber.Ctx) error {
var commentReq model.CommentRequest

commentId,err := ctx.ParamsInt("comment_id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if commentId == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrCommentNotFound.Error(),nil,nil)
}

data := ctx.Locals(model.KeyJWTValidAccess)
extData,err := util.ExtractPayloadJWT(data)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

if err := ctx.BodyParser(&commentReq); err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

commentReq.UserID = extData.UserID

err = bc.BlogSvc.UpdateCommentSvc(commentId,commentReq,extData.FullName)
if err != nil {
if errors.Is(err,model.ErrForbiddenUpdate) {
return helper.ResponseFormatter[any](ctx,fiber.StatusForbidden,err,err.Error(),nil,nil)
}

if errors.Is(err,model.ErrUserNotFound) || errors.Is(err,model.ErrCommentNotFound) {
return helper.ResponseFormatter[any](ctx,fiber.StatusNotFound,err,err.Error(),nil,nil)
}

if errors.Is(err,model.ErrInvalidRequest) {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusOK,nil,"Success Update Comment",nil,nil)
}

// ListComment responsible to getting comments by blog id from controller layer
func (bc *BlogController) ListComment(ctx *fiber.Ctx) error {
var (
page = 1
size = 10
order = "ASC"
field = "id"
)

id,err := ctx.ParamsInt("id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if id == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrBlogNotFound.Error(),nil,nil)
}

if p := ctx.Query("page",""); p != "" {
pNum,err := strconv.Atoi(p)
if err == nil && pNum > 0 {
page = pNum
}
}

if s := ctx.Query("size",""); s != "" {
sNum, err := strconv.Atoi(s)
if err == nil && sNum > 0 {
size = sNum
}
}

if o := ctx.Query("order",""); o != "" {
if len(o) > 0 {
order = o
}
}

if f := ctx.Query("field",""); f != "" {
if len(f) > 0 {
field = f
}
}

data,meta,err := bc.BlogSvc.GetCommentsByBlogSvc(id,page,size,order,field)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusOK,nil,"Success Getting all Comments",data,meta)
}

// DeleteComment responsible to deleting a comment by id from controller layer
func (bc *BlogController) DeleteComment(ctx *fiber.Ctx) error {
blogID,err := ctx.ParamsInt("id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if blogID == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrBlogNotFound.Error(),nil,nil)
}

commentID,err := ctx.ParamsInt("comment_id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if commentID == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrCommentNotFound.Error(),nil,nil)
}

data := ctx.Locals(model.KeyJWTValidAccess)
extData,err := util.ExtractPayloadJWT(data)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

err = bc.BlogSvc.DeleteCommentSvc(blogID,commentID,extData.UserID)
if err != nil {
if errors.Is(err,model.ErrForbiddenDelete) {
return helper.ResponseFormatter[any](ctx,fiber.StatusForbidden,err,err.Error(),nil,nil)
}

if errors.Is(err,model.ErrBlogNotFound) || errors.Is(err,model.ErrCommentNotFound) {
return helper.ResponseFormatter[any](ctx,fiber.StatusNotFound,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusOK,nil,"Success Delete Comment",nil,nil)
}

// Like responsible to creating a like / liking a blog
func (bc *BlogController) Like(ctx *fiber.Ctx) error {
var likeReq model.LikeRequest

id,err := ctx.ParamsInt("id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if id == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrBlogNotFound.Error(),nil,nil)
}

data := ctx.Locals(model.KeyJWTValidAccess)
extData,err := util.ExtractPayloadJWT(data)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

likeReq.Like = 1
likeReq.UserID = extData.UserID

err = bc.BlogSvc.CreateLikeSvc(id,likeReq,extData.FullName)
if err != nil {

if errors.Is(err,model.ErrUserNotFound) || errors.Is(err,model.ErrBlogNotFound) {
return helper.ResponseFormatter[any](ctx,fiber.StatusNotFound,err,err.Error(),nil,nil)
}

if errors.Is(err,model.ErrInvalidRequest) || errors.Is(err,model.ErrAlreadyLikeBlog) {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusCreated,nil,"Success Like",nil,nil)
}

// UnLike responsible to deleting a like by id / unliking a blog
func (bc *BlogController) UnLike(ctx *fiber.Ctx) error {
blogID,err := ctx.ParamsInt("id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if blogID == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrBlogNotFound.Error(),nil,nil)
}

likeID,err := ctx.ParamsInt("like_id",0)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,err,err.Error(),nil,nil)
}

if likeID == 0 {
return helper.ResponseFormatter[any](ctx,fiber.StatusBadRequest,nil,model.ErrLikeNotFound.Error(),nil,nil)
}

data := ctx.Locals(model.KeyJWTValidAccess)
extData,err := util.ExtractPayloadJWT(data)
if err != nil {
return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

err = bc.BlogSvc.DeleteLikeSvc(blogID,likeID,extData.UserID)
if err != nil {
if errors.Is(err,model.ErrBlogNotFound) || errors.Is(err,model.ErrLikeNotFound) {
return helper.ResponseFormatter[any](ctx,fiber.StatusNotFound,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusInternalServerError,err,err.Error(),nil,nil)
}

return helper.ResponseFormatter[any](ctx,fiber.StatusOK,nil,"Success UnLike",nil,nil)
}
Loading

0 comments on commit b56fda3

Please sign in to comment.