Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 107 additions & 0 deletions features/rating/delivery/handler.go
Original file line number Diff line number Diff line change
@@ -1 +1,108 @@
package delivery

import (
"net/http"
"strconv"

"github.com/GROUP-1-FASE-3/Backend/middlewares"
"github.com/GROUP-1-FASE-3/Backend/utils/helper"

"github.com/GROUP-1-FASE-3/Backend/features/rating"
"github.com/labstack/echo/v4"
)

type RatingDelivery struct {
ratingService rating.ServiceInterface
}

func New(service rating.ServiceInterface, e *echo.Echo) {
handler := &RatingDelivery{
ratingService: service,
}

e.POST("/ratings", handler.Create, middlewares.JWTMiddleware())
e.GET("/ratings", handler.GetAll, middlewares.JWTMiddleware())
e.GET("/ratings/:id", handler.GetById, middlewares.JWTMiddleware())
e.PUT("/ratings/:id", handler.UpdateData, middlewares.JWTMiddleware())
e.DELETE("/ratings/:id", handler.DeleteRating, middlewares.JWTMiddleware())
}

// Create
func (delivery *RatingDelivery) Create(c echo.Context) error {
ratingInput := RatingRequest{}
errBind := c.Bind(&ratingInput) // menangkap data yg dikirim dari req body dan disimpan ke variabel
if errBind != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("Error binding data "+errBind.Error()))
}

dataCore := toCore(ratingInput)
err := delivery.ratingService.Create(dataCore)
if err != nil {
return c.JSON(http.StatusInternalServerError, helper.FailedResponse("Failed insert data"+err.Error()))
}
return c.JSON(http.StatusCreated, helper.SuccessResponse("success create data"))
}

// Get All
func (delivery *RatingDelivery) GetAll(c echo.Context) error {
results, err := delivery.ratingService.GetAll()
if err != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("error read data"))
}

dataResponse := fromCoreList(results)

return c.JSON(http.StatusOK, helper.SuccessWithDataResponse("success read all ratings", dataResponse))
}

// Get by (id)
func (delivery *RatingDelivery) GetById(c echo.Context) error {
id, errBind := strconv.Atoi(c.Param("id"))
if errBind != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("Error binding data "+errBind.Error()))
}

IdRating, err := delivery.ratingService.GetById(id)
dataResponse := fromCore(IdRating)
if err != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("Error binding data "+errBind.Error()))
}
return c.JSON(http.StatusOK, helper.SuccessWithDataResponse("success get ratings", dataResponse))
}

// Update
func (delivery *RatingDelivery) UpdateData(c echo.Context) error {
id, errConv := strconv.Atoi(c.Param("id"))
if errConv != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("Error conv data "+errConv.Error()))
}

ratingInput := RatingRequest{}
errBind := c.Bind(&ratingInput)
if errBind != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("Error binding data "+errBind.Error()))
}

dataCore := toCore(ratingInput)
errUpt := delivery.ratingService.UpdateRating(dataCore, id)
if errUpt != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("Error Db update "+errUpt.Error()))
}
return c.JSON(http.StatusOK, helper.SuccessResponse("success update data"))
}

// Delete
func (delivery *RatingDelivery) DeleteRating(c echo.Context) error {
id, errConv := strconv.Atoi(c.Param("id"))
if errConv != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("Error conv data "+errConv.Error()))
}

errDel := delivery.ratingService.DeleteRating(id)
if errDel != nil {
return c.JSON(http.StatusBadRequest, helper.FailedResponse("error delete rating"+errDel.Error()))
}

return c.JSON(http.StatusOK, helper.SuccessResponse("success delete data"))

}
22 changes: 22 additions & 0 deletions features/rating/delivery/request.go
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
package delivery

import "github.com/GROUP-1-FASE-3/Backend/features/rating"

type RatingRequest struct {
Rating uint `json:"rating" form:"rating"`
Comment string `json:"comment" form:"comment"`
VillaID uint `json:"villa_id" form:"villa_id"`
UserID uint `json:"user_id" form:"user_id"`
}

func toCore(data RatingRequest) rating.CoreRating {
return rating.CoreRating{
Rating: data.Rating,
Comment: data.Comment,
User: rating.CoreUser{
ID: data.UserID,
},
Villa: rating.CoreVilla{
ID: data.VillaID,
},
}
}
31 changes: 31 additions & 0 deletions features/rating/delivery/response.go
Original file line number Diff line number Diff line change
@@ -1 +1,32 @@
package delivery

import (
"time"

"github.com/GROUP-1-FASE-3/Backend/features/rating"
)

type RatingResponse struct {
ID uint `json:"id"`
Rating uint `json:"rating"`
Comment string `json:"comment"`
CreatedAt time.Time `json:"created_at"`
}

func fromCore(dataCore rating.CoreRating) RatingResponse {
return RatingResponse{
ID: dataCore.ID,
Rating: dataCore.Rating,
Comment: dataCore.Comment,
CreatedAt: dataCore.CreatedAt,
}
}

// data dari core ke response
func fromCoreList(dataCore []rating.CoreRating) []RatingResponse {
var dataResponse []RatingResponse
for _, v := range dataCore {
dataResponse = append(dataResponse, fromCore(v))
}
return dataResponse
}
53 changes: 53 additions & 0 deletions features/rating/entity.go
Original file line number Diff line number Diff line change
@@ -1 +1,54 @@
package rating

import "time"

type CoreRating struct {
ID uint
Rating uint
Comment string
VillaID uint
UserID uint
CreatedAt time.Time
User CoreUser
Villa CoreVilla
}

type CoreUser struct {
ID uint
User_Name string
}

type CoreVilla struct {
ID uint
Villa_Name string
Price string
Description string
Address string
Villa_Images1 string
Villa_Images2 string
Villa_Images3 string
Detail_Guest uint
Detail_Bedroom uint
Detail_Bed uint
Detail_Bath uint
Detail_Kitchen string
Detail_Pool string
Detail_Wifi string
UserID uint
}

type ServiceInterface interface {
GetAll() (data []CoreRating, err error)
Create(input CoreRating) (err error)
GetById(id int) (data CoreRating, err error)
UpdateRating(input CoreRating, id int) (err error)
DeleteRating(id int) (err error)
}

type RepositoryInterface interface {
GetAll() (data []CoreRating, err error)
Create(input CoreRating) (row int, err error)
GetById(id int) (data CoreRating, err error)
UpdateRating(input CoreRating, id int) (err error)
DeleteRating(id int) (row int, err error)
}
45 changes: 43 additions & 2 deletions features/rating/repository/model.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package repository

import (
"github.com/GROUP-1-FASE-3/Backend/features/rating"
"gorm.io/gorm"
)

type Rating struct {
gorm.Model
VillaID uint
UserID uint
Rating uint
Comment string
VillaID uint
UserID uint
User User
Villa Villa
}

type User struct {
Expand Down Expand Up @@ -42,3 +45,41 @@ type Villa struct {
UserID uint
Ratings []Rating
}

// mengubah struct core ke struct model gorm
func fromCore(dataCore rating.CoreRating) Rating {
ratingGorm := Rating{
Rating: dataCore.Rating,
Comment: dataCore.Comment,
VillaID: dataCore.Villa.ID,
UserID: dataCore.User.ID,
}
return ratingGorm
}

// mengubah struct model gorm ke struct core
func (dataModel *Rating) toCore() rating.CoreRating {
return rating.CoreRating{
ID: dataModel.ID,
Rating: dataModel.Rating,
Comment: dataModel.Comment,
CreatedAt: dataModel.CreatedAt,
User: rating.CoreUser{
ID: dataModel.User.ID,
User_Name: dataModel.User.User_Name,
},
Villa: rating.CoreVilla{
ID: dataModel.Villa.ID,
Villa_Name: dataModel.Villa.Villa_Name,
},
}
}

// mengubah slice struct model gorm ke slice struct core
func toCoreList(dataModel []Rating) []rating.CoreRating {
var dataCore []rating.CoreRating
for _, v := range dataModel {
dataCore = append(dataCore, v.toCore())
}
return dataCore
}
82 changes: 82 additions & 0 deletions features/rating/repository/query.go
Original file line number Diff line number Diff line change
@@ -1 +1,83 @@
package repository

import (
"errors"

"github.com/GROUP-1-FASE-3/Backend/features/rating"
"gorm.io/gorm"
)

type ratingRepository struct {
db *gorm.DB
}

func New(db *gorm.DB) rating.RepositoryInterface {
return &ratingRepository{
db: db,
}
}

// Create implements rating.Repository
func (repo *ratingRepository) Create(input rating.CoreRating) (row int, err error) {
ratingGorm := fromCore(input)
tx := repo.db.Create(&ratingGorm) // proses insert data
if tx.Error != nil {
return -1, tx.Error
}
if tx.RowsAffected == 0 {
return 0, errors.New("insert failed")
}
return int(tx.RowsAffected), nil
}

// GetAll implements user.Repository
func (repo *ratingRepository) GetAll() (data []rating.CoreRating, err error) {
var ratings []Rating

tx := repo.db.Find(&ratings)
if tx.Error != nil {
return nil, tx.Error
}
var dataCore = toCoreList(ratings)
return dataCore, nil
}

// GetById implements rating.RepositoryInterface
func (repo *ratingRepository) GetById(id int) (data rating.CoreRating, err error) {
var IdRating Rating
var IdRatingCore = rating.CoreRating{}
IdRating.ID = uint(id)
tx := repo.db.First(&IdRating, IdRating.ID)
if tx.Error != nil {
return IdRatingCore, tx.Error
}
IdRatingCore = IdRating.toCore()
return IdRatingCore, nil
}

// Update
func (repo *ratingRepository) UpdateRating(datacore rating.CoreRating, id int) (err error) {
ratingGorm := fromCore(datacore)
tx := repo.db.Where("id= ?", id).Updates(ratingGorm)
if tx.Error != nil {
return tx.Error
}
if tx.RowsAffected == 0 {
return errors.New("update rating failed")
}
return nil
}

// Delete
func (repo *ratingRepository) DeleteRating(id int) (row int, err error) {
idRating := Rating{}

tx := repo.db.Delete(&idRating, id)
if tx.Error != nil {
return -1, tx.Error
}
if tx.RowsAffected == 0 {
return -1, errors.New("delete rating by id failed")
}
return int(tx.RowsAffected), nil
}
Loading