add converter, req and res need to make model for it self

dev
ajikamaludin 2 years ago
parent 80996966bb
commit 3716dc654d
Signed by: ajikamaludin
GPG Key ID: 476C9A2B4B794EBB

@ -11,7 +11,7 @@ import (
) )
func Login(c *fiber.Ctx) error { func Login(c *fiber.Ctx) error {
userRequest := new(models.User) userRequest := new(models.UserReq)
_ = c.BodyParser(&userRequest) _ = c.BodyParser(&userRequest)
@ -19,7 +19,7 @@ func Login(c *fiber.Ctx) error {
if errors != nil { if errors != nil {
return c.Status(fiber.StatusUnprocessableEntity).JSON(fiber.Map{ return c.Status(fiber.StatusUnprocessableEntity).JSON(fiber.Map{
"status": constants.STATUS_FAIL, "status": constants.STATUS_FAIL,
"message": "request body mismatch", "message": "request body invalid",
"error": errors, "error": errors,
}) })
} }
@ -32,7 +32,7 @@ func Login(c *fiber.Ctx) error {
if err != nil { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"status": constants.STATUS_FAIL, "status": constants.STATUS_FAIL,
"message": "credentials mismatch", "message": "credentials invalid",
"error": err.Error(), "error": err.Error(),
}) })
} }
@ -40,14 +40,14 @@ func Login(c *fiber.Ctx) error {
accessToken := jwtmanager.CreateToken(user) accessToken := jwtmanager.CreateToken(user)
return c.Status(fiber.StatusOK).JSON(fiber.Map{ return c.Status(fiber.StatusOK).JSON(fiber.Map{
"user": user, "user": user.ToUserRes(),
"accessToken": accessToken, "accessToken": accessToken,
"refreshToken": "", "refreshToken": "",
}) })
} }
func Register(c *fiber.Ctx) error { func Register(c *fiber.Ctx) error {
userRequest := new(models.User) userRequest := new(models.UserReq)
_ = c.BodyParser(&userRequest) _ = c.BodyParser(&userRequest)
@ -55,14 +55,15 @@ func Register(c *fiber.Ctx) error {
if errors != nil { if errors != nil {
return c.Status(fiber.StatusUnprocessableEntity).JSON(fiber.Map{ return c.Status(fiber.StatusUnprocessableEntity).JSON(fiber.Map{
"status": constants.STATUS_FAIL, "status": constants.STATUS_FAIL,
"message": "request body mismatch", "message": "request body invalid",
"error": errors, "error": errors,
}) })
} }
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(userRequest.Password), bcrypt.DefaultCost)
user := &models.User{ user := &models.User{
Email: userRequest.Email, Email: userRequest.Email,
Password: userRequest.Password, Password: string(hashedPassword),
} }
err := userRepository.GetUserByEmail(userRequest.Email, user) err := userRepository.GetUserByEmail(userRequest.Email, user)
if err == nil { if err == nil {
@ -78,7 +79,7 @@ func Register(c *fiber.Ctx) error {
accessToken := jwtmanager.CreateToken(user) accessToken := jwtmanager.CreateToken(user)
return c.Status(fiber.StatusOK).JSON(fiber.Map{ return c.Status(fiber.StatusOK).JSON(fiber.Map{
"user": user, "user": user.ToUserRes(),
"accessToken": accessToken, "accessToken": accessToken,
"refreshToken": "", "refreshToken": "",
}) })

@ -3,9 +3,8 @@ package note
import ( import (
"github.com/ajikamaludin/go-fiber-rest/app/models" "github.com/ajikamaludin/go-fiber-rest/app/models"
noteRepository "github.com/ajikamaludin/go-fiber-rest/app/repository/note" noteRepository "github.com/ajikamaludin/go-fiber-rest/app/repository/note"
gormdb "github.com/ajikamaludin/go-fiber-rest/pkg/gorm.db"
redisclient "github.com/ajikamaludin/go-fiber-rest/pkg/redis.client"
"github.com/ajikamaludin/go-fiber-rest/pkg/utils/constants" "github.com/ajikamaludin/go-fiber-rest/pkg/utils/constants"
"github.com/ajikamaludin/go-fiber-rest/pkg/utils/converter"
"github.com/ajikamaludin/go-fiber-rest/pkg/utils/validator" "github.com/ajikamaludin/go-fiber-rest/pkg/utils/validator"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
) )
@ -13,7 +12,7 @@ import (
func GetAllNotes(c *fiber.Ctx) error { func GetAllNotes(c *fiber.Ctx) error {
var notes []models.Note var notes []models.Note
err := noteRepository.GetAllNotes(&notes) err := noteRepository.GetAllNotes(c, &notes)
if err != nil { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"status": constants.STATUS_FAIL, "status": constants.STATUS_FAIL,
@ -22,10 +21,12 @@ func GetAllNotes(c *fiber.Ctx) error {
}) })
} }
notesRes := converter.MapNoteToNoteRes(notes)
return c.Status(fiber.StatusOK).JSON(fiber.Map{ return c.Status(fiber.StatusOK).JSON(fiber.Map{
"status": constants.STATUS_SUCCESS, "status": constants.STATUS_SUCCESS,
"message": "Ok", "message": "Ok",
"data": notes, "data": notesRes,
}) })
} }
@ -45,53 +46,33 @@ func GetNoteById(c *fiber.Ctx) error {
return c.Status(fiber.StatusOK).JSON(fiber.Map{ return c.Status(fiber.StatusOK).JSON(fiber.Map{
"status": constants.STATUS_SUCCESS, "status": constants.STATUS_SUCCESS,
"message": "note found", "message": "note found",
"data": note, "data": note.ToNoteRes(),
}) })
} }
func CreateNote(c *fiber.Ctx) error { func CreateNote(c *fiber.Ctx) error {
noteRequest := new(models.Note) noteRequest := new(models.NoteReq)
if err := c.BodyParser(&noteRequest); err != nil { c.BodyParser(&noteRequest)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"message": err.Error(),
})
}
errors := validator.ValidateRequest(noteRequest) errors := validator.ValidateRequest(noteRequest)
if errors != nil { if errors != nil {
return c.Status(fiber.StatusUnprocessableEntity).JSON(errors) return c.Status(fiber.StatusUnprocessableEntity).JSON(errors)
} }
db, err := gormdb.GetInstance() note, _ := noteRepository.CreateNote(c, noteRequest)
if err != nil {
return err
}
var note = models.Note{
Title: noteRequest.Note,
Note: noteRequest.Title,
}
db.Create(&note)
return c.Status(fiber.StatusCreated).JSON(fiber.Map{ return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"status": constants.STATUS_SUCCESS, "status": constants.STATUS_SUCCESS,
"message": "note created", "message": "note created",
"data": note, "data": note.ToNoteRes(),
}) })
} }
func UpdateNote(c *fiber.Ctx) error { func UpdateNote(c *fiber.Ctx) error {
// validate request first noteRequest := new(models.NoteReq)
noteRequest := new(models.Note)
if err := c.BodyParser(&noteRequest); err != nil { c.BodyParser(&noteRequest)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"status": constants.STATUS_FAIL,
"message": err.Error(),
})
}
errors := validator.ValidateRequest(noteRequest) errors := validator.ValidateRequest(noteRequest)
if errors != nil { if errors != nil {
@ -102,16 +83,9 @@ func UpdateNote(c *fiber.Ctx) error {
}) })
} }
// find records
id := c.Params("id") id := c.Params("id")
db, err := gormdb.GetInstance()
if err != nil {
return err
}
note := models.Note{} note := models.Note{}
err = db.First(&note, id).Error err := noteRepository.GetNoteById(id, &note)
if err != nil { if err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
@ -120,29 +94,20 @@ func UpdateNote(c *fiber.Ctx) error {
}) })
} }
// Update noteRepository.UpdateNote(&note, noteRequest)
db.Model(&note).Updates(noteRequest)
key := "note+" + id
redisclient.Remove(key)
return c.Status(fiber.StatusCreated).JSON(fiber.Map{ return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"status": constants.STATUS_SUCCESS, "status": constants.STATUS_SUCCESS,
"message": "note updated", "message": "note updated",
"data": note, "data": note.ToNoteRes(),
}) })
} }
func DeleteNote(c *fiber.Ctx) error { func DeleteNote(c *fiber.Ctx) error {
// find records
id := c.Params("id") id := c.Params("id")
db, err := gormdb.GetInstance()
if err != nil {
return err
}
note := models.Note{} note := models.Note{}
err = db.First(&note, id).Error err := noteRepository.GetNoteById(id, &note)
if err != nil { if err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
@ -151,9 +116,7 @@ func DeleteNote(c *fiber.Ctx) error {
}) })
} }
db.Delete(&note) noteRepository.DeleteNote(&note)
key := "note+" + id
redisclient.Remove(key)
return c.SendStatus(fiber.StatusNoContent) return c.SendStatus(fiber.StatusNoContent)
} }

@ -4,13 +4,14 @@ import (
"github.com/ajikamaludin/go-fiber-rest/app/models" "github.com/ajikamaludin/go-fiber-rest/app/models"
gormdb "github.com/ajikamaludin/go-fiber-rest/pkg/gorm.db" gormdb "github.com/ajikamaludin/go-fiber-rest/pkg/gorm.db"
"github.com/ajikamaludin/go-fiber-rest/pkg/utils/constants" "github.com/ajikamaludin/go-fiber-rest/pkg/utils/constants"
"github.com/ajikamaludin/go-fiber-rest/pkg/utils/converter"
"github.com/ajikamaludin/go-fiber-rest/pkg/utils/validator" "github.com/ajikamaludin/go-fiber-rest/pkg/utils/validator"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
) )
func CreateUser(c *fiber.Ctx) error { func CreateUser(c *fiber.Ctx) error {
userRequest := new(models.User) userRequest := new(models.UserReq)
if err := c.BodyParser(&userRequest); err != nil { if err := c.BodyParser(&userRequest); err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
@ -48,7 +49,7 @@ func CreateUser(c *fiber.Ctx) error {
return c.Status(fiber.StatusCreated).JSON(fiber.Map{ return c.Status(fiber.StatusCreated).JSON(fiber.Map{
"status": constants.STATUS_SUCCESS, "status": constants.STATUS_SUCCESS,
"message": "user created", "message": "user created",
"data": user, "data": user.ToUserRes(),
}) })
} }
@ -58,12 +59,12 @@ func GetAllUsers(c *fiber.Ctx) error {
return err return err
} }
users := &models.User{} users := []models.User{}
db.Find(&users) db.Find(&users)
return c.Status(fiber.StatusOK).JSON(fiber.Map{ return c.Status(fiber.StatusOK).JSON(fiber.Map{
"status": constants.STATUS_SUCCESS, "status": constants.STATUS_SUCCESS,
"message": "Ok", "message": "Ok",
"data": users, "data": converter.MapUserToUserRes(users),
}) })
} }

@ -7,8 +7,48 @@ import (
type Note struct { type Note struct {
gorm.Model gorm.Model
UserId uuid.UUID UserId uuid.UUID `gorm:"type:uuid"`
Title string `validate:"required,min=3"` Title string
Note string `validate:"required,min=3"` Note string
Tag string Tag string
User User `json:",omitempty"`
}
func (n Note) ToNoteRes() *NoteRes {
return &NoteRes{
UserId: n.UserId,
ID: n.ID,
Title: n.Title,
Note: n.Note,
}
}
func (n Note) ToNoteWithUserRes() *NoteWithUserRes {
return &NoteWithUserRes{
UserId: n.UserId,
ID: n.ID,
Title: n.Title,
Note: n.Note,
User: n.User,
}
}
type NoteRes struct {
UserId uuid.UUID
ID uint
Title string
Note string
}
type NoteWithUserRes struct {
UserId uuid.UUID
ID uint
Title string
Note string
User User
}
type NoteReq struct {
Title string `validate:"required,min=3"`
Note string `validate:"required,min=3"`
} }

@ -12,8 +12,8 @@ type User struct {
CreatedAt time.Time CreatedAt time.Time
UpdatedAt time.Time UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"` DeletedAt gorm.DeletedAt `gorm:"index"`
Email string `validate:"required,min=3,email"` Email string
Password string `validate:"required,min=3"` Password string
Notes []Note Notes []Note
} }
@ -22,3 +22,24 @@ func (user *User) BeforeCreate(tx *gorm.DB) (err error) {
return return
} }
func (user User) ToUserRes() *UserRes {
return &UserRes{
ID: user.ID,
Email: user.Email,
Password: user.Password,
CreatedAt: user.CreatedAt,
}
}
type UserRes struct {
ID uuid.UUID
Email string
Password string
CreatedAt time.Time
}
type UserReq struct {
Email string `validate:"required,min=3,email"`
Password string `validate:"required,min=3"`
}

@ -1,21 +1,26 @@
package note package note
import ( import (
"strconv"
"time" "time"
"github.com/ajikamaludin/go-fiber-rest/app/models" "github.com/ajikamaludin/go-fiber-rest/app/models"
gormdb "github.com/ajikamaludin/go-fiber-rest/pkg/gorm.db" gormdb "github.com/ajikamaludin/go-fiber-rest/pkg/gorm.db"
"github.com/ajikamaludin/go-fiber-rest/pkg/jwtmanager"
redisclient "github.com/ajikamaludin/go-fiber-rest/pkg/redis.client" redisclient "github.com/ajikamaludin/go-fiber-rest/pkg/redis.client"
"github.com/gofiber/fiber/v2"
) )
func GetAllNotes(notes *[]models.Note) error { func GetAllNotes(c *fiber.Ctx, notes *[]models.Note) error {
err := redisclient.Get("allnotes", &notes) err := redisclient.Get("allnotes", &notes)
if err != nil { if err != nil {
db, err := gormdb.GetInstance() db, err := gormdb.GetInstance()
if err != nil { if err != nil {
return err return err
} }
db.Find(&notes)
userId := jwtmanager.GetUserId(c)
db.Where("user_id = ?", userId).Find(&notes)
redisclient.Set("allnotes", &notes, 30*time.Second) redisclient.Set("allnotes", &notes, 30*time.Second)
} }
@ -42,3 +47,54 @@ func GetNoteById(id string, note *models.Note) error {
} }
return nil return nil
} }
func CreateNote(c *fiber.Ctx, noteRequest *models.NoteReq) (*models.Note, error) {
db, err := gormdb.GetInstance()
if err != nil {
return nil, err
}
userId := jwtmanager.GetUserId(c)
note := &models.Note{
UserId: userId,
Title: noteRequest.Note,
Note: noteRequest.Title,
}
db.Create(&note)
return note, nil
}
func UpdateNote(note *models.Note, noteRequest *models.NoteReq) (*models.NoteRes, error) {
db, err := gormdb.GetInstance()
if err != nil {
return nil, err
}
db.Model(&note).Updates(&models.Note{
Title: noteRequest.Title,
Note: noteRequest.Note,
})
key := "note+" + strconv.Itoa(int(note.ID))
redisclient.Remove(key)
return &models.NoteRes{
UserId: note.UserId,
Title: note.Title,
Note: note.Note,
}, err
}
func DeleteNote(note *models.Note) error {
db, err := gormdb.GetInstance()
if err != nil {
return err
}
db.Delete(&note)
key := "note+" + strconv.Itoa(int(note.ID))
redisclient.Remove(key)
return nil
}

@ -14,7 +14,6 @@ var lock = &sync.Mutex{}
var db *gorm.DB var db *gorm.DB
func GetInstance() (*gorm.DB, error) { func GetInstance() (*gorm.DB, error) {
// fmt.Println("[DATABASE] : ", db)
if db == nil { if db == nil {
configs := configs.GetInstance() configs := configs.GetInstance()
@ -41,5 +40,6 @@ func GetInstance() (*gorm.DB, error) {
} }
return db, nil return db, nil
} }
// fmt.Println("[DATABASE] : ", db)
return db, nil return db, nil
} }

@ -5,6 +5,9 @@ import (
"github.com/ajikamaludin/go-fiber-rest/app/configs" "github.com/ajikamaludin/go-fiber-rest/app/configs"
"github.com/ajikamaludin/go-fiber-rest/app/models" "github.com/ajikamaludin/go-fiber-rest/app/models"
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/golang-jwt/jwt/v4" "github.com/golang-jwt/jwt/v4"
) )
@ -22,3 +25,10 @@ func CreateToken(user *models.User) string {
return token return token
} }
func GetUserId(c *fiber.Ctx) (UserId uuid.UUID) {
user := c.Locals("user").(*jwt.Token)
claims := user.Claims.(jwt.MapClaims)
UserId, _ = uuid.Parse(claims["user_id"].(string))
return
}

@ -1,4 +1,4 @@
package constants package constants
const STATUS_SUCCESS = "succes" const STATUS_SUCCESS = "success"
const STATUS_FAIL = "fail" const STATUS_FAIL = "fail"

@ -0,0 +1,17 @@
package converter
import "github.com/ajikamaludin/go-fiber-rest/app/models"
func MapNoteToNoteRes(notes []models.Note) (noteRes []models.NoteRes) {
for _, v := range notes {
noteRes = append(noteRes, *v.ToNoteRes())
}
return
}
func MapUserToUserRes(users []models.User) (userRes []models.UserRes) {
for _, v := range users {
userRes = append(userRes, *v.ToUserRes())
}
return
}
Loading…
Cancel
Save