Skip to content

Commit b71d526

Browse files
committed
update controller to provide more specific HTTP response codes
1 parent a37f9ba commit b71d526

File tree

7 files changed

+107
-135
lines changed

7 files changed

+107
-135
lines changed

http/controllers/base_response.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ type BaseResponse struct {
1212
Data interface{} `json:"data,omitempty"`
1313
}
1414

15-
func NewSuccessResponse(c *gin.Context, message string, data interface{}) {
16-
c.JSON(http.StatusOK, BaseResponse{
15+
func NewSuccessResponse(c *gin.Context, statusCode int, message string, data interface{}) {
16+
c.JSON(statusCode, BaseResponse{
1717
Status: true,
1818
Message: message,
1919
Data: data,
2020
})
2121
}
2222

23-
func NewErrorResponse(c *gin.Context, code int, err string) {
24-
c.JSON(code, BaseResponse{
23+
func NewErrorResponse(c *gin.Context, statusCode int, err string) {
24+
c.JSON(statusCode, BaseResponse{
2525
Status: false,
2626
Message: err,
2727
})

http/controllers/books/http.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,70 +34,70 @@ func (c *BookController) Store(ctx *gin.Context) {
3434
}
3535

3636
ctxx := ctx.Request.Context()
37-
b, err := c.bookUsecase.Store(ctxx, bookRequest.ToDomain())
37+
b, statusCode, err := c.bookUsecase.Store(ctxx, bookRequest.ToDomain())
3838
if err != nil {
39-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
39+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
4040
return
4141
}
4242

4343
go c.ristrettoCache.Del("books")
4444

45-
controllers.NewSuccessResponse(ctx, "book inserted successfully", map[string]interface{}{
45+
controllers.NewSuccessResponse(ctx, statusCode, "book inserted successfully", map[string]interface{}{
4646
"book": responses.FromDomain(b),
4747
})
4848
}
4949

5050
func (c *BookController) GetAll(ctx *gin.Context) {
5151
if val := c.ristrettoCache.Get("books"); val != nil {
52-
controllers.NewSuccessResponse(ctx, "book data fetched successfully", map[string]interface{}{
52+
controllers.NewSuccessResponse(ctx, http.StatusOK, "book data fetched successfully", map[string]interface{}{
5353
"books": val,
5454
})
5555
return
5656
}
5757

5858
ctxx := ctx.Request.Context()
59-
listOfBooks, err := c.bookUsecase.GetAll(ctxx)
59+
listOfBooks, statusCode, err := c.bookUsecase.GetAll(ctxx)
6060
if err != nil {
61-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
61+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
6262
return
6363
}
6464

6565
bookResponses := responses.ToResponseList(listOfBooks)
6666

6767
if bookResponses == nil {
68-
controllers.NewSuccessResponse(ctx, "book data is empty", []int{})
68+
controllers.NewSuccessResponse(ctx, statusCode, "book data is empty", []int{})
6969
return
7070
}
7171

7272
go c.ristrettoCache.Set("books", bookResponses)
7373

74-
controllers.NewSuccessResponse(ctx, "book data fetched successfully", map[string]interface{}{
74+
controllers.NewSuccessResponse(ctx, statusCode, "book data fetched successfully", map[string]interface{}{
7575
"books": bookResponses,
7676
})
7777
}
7878

7979
func (c *BookController) GetById(ctx *gin.Context) {
8080
id, _ := strconv.Atoi(ctx.Param("id"))
8181
if val := c.ristrettoCache.Get(fmt.Sprintf("book/%d", id)); val != nil {
82-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("book data with id %d fetched successfully", id), map[string]interface{}{
82+
controllers.NewSuccessResponse(ctx, http.StatusOK, fmt.Sprintf("book data with id %d fetched successfully", id), map[string]interface{}{
8383
"book": val,
8484
})
8585
return
8686
}
8787

8888
ctxx := ctx.Request.Context()
8989

90-
bookDomain, err := c.bookUsecase.GetById(ctxx, id)
90+
bookDomain, statusCode, err := c.bookUsecase.GetById(ctxx, id)
9191
if err != nil {
92-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
92+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
9393
return
9494
}
9595

9696
bookResponse := responses.FromDomain(bookDomain)
9797

9898
go c.ristrettoCache.Set(fmt.Sprintf("book/%d", id), bookResponse)
9999

100-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("book data with id %d fetched successfully", id), map[string]interface{}{
100+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("book data with id %d fetched successfully", id), map[string]interface{}{
101101
"book": bookResponse,
102102
})
103103
}
@@ -113,15 +113,15 @@ func (c *BookController) Update(ctx *gin.Context) {
113113

114114
ctxx := ctx.Request.Context()
115115
bookDomain := bookUpdateRequest.ToDomain()
116-
newBook, err := c.bookUsecase.Update(ctxx, bookDomain, id)
116+
newBook, statusCode, err := c.bookUsecase.Update(ctxx, bookDomain, id)
117117
if err != nil {
118-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
118+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
119119
return
120120
}
121121

122122
go c.ristrettoCache.Del("books", fmt.Sprintf("book/%d", id))
123123

124-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("book data with id %d updated successfully", id), map[string]interface{}{
124+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("book data with id %d updated successfully", id), map[string]interface{}{
125125
"book": responses.FromDomain(newBook),
126126
})
127127
}
@@ -130,12 +130,13 @@ func (c *BookController) Delete(ctx *gin.Context) {
130130
id, _ := strconv.Atoi(ctx.Param("id"))
131131

132132
ctxx := ctx.Request.Context()
133-
if err := c.bookUsecase.Delete(ctxx, id); err != nil {
134-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
133+
statusCode, err := c.bookUsecase.Delete(ctxx, id)
134+
if err != nil {
135+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
135136
return
136137
}
137138

138139
go c.ristrettoCache.Del("books", fmt.Sprintf("book/%d", id))
139140

140-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("book data with id %d deleted successfully", id), nil)
141+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("book data with id %d deleted successfully", id), nil)
141142
}

http/controllers/books/http_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func TestStore(t *testing.T) {
120120

121121
// Assertions
122122
// Assert status code
123-
assert.Equal(t, http.StatusOK, w.Result().StatusCode)
123+
assert.Equal(t, http.StatusCreated, w.Result().StatusCode)
124124
assert.Contains(t, w.Result().Header.Get("Content-Type"), "application/json")
125125
assert.Contains(t, body, "book inserted successfully")
126126
})
@@ -283,7 +283,7 @@ func TestGetById(t *testing.T) {
283283

284284
// Assertions
285285
// Assert status code
286-
assert.Equal(t, http.StatusInternalServerError, w.Result().StatusCode)
286+
assert.Equal(t, http.StatusNotFound, w.Result().StatusCode)
287287
assert.Contains(t, w.Result().Header.Get("Content-Type"), "application/json")
288288
})
289289
}
@@ -414,7 +414,7 @@ func TestDelete(t *testing.T) {
414414

415415
// Assertions
416416
// Assert status code
417-
assert.Equal(t, http.StatusInternalServerError, w.Result().StatusCode)
417+
assert.Equal(t, http.StatusNotFound, w.Result().StatusCode)
418418
assert.Contains(t, w.Result().Header.Get("Content-Type"), "application/json")
419419
})
420420
}

http/controllers/reviews/http.go

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,76 +44,76 @@ func (c *ReviewController) Store(ctx *gin.Context) {
4444
ctxx := ctx.Request.Context()
4545
reviewDom := reviewRequest.ToDomain()
4646

47-
userReview, _ := c.reviewUsecase.GetUserReview(ctxx, reviewDom.BookId, userClaims.UserID)
47+
userReview, _, _ := c.reviewUsecase.GetUserReview(ctxx, reviewDom.BookId, userClaims.UserID)
4848
if userReview.ID != 0 {
49-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, "user already make a review")
49+
controllers.NewErrorResponse(ctx, http.StatusBadRequest, "user already make a review")
5050
return
5151
}
52-
review, err := c.reviewUsecase.Store(ctxx, reviewDom, userClaims.UserID)
52+
review, statusCode, err := c.reviewUsecase.Store(ctxx, reviewDom, userClaims.UserID)
5353
if err != nil {
54-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
54+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
5555
return
5656
}
5757

5858
go c.ristrettoCache.Del("reviews", "users", fmt.Sprintf("user/%d", userClaims.UserID), "books", fmt.Sprintf("book/%d", reviewRequest.BookId))
5959

60-
controllers.NewSuccessResponse(ctx, "review created successfully", gin.H{
60+
controllers.NewSuccessResponse(ctx, statusCode, "review created successfully", gin.H{
6161
"reviews": responses.FromDomain(review),
6262
})
6363
}
6464

6565
func (c *ReviewController) GetAll(ctx *gin.Context) {
6666
if val := c.ristrettoCache.Get("reviews"); val != nil {
67-
controllers.NewSuccessResponse(ctx, "review data fetched successfully", map[string]interface{}{
67+
controllers.NewSuccessResponse(ctx, http.StatusOK, "review data fetched successfully", map[string]interface{}{
6868
"reviews": val,
6969
})
7070
return
7171
}
7272

7373
ctxx := ctx.Request.Context()
7474

75-
listOfReviews, err := c.reviewUsecase.GetAll(ctxx)
75+
listOfReviews, statusCode, err := c.reviewUsecase.GetAll(ctxx)
7676
if err != nil {
77-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
77+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
7878
return
7979
}
8080

8181
reviews := responses.ToResponseList(listOfReviews)
8282

8383
if reviews == nil {
84-
controllers.NewSuccessResponse(ctx, "review data is empty", []int{})
84+
controllers.NewSuccessResponse(ctx, statusCode, "review data is empty", []int{})
8585
return
8686
}
8787

8888
go c.ristrettoCache.Set("reviews", reviews)
8989

90-
controllers.NewSuccessResponse(ctx, "review data fetched successfully", map[string]interface{}{
90+
controllers.NewSuccessResponse(ctx, statusCode, "review data fetched successfully", map[string]interface{}{
9191
"reviews": reviews,
9292
})
9393
}
9494

9595
func (c *ReviewController) GetById(ctx *gin.Context) {
9696
id, _ := strconv.Atoi(ctx.Param("id"))
9797
if val := c.ristrettoCache.Get(fmt.Sprintf("review/%d", id)); val != nil {
98-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("review data with id %d fetched successfully", id), map[string]interface{}{
98+
controllers.NewSuccessResponse(ctx, http.StatusOK, fmt.Sprintf("review data with id %d fetched successfully", id), map[string]interface{}{
9999
"review": val,
100100
})
101101
return
102102
}
103103

104104
ctxx := ctx.Request.Context()
105105

106-
bookDomain, err := c.reviewUsecase.GetById(ctxx, id)
106+
bookDomain, statusCode, err := c.reviewUsecase.GetById(ctxx, id)
107107
if err != nil {
108-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
108+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
109109
return
110110
}
111111

112112
bookResponse := responses.FromDomain(bookDomain)
113113

114114
go c.ristrettoCache.Set(fmt.Sprintf("review/%d", id), bookResponse)
115115

116-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("review data with id %d fetched successfully", id), map[string]interface{}{
116+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("review data with id %d fetched successfully", id), map[string]interface{}{
117117
"review": bookResponse,
118118
})
119119
}
@@ -122,20 +122,20 @@ func (c *ReviewController) GetByBookId(ctx *gin.Context) {
122122
bookId, _ := strconv.Atoi(ctx.Param("id"))
123123
ctxx := ctx.Request.Context()
124124

125-
reviewsDomain, err := c.reviewUsecase.GetByBookId(ctxx, bookId)
125+
reviewsDomain, statusCode, err := c.reviewUsecase.GetByBookId(ctxx, bookId)
126126
if err != nil {
127-
controllers.NewErrorResponse(ctx, http.StatusNotFound, err.Error())
127+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
128128
return
129129
}
130130

131131
reviews := responses.ToResponseList(reviewsDomain)
132132

133133
if reviews == nil {
134-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("review data with book id %d is empty", bookId), []int{})
134+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("review data with book id %d is empty", bookId), []int{})
135135
return
136136
}
137137

138-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("review data with book id %d fetched successfully", bookId), map[string]interface{}{
138+
controllers.NewSuccessResponse(ctx, http.StatusOK, fmt.Sprintf("review data with book id %d fetched successfully", bookId), map[string]interface{}{
139139
"review": reviews,
140140
})
141141
}
@@ -144,20 +144,20 @@ func (c *ReviewController) GetByUserid(ctx *gin.Context) {
144144
userId, _ := strconv.Atoi(ctx.Param("id"))
145145
ctxx := ctx.Request.Context()
146146

147-
reviewsDomain, err := c.reviewUsecase.GetByUserId(ctxx, userId)
147+
reviewsDomain, statusCode, err := c.reviewUsecase.GetByUserId(ctxx, userId)
148148
if err != nil {
149-
controllers.NewErrorResponse(ctx, http.StatusNotFound, err.Error())
149+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
150150
return
151151
}
152152

153153
reviews := responses.ToResponseList(reviewsDomain)
154154

155155
if reviews == nil {
156-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("review data with user id %d is empty", userId), []int{})
156+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("review data with user id %d is empty", userId), []int{})
157157
return
158158
}
159159

160-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("review data with user id %d fetched successfully", userId), map[string]interface{}{
160+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("review data with user id %d fetched successfully", userId), map[string]interface{}{
161161
"review": reviews,
162162
})
163163
}
@@ -178,15 +178,15 @@ func (c *ReviewController) Update(ctx *gin.Context) {
178178

179179
ctxx := ctx.Request.Context()
180180
reviewDom := reviewRequest.ToDomain()
181-
review, err := c.reviewUsecase.Update(ctxx, reviewDom, userClaims.UserID, reviewId)
181+
review, statusCode, err := c.reviewUsecase.Update(ctxx, reviewDom, userClaims.UserID, reviewId)
182182
if err != nil {
183-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
183+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
184184
return
185185
}
186186

187187
go c.ristrettoCache.Del("reviews", fmt.Sprintf("review/%d", review.ID), "users", fmt.Sprintf("user/%d", userClaims.UserID), "books", fmt.Sprintf("book/%d", reviewRequest.BookId))
188188

189-
controllers.NewSuccessResponse(ctx, "review updated successfully", gin.H{
189+
controllers.NewSuccessResponse(ctx, statusCode, "review updated successfully", gin.H{
190190
"reviews": responses.FromDomain(review),
191191
})
192192
}
@@ -196,13 +196,13 @@ func (c *ReviewController) Delete(ctx *gin.Context) {
196196
reviewid, _ := strconv.Atoi(ctx.Param("id"))
197197

198198
ctxx := ctx.Request.Context()
199-
bookId, err := c.reviewUsecase.Delete(ctxx, userClaims.UserID, reviewid)
199+
bookId, statusCode, err := c.reviewUsecase.Delete(ctxx, userClaims.UserID, reviewid)
200200
if err != nil {
201-
controllers.NewErrorResponse(ctx, http.StatusInternalServerError, err.Error())
201+
controllers.NewErrorResponse(ctx, statusCode, err.Error())
202202
return
203203
}
204204

205205
go c.ristrettoCache.Del("reviews", fmt.Sprintf("review/%d", reviewid), "books", fmt.Sprintf("book/%d", userClaims.UserID), "books", fmt.Sprintf("book/%d", bookId))
206206

207-
controllers.NewSuccessResponse(ctx, fmt.Sprintf("review data with id %d deleted successfully", reviewid), nil)
207+
controllers.NewSuccessResponse(ctx, statusCode, fmt.Sprintf("review data with id %d deleted successfully", reviewid), nil)
208208
}

http/controllers/reviews/http_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func TestStore(t *testing.T) {
133133

134134
// Assertions
135135
// Assert status code
136-
assert.Equal(t, http.StatusOK, w.Result().StatusCode)
136+
assert.Equal(t, http.StatusCreated, w.Result().StatusCode)
137137
assert.Contains(t, w.Result().Header.Get("Content-Type"), "application/json")
138138
assert.Contains(t, body, "review created successfully")
139139
})
@@ -319,7 +319,7 @@ func TestGetById(t *testing.T) {
319319

320320
// Assertions
321321
// Assert status code
322-
assert.Equal(t, http.StatusInternalServerError, w.Result().StatusCode)
322+
assert.Equal(t, http.StatusNotFound, w.Result().StatusCode)
323323
assert.Contains(t, w.Result().Header.Get("Content-Type"), "application/json")
324324
})
325325
}
@@ -472,7 +472,7 @@ func TestDelete(t *testing.T) {
472472

473473
// Assertions
474474
// Assert status code
475-
assert.Equal(t, http.StatusInternalServerError, w.Result().StatusCode)
475+
assert.Equal(t, http.StatusNotFound, w.Result().StatusCode)
476476
assert.Contains(t, w.Result().Header.Get("Content-Type"), "application/json")
477477
})
478478
}

0 commit comments

Comments
 (0)