Skip to content

Commit 05dbd07

Browse files
authored
Merge pull request #45 from OpenStruct/develop
Release: minor improvements
2 parents 0fc328f + 03120ea commit 05dbd07

7 files changed

Lines changed: 95 additions & 61 deletions

File tree

.DS_Store

4 KB
Binary file not shown.

cmd/project.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"log"
77
"os"
88
"path/filepath"
9+
"strings"
910
)
1011

1112
func createProject(projectName, framework, flag string) {
@@ -116,7 +117,7 @@ func createProjectFiles(projectName, framework, flag string) {
116117
"echo/responses.go.tmpl": "utils/responses.go",
117118
},
118119
}
119-
120+
framework = strings.ToLower(framework)
120121
if files, ok := frameworkFiles[framework]; ok {
121122
for templateName, filePath := range files {
122123
utils.CreateFileFromTemplate(projectName, templateName, filePath, framework, "")

templates/echo/responses.go.tmpl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package utils
22

33
import (
4-
"net/http"
54
"github.com/labstack/echo/v4"
5+
"net/http"
66
)
77

88
// Error Response
9-
func ErrorResponse(ctx echo.Context, message string, reason error) {
9+
func ErrorResponse(ctx echo.Context, message string, reason error) error {
1010
response := map[string]interface{}{
1111
"status": "error",
1212
"message": message,
@@ -16,11 +16,11 @@ func ErrorResponse(ctx echo.Context, message string, reason error) {
1616
response["reason"] = reason.Error()
1717
}
1818

19-
ctx.JSON(http.StatusBadRequest, response)
19+
return ctx.JSON(http.StatusBadRequest, response)
2020
}
2121

2222
// Success Response
23-
func SuccessResponse(ctx echo.Context, message string, data interface{}, total *int64) {
23+
func SuccessResponse(ctx echo.Context, message string, data interface{}, total *int64) error {
2424
response := map[string]interface{}{
2525
"status": "success",
2626
"message": message,
@@ -32,11 +32,11 @@ func SuccessResponse(ctx echo.Context, message string, data interface{}, total *
3232
if total != nil {
3333
response["total"] = total
3434
}
35-
ctx.JSON(http.StatusOK, response)
35+
return ctx.JSON(http.StatusOK, response)
3636
}
3737

3838
// Failed Response
39-
func FailedResponse(ctx echo.Context, message string, reason error) {
39+
func FailedResponse(ctx echo.Context, message string, reason error) error {
4040
response := map[string]interface{}{
4141
"status": "failed",
4242
"message": message,
@@ -46,11 +46,11 @@ func FailedResponse(ctx echo.Context, message string, reason error) {
4646
response["reason"] = reason.Error()
4747
}
4848

49-
ctx.JSON(http.StatusBadRequest, response)
49+
return ctx.JSON(http.StatusBadRequest, response)
5050
}
5151

5252
// NotFound Response
53-
func NotFoundResponse(ctx echo.Context, message string, reason error) {
53+
func NotFoundResponse(ctx echo.Context, message string, reason error) error {
5454
response := map[string]interface{}{
5555
"status": "not found",
5656
"message": message,
@@ -59,11 +59,11 @@ func NotFoundResponse(ctx echo.Context, message string, reason error) {
5959
if reason != nil {
6060
response["reason"] = reason.Error()
6161
}
62-
ctx.JSON(http.StatusNotFound, response)
62+
return ctx.JSON(http.StatusNotFound, response)
6363
}
6464

6565
// Unauthorized Response
66-
func UnauthorizedResponse(ctx echo.Context, message string, reason error) {
66+
func UnauthorizedResponse(ctx echo.Context, message string, reason error) error {
6767

6868
response := map[string]interface{}{
6969
"status": "unauthorized",
@@ -74,11 +74,11 @@ func UnauthorizedResponse(ctx echo.Context, message string, reason error) {
7474
response["reason"] = reason.Error()
7575
}
7676

77-
ctx.JSON(http.StatusUnauthorized, response)
77+
return ctx.JSON(http.StatusUnauthorized, response)
7878
}
7979

8080
// Forbidden Response
81-
func ForbiddenResponse(ctx echo.Context, message string, reason error) {
81+
func ForbiddenResponse(ctx echo.Context, message string, reason error) error {
8282
response := map[string]interface{}{
8383
"status": "forbidden",
8484
"message": message,
@@ -88,5 +88,5 @@ func ForbiddenResponse(ctx echo.Context, message string, reason error) {
8888
response["reason"] = reason.Error()
8989
}
9090

91-
ctx.JSON(http.StatusForbidden, response)
91+
return ctx.JSON(http.StatusForbidden, response)
9292
}
Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,59 @@
11
package controllers
22

33
import (
4+
"errors"
5+
"strings"
6+
"net/http"
7+
"gorm.io/gorm"
48
"github.com/labstack/echo/v4"
5-
"github.com/pkg/errors"
69
"{{ .ProjectName }}/database"
710
"{{ .ProjectName }}/models"
811
"{{ .ProjectName }}/utils"
912
)
1013

1114
type UserRepo struct{}
1215

16+
1317
func (repo *UserRepo) CreateUser(ctx echo.Context) error {
1418
var user models.GoEasyCLITestUser
1519

1620
if err := ctx.Bind(&user); err != nil {
17-
utils.FailedResponse(ctx, "Failed to bind user data", err)
18-
return err
21+
return utils.FailedResponse(ctx, "Failed to bind user data", err)
22+
1923
}
2024

2125
if err := models.CreateUser(ctx.Request().Context(), database.Db, &user); err != nil {
22-
utils.ErrorResponse(ctx, "Failed to create user", err)
23-
return err
26+
if errors.Is(err, gorm.ErrDuplicatedKey) || strings.Contains(err.Error(), "UNIQUE constraint failed") {
27+
return ctx.JSON(http.StatusConflict, map[string]string{"error": "Email already exists"})
28+
}
29+
return utils.ErrorResponse(ctx, "Failed to create user", err)
30+
2431
}
2532

26-
utils.SuccessResponse(ctx, "User created successfully", user, nil)
27-
return nil
28-
}
33+
return utils.SuccessResponse(ctx, "User created successfully", user, nil)
2934

35+
}
3036

3137
func (repo *UserRepo) GetAllUsers(ctx echo.Context) error {
3238
users, err := models.GetAllUsers(ctx.Request().Context(), database.Db)
3339
if err != nil {
34-
utils.ErrorResponse(ctx, "Failed to get users", err)
35-
return err
40+
return utils.ErrorResponse(ctx, "Failed to get users", err)
3641
}
3742

38-
utils.SuccessResponse(ctx, "Users fetched successfully", users, nil)
39-
return nil
40-
}
43+
return utils.SuccessResponse(ctx, "Users fetched successfully", users, nil)
4144

45+
}
4246

4347
func (repo *UserRepo) GetUserByID(ctx echo.Context) error {
4448
user, err := models.GetUserByID(ctx.Request().Context(), database.Db, ctx.Param("id"))
4549
if err != nil {
46-
utils.ErrorResponse(ctx, "User not found", err)
47-
return err
50+
return utils.ErrorResponse(ctx, "User not found", err)
51+
4852
}
4953

50-
utils.SuccessResponse(ctx, "User retrieved successfully", user, nil)
51-
return nil
52-
}
54+
return utils.SuccessResponse(ctx, "User retrieved successfully", user, nil)
5355

56+
}
5457

5558
func (repo *UserRepo) UpdateUser(ctx echo.Context) error {
5659
var user models.GoEasyCLITestUser
@@ -61,27 +64,26 @@ func (repo *UserRepo) UpdateUser(ctx echo.Context) error {
6164
}
6265

6366
if user.ID == 0 {
64-
utils.FailedResponse(ctx, "Invalid user ID", nil)
65-
return errors.Errorf("Invalid user ID")
67+
return utils.FailedResponse(ctx, "Invalid user ID", nil)
6668
}
6769

6870
if err := models.UpdateUser(ctx.Request().Context(), database.Db, &user); err != nil {
69-
utils.ErrorResponse(ctx, "Failed to update user", err)
70-
return err
71+
if err.Error() == "user not found" {
72+
return ctx.JSON(http.StatusNotFound, map[string]string{"error": "User not found"})
73+
}
74+
return utils.ErrorResponse(ctx, "Failed to update user", err)
7175
}
7276

73-
utils.SuccessResponse(ctx, "User updated successfully", user, nil)
74-
return nil
77+
return utils.SuccessResponse(ctx, "User updated successfully", user, nil)
7578
}
7679

77-
7880
func (repo *UserRepo) DeleteUser(ctx echo.Context) error {
7981
err := models.DeleteUser(ctx.Request().Context(), database.Db, ctx.Param("id"))
8082
if err != nil {
81-
utils.ErrorResponse(ctx, "Failed to delete user", err)
82-
return err
83+
return utils.ErrorResponse(ctx, "Failed to delete user", err)
84+
8385
}
8486

85-
utils.SuccessResponse(ctx, "User deleted successfully", nil, nil)
86-
return nil
87+
return utils.SuccessResponse(ctx, "User deleted successfully", nil, nil)
88+
8789
}

templates/fiber/user_controller.go.tmpl

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package controllers
22

33
import (
4+
"errors"
5+
"strings"
46
"{{ .ProjectName }}/database"
57
"{{ .ProjectName }}/models"
68
"{{ .ProjectName }}/utils"
@@ -15,24 +17,28 @@ func (repo *UserController) CreateUser(c *fiber.Ctx) error {
1517
if err := c.BodyParser(&user); err != nil {
1618
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "cannot parse JSON"})
1719
}
20+
1821
if err := models.CreateUser(c.Context(), database.Db, &user); err != nil {
19-
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
22+
if errors.Is(err, gorm.ErrDuplicatedKey) || strings.Contains(err.Error(), "UNIQUE constraint failed") {
23+
return c.Status(fiber.StatusConflict).JSON(fiber.Map{"error": "Email already exists"})
24+
} else {
25+
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
26+
}
27+
2028
}
2129

22-
return utils.SuccessResponse(c, "User created successfully",user,nil)
30+
return utils.SuccessResponse(c, "User created successfully", user, nil)
2331
}
2432

25-
2633
func (repo *UserController) GetAllUsers(c *fiber.Ctx) error {
2734
users, err := models.GetAllUsers(c.Context(), database.Db)
2835
if err != nil {
2936
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
3037
}
31-
return utils.SuccessResponse(c, "Users fetched successfully",users,nil)
38+
return utils.SuccessResponse(c, "Users fetched successfully", users, nil)
3239

3340
}
3441

35-
3642
func (repo *UserController) GetUserByID(c *fiber.Ctx) error {
3743
id := c.Params("id")
3844
user, err := models.GetUserByID(c.Context(), database.Db, id)
@@ -42,10 +48,9 @@ func (repo *UserController) GetUserByID(c *fiber.Ctx) error {
4248
}
4349
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
4450
}
45-
return utils.SuccessResponse(c, "User retrieved successfully",user,nil)
51+
return utils.SuccessResponse(c, "User retrieved successfully", user, nil)
4652
}
4753

48-
4954
func (repo *UserController) UpdateUser(c *fiber.Ctx) error {
5055
var user models.GoEasyCLITestUser
5156

@@ -58,9 +63,13 @@ func (repo *UserController) UpdateUser(c *fiber.Ctx) error {
5863
}
5964

6065
if err := models.UpdateUser(c.Context(), database.Db, &user); err != nil {
61-
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
66+
if err.Error() == "user not found" {
67+
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "User not found"})
68+
}
69+
return utils.ErrorResponse(c, "Failed to update user", err)
6270
}
63-
return utils.SuccessResponse(c, "User updated successfully",user,nil)
71+
72+
return utils.SuccessResponse(c, "User updated successfully", user, nil)
6473
}
6574

6675
func (repo *UserController) DeleteUser(c *fiber.Ctx) error {

templates/gin/user_controller.go.tmpl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package controllers
22

33
import (
4+
"errors"
5+
"strings"
46
"net/http"
5-
67
"github.com/gin-gonic/gin"
78
"gorm.io/gorm"
89
"{{ .ProjectName }}/database"
@@ -20,9 +21,14 @@ func (repo *UserRepo) CreateUser(ctx *gin.Context) {
2021
}
2122

2223
if err := models.CreateUser(ctx, database.Db, &user); err != nil {
23-
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
24+
if errors.Is(err, gorm.ErrDuplicatedKey) || strings.Contains(err.Error(), "UNIQUE constraint failed") {
25+
ctx.JSON(http.StatusConflict, gin.H{"error": "Email already exists"})
26+
} else {
27+
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
28+
}
2429
return
2530
}
31+
2632
utils.SuccessResponse(ctx, "User created successfully", user, nil)
2733
}
2834

@@ -67,7 +73,11 @@ func (repo *UserRepo) UpdateUser(ctx *gin.Context) {
6773
}
6874

6975
if err := models.UpdateUser(ctx, database.Db, &user); err != nil {
70-
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
76+
if err.Error() == "user not found" {
77+
ctx.JSON(http.StatusNotFound, map[string]string{"error": "User not found"})
78+
return
79+
}
80+
utils.ErrorResponse(ctx, "Failed to update user", err)
7181
return
7282
}
7383
utils.SuccessResponse(ctx, "User updated successfully", user, nil)

templates/shared/user_model.go.tmpl

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package models
22

33
import (
4-
"gorm.io/gorm"
4+
"errors"
55
"context"
6+
"time"
7+
8+
"gorm.io/gorm"
69
)
710

811
type GoEasyCLITestUser struct {
9-
gorm.Model
10-
Name string `json:"name"`
11-
Email string `json:"email"`
12+
ID uint `json:"id" gorm:"primaryKey;autoIncrement"`
13+
Name string `json:"name,omitempty"`
14+
Email string `json:"email,omitempty" gorm:"unique"`
15+
CreatedAt time.Time `json:"created_at"`
16+
UpdatedAt time.Time `json:"updated_at"`
1217
}
1318

1419
func CreateUser(ctx context.Context,db *gorm.DB, user *GoEasyCLITestUser) error {
15-
return db.WithContext(ctx).Create(user).Error
20+
return db.WithContext(ctx).Create(&user).Error
1621
}
1722

1823
func GetAllUsers(ctx context.Context, db *gorm.DB) ([]GoEasyCLITestUser, error) {
@@ -32,7 +37,14 @@ func GetUserByID(ctx context.Context, db *gorm.DB, id string) (GoEasyCLITestUser
3237
}
3338

3439
func UpdateUser(ctx context.Context, db *gorm.DB, user *GoEasyCLITestUser) error {
35-
return db.WithContext(ctx).Save(user).Error
40+
result := db.WithContext(ctx).Where("id = ?", user.ID).Updates(user)
41+
if result.Error != nil {
42+
return result.Error
43+
}
44+
if result.RowsAffected == 0 {
45+
return errors.New("user not found")
46+
}
47+
return nil
3648
}
3749

3850
func DeleteUser(ctx context.Context, db *gorm.DB, id string) error {

0 commit comments

Comments
 (0)