Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/refactor post handler #12

Merged
118 changes: 73 additions & 45 deletions internal/handler/post_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,24 @@ import (
"github.com/gin-gonic/gin"
)

//go:generate mockgen -source=$GOFILE -destination=post_handler_mock_test.go -package=${GOPACKAGE}_test -typed=true

type postService interface {
CreatePost(title, content string, userID uint) (*model.Post, *service.RestError)
GetAll(posts *[]model.Post) *service.RestError
GetByID(id int, post *model.Post) *service.RestError
Create(post *model.Post) *service.RestError
Save(post *model.Post) *service.RestError
Delete(post *model.Post) *service.RestError
}

type PostHandler struct {
PostService service.PostServiceI
postService postService
}

func NewPostHandler(postService service.PostServiceI) *PostHandler {
return &PostHandler{
PostService: postService,
func NewPostHandler(postService postService) PostHandler {
return PostHandler{
postService: postService,
}
}

Expand All @@ -34,21 +45,25 @@ func NewPostHandler(postService service.PostServiceI) *PostHandler {
// @Failure 401 {object} response.Error
// @Security ApiKeyAuth
// @Router /post/{id} [get]
func (handler PostHandler) GetPostByID(context *gin.Context) {
id, _ := strconv.Atoi(context.Param("id"))
func (h PostHandler) GetPostByID(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
response.ErrorResponse(c, http.StatusBadRequest, "Bad request")
return
}

post := model.Post{}
if err := handler.PostService.GetByID(id, &post); err != nil {
response.ErrorResponse(context, err.Status, "Server error")
var post model.Post
if err := h.postService.GetByID(id, &post); err != nil {
response.ErrorResponse(c, err.Status, "Server error")
return
}

if post.ID == 0 {
response.ErrorResponse(context, http.StatusNotFound, "Post not found")
response.ErrorResponse(c, http.StatusNotFound, "Post not found")
return
}

response.SuccessResponse(context, response.GetPostResponse{
response.SuccessResponse(c, response.GetPostResponse{
ID: post.ID,
Title: post.Title,
Content: post.Content,
Expand All @@ -67,24 +82,27 @@ func (handler PostHandler) GetPostByID(context *gin.Context) {
// @Failure 400 {string} string "Bad request"
// @Security ApiKeyAuth
// @Router /posts [post]
func (handler PostHandler) SavePost(context *gin.Context) {
func (h PostHandler) SavePost(c *gin.Context) {
var createPostRequest request.CreatePostRequest

if err := context.ShouldBindJSON(&createPostRequest); err != nil {
response.ErrorResponse(context, http.StatusBadRequest, "Required fields are empty")
if err := c.ShouldBindJSON(&createPostRequest); err != nil {
response.ErrorResponse(c, http.StatusBadRequest, "Required fields are empty")
return
}

claims := jwt.ExtractClaims(context)
id := claims["id"].(float64)
claims := jwt.ExtractClaims(c)
id, ok := claims["id"].(float64)
if !ok {
response.ErrorResponse(c, http.StatusBadRequest, "Bad request")
return
}

newPost, restError := handler.PostService.CreatePost(createPostRequest.Title, createPostRequest.Content, uint(id))
newPost, restError := h.postService.CreatePost(createPostRequest.Title, createPostRequest.Content, uint(id))
if restError != nil {
response.ErrorResponse(context, restError.Status, "Post can't be created")
response.ErrorResponse(c, restError.Status, "Post can't be created")
return
}

response.SuccessResponse(context, response.CreatePostResponse{
response.SuccessResponse(c, response.CreatePostResponse{
ID: newPost.ID,
Title: newPost.Title,
Content: newPost.Content,
Expand All @@ -105,35 +123,39 @@ func (handler PostHandler) SavePost(context *gin.Context) {
// @Failure 404 {object} response.Error
// @Security ApiKeyAuth
// @Router /post/{id} [put]
func (handler PostHandler) UpdatePost(context *gin.Context) {
func (h PostHandler) UpdatePost(c *gin.Context) {
var updatePostRequest request.UpdatePostRequest

if err := context.ShouldBindJSON(&updatePostRequest); err != nil {
response.ErrorResponse(context, http.StatusBadRequest, "Required fields are empty")
if err := c.ShouldBindJSON(&updatePostRequest); err != nil {
response.ErrorResponse(c, http.StatusBadRequest, "Required fields are empty")
return
}

id, _ := strconv.Atoi(context.Param("id"))
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
response.ErrorResponse(c, http.StatusBadRequest, "Bad request")
return
}

post := model.Post{}
if err := handler.PostService.GetByID(id, &post); err != nil {
response.ErrorResponse(context, err.Status, "Server error")
var post model.Post
if err := h.postService.GetByID(id, &post); err != nil {
response.ErrorResponse(c, err.Status, "Server error")
return
}

if post.ID == 0 {
response.ErrorResponse(context, http.StatusNotFound, "Post not found")
response.ErrorResponse(c, http.StatusNotFound, "Post not found")
return
}

post.Title = updatePostRequest.Title
post.Content = updatePostRequest.Content
if err := handler.PostService.Save(&post); err != nil {
response.ErrorResponse(context, err.Status, "Data was not saved")

if err := h.postService.Save(&post); err != nil {
response.ErrorResponse(c, err.Status, "Data was not saved")
return
}

response.SuccessResponse(context, response.GetPostResponse{
response.SuccessResponse(c, response.GetPostResponse{
ID: post.ID,
Title: post.Title,
Content: post.Content,
Expand All @@ -150,13 +172,14 @@ func (handler PostHandler) UpdatePost(context *gin.Context) {
// @Failure 401 {object} response.Error
// @Security ApiKeyAuth
// @Router /posts [get]
func (handler PostHandler) GetPosts(context *gin.Context) {
func (h PostHandler) GetPosts(c *gin.Context) {
var posts []model.Post
if err := handler.PostService.GetAll(&posts); err != nil {
response.ErrorResponse(context, http.StatusInternalServerError, "Server error")
if err := h.postService.GetAll(&posts); err != nil {
response.ErrorResponse(c, http.StatusInternalServerError, "Server error")
return
}
response.SuccessResponse(context, response.CreatePostsCollectionResponse(posts))

response.SuccessResponse(c, response.CreatePostsCollectionResponse(posts))
}

// DeletePost godoc
Expand All @@ -169,23 +192,28 @@ func (handler PostHandler) GetPosts(context *gin.Context) {
// @Failure 404 {object} response.Error
// @Security ApiKeyAuth
// @Router /post/{id} [delete]
func (handler PostHandler) DeletePost(context *gin.Context) {
post := model.Post{}
id, _ := strconv.Atoi(context.Param("id"))
if err := handler.PostService.GetByID(id, &post); err != nil {
response.ErrorResponse(context, err.Status, "Server error")
func (h PostHandler) DeletePost(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
response.ErrorResponse(c, http.StatusBadRequest, "Bad request")
return
}

var post model.Post
if err := h.postService.GetByID(id, &post); err != nil {
response.ErrorResponse(c, err.Status, "Server error")
return
}

if post.ID == 0 {
response.ErrorResponse(context, http.StatusNotFound, "Post not found")
response.ErrorResponse(c, http.StatusNotFound, "Post not found")
return
}

if err := handler.PostService.Delete(&post); err != nil {
response.ErrorResponse(context, err.Status, "Server error")
if err := h.postService.Delete(&post); err != nil {
response.ErrorResponse(c, err.Status, "Server error")
return
}

response.SuccessResponse(context, "Post delete successfully")
response.SuccessResponse(c, "Post delete successfully")
}
Loading
Loading