Skip to content

Commit

Permalink
Merge pull request #52 from synapse-organization/cafe/update-delete-menu
Browse files Browse the repository at this point in the history
Cafe/update delete menu
  • Loading branch information
mobinbr authored May 4, 2024
2 parents 931e07f + ad7110a commit a7b6546
Show file tree
Hide file tree
Showing 6 changed files with 285 additions and 21 deletions.
73 changes: 72 additions & 1 deletion api/http/cafe_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ func (h Cafe) GetMenu(c *gin.Context) {

cafe_id, err := strconv.Atoi(CafeID)
if err != nil {
log.GetLog().Errorf("Unable to convert userID to int32. error: %v", err)
log.GetLog().Errorf("Unable to convert cafe id to int32. error: %v", err)
c.JSON(http.StatusBadRequest, gin.H{"error": errors.ErrBadRequest.Error().Error()})
return
}
Expand All @@ -265,6 +265,77 @@ func (h Cafe) GetMenu(c *gin.Context) {
return
}

func (h Cafe) EditMenuItem(c *gin.Context) {
ctx, cancel := context.WithTimeout(c, TimeOut)
defer cancel()

var req models.MenuItem

err := c.ShouldBindJSON(&req)
if err != nil {
log.GetLog().WithError(err).Error("Unable to bind json")
c.JSON(http.StatusInternalServerError, gin.H{"error": errors.ErrBadRequest.Error()})
return
}

role, exists := c.Get("role")
if !exists {
log.GetLog().Errorf("Unable to get user role")
c.JSON(http.StatusInternalServerError, gin.H{"error": errors.ErrUnableToGetUser.Error().Error()})
return
}

if role.(int32) != 2 {
c.JSON(http.StatusForbidden, gin.H{"error": errors.ErrForbidden.Error().Error()})
return
}

err = h.Handler.EditMenuItem(ctx, req)
if err != nil {
log.GetLog().Errorf("Unable to edit menu item. error: %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}

c.JSON(http.StatusOK, gin.H{"status": "ok"})
return
}

func (h Cafe) DeleteMenuItem(c *gin.Context) {
ctx, cancel := context.WithTimeout(c, TimeOut)
defer cancel()

Item := c.Query("item")
itemID, err := strconv.Atoi(Item)
if err != nil {
log.GetLog().Errorf("Invalid item type. error: %v", err)
c.JSON(http.StatusBadRequest, gin.H{"error": errors.ErrBadRequest.Error().Error()})
return
}

role, exists := c.Get("role")
if !exists {
log.GetLog().Errorf("Unable to get user role")
c.JSON(http.StatusInternalServerError, gin.H{"error": errors.ErrUnableToGetUser.Error().Error()})
return
}

if role.(int32) != 2 {
c.JSON(http.StatusForbidden, gin.H{"error": errors.ErrForbidden.Error().Error()})
return
}

err = h.Handler.DeleteMenuItem(ctx, int32(itemID))
if err != nil {
log.GetLog().Errorf("Unable to edit menu item. error: %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}

c.JSON(http.StatusOK, gin.H{"status": "ok"})
return
}

func (h Cafe) Home(c *gin.Context) {
cafe, comments, err := h.Handler.Home(c)
if err != nil {
Expand Down
82 changes: 75 additions & 7 deletions internal/modules/cafe.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,10 +314,16 @@ func (c CafeHandler) AddMenuItem(ctx context.Context, menuItem *models.MenuItem)
return nil, fmt.Errorf("invalid menu item category: %s", menuItem.Category)
}

itemID, err := c.MenuItemRepo.Create(ctx, menuItem)
if err != nil {
log.GetLog().Errorf("Unable to create menu item. error: %v", err)
return nil, err
}

if menuItem.ImageID != "" {
err := c.ImageRepo.Create(ctx, &models.Image{
ID: menuItem.ImageID,
Reference: menuItem.CafeID,
Reference: itemID,
})

if err != nil {
Expand All @@ -326,12 +332,6 @@ func (c CafeHandler) AddMenuItem(ctx context.Context, menuItem *models.MenuItem)
}
}

err := c.MenuItemRepo.Create(ctx, menuItem)
if err != nil {
log.GetLog().Errorf("Unable to create menu item. error: %v", err)
return nil, err
}

return menuItem, err
}

Expand All @@ -354,6 +354,74 @@ func (c CafeHandler) GetMenu(ctx context.Context, cafeID int32) ([]string, map[s
return categories, menu, nil
}

func (c CafeHandler) EditMenuItem(ctx context.Context, newItem models.MenuItem) error {
preItem, err := c.MenuItemRepo.GetByID(ctx, newItem.ID)
if err != nil {
log.GetLog().Errorf("Incorrect menu item id. error: %v", err)
return err
}

images, err := c.ImageRepo.GetByReferenceID(ctx, preItem.ID)
if err != nil {
log.GetLog().Errorf("Unable to get image by reference id. error: %v", err)
return err
}

if len(images) != 0 {
preItem.ImageID = images[0].ID
}

if newItem.Name != preItem.Name && newItem.Name != "" {
err = c.MenuItemRepo.UpdateName(ctx, newItem.ID, newItem.Name)
if err != nil {
log.GetLog().Errorf("Unable to update menu items name. error: %v", err)
return err
}
}

if newItem.Price != preItem.Price && newItem.Price != 0 {
err = c.MenuItemRepo.UpdatePrice(ctx, newItem.ID, newItem.Price)
if err != nil {
log.GetLog().Errorf("Unable to update menu items price. error: %v", err)
return err
}
}

if len(newItem.Ingredients) != len(preItem.Ingredients) && len(newItem.Ingredients) != 0 {
err = c.MenuItemRepo.UpdateIngredients(ctx, newItem.ID, newItem.Ingredients)
if err != nil {
log.GetLog().Errorf("Unable to update menu items ingredients. error: %v", err)
return err
}
}

if newItem.ImageID != preItem.ImageID && newItem.ImageID != "" {
err = c.MenuItemRepo.UpdateImageID(ctx, newItem.ID, newItem.ImageID)
if err != nil {
log.GetLog().Errorf("Unable to update menu items image. error: %v", err)
return err
}
}

return err
}

func (c CafeHandler) DeleteMenuItem(ctx context.Context, itemID int32) error {
err := c.MenuItemRepo.DeleteByID(ctx, itemID)
if err != nil {
log.GetLog().Errorf("Unable to delete item by menu item id. error: %v", err)
return err
}

err = c.ImageRepo.DeleteByReferenceID(ctx, itemID)
if err != nil {
log.GetLog().Errorf("Unable to delete image by menu item id. error: %v", err)
return err
}

return err
}

func (c CafeHandler) Home(ctx context.Context) ([]models.Cafe, []*models.Comment, error) {
cafes, err := c.Rating.GetNTopRatings(ctx, 5)
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions internal/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ func Run() {
cafe.Handle(string(models.POST), "add-menu-item", authMiddleware.IsAuthorized, cafeHttpHandler.AddMenuItem)
cafe.Handle(string(models.GET), "home", cafeHttpHandler.Home)
cafe.Handle(string(models.GET), "get-menu", cafeHttpHandler.GetMenu)
cafe.Handle(string(models.PATCH), "edit-menu-item", authMiddleware.IsAuthorized, cafeHttpHandler.EditMenuItem)
cafe.Handle(string(models.DELETE), "delete-menu-item", authMiddleware.IsAuthorized, cafeHttpHandler.DeleteMenuItem)

imageHandler := http.ImageHandler{MongoDb: mongoDb, MongoOpt: mongoDbOpt, ImageRepo: imageRepo}
image := apiV1.Group("/image")
Expand Down
1 change: 1 addition & 0 deletions pkg/models/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ const (
GET RequestMethod = "GET"
PUT RequestMethod = "PUT"
PATCH RequestMethod = "PATCH"
DELETE RequestMethod = "DELETE"
)
30 changes: 28 additions & 2 deletions pkg/repo/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import (
"barista/pkg/log"
"barista/pkg/models"
"context"

"github.com/jackc/pgx/v5/pgxpool"
)

type ImageRepo interface {
Create(ctx context.Context, image *models.Image) error
GetByReferenceID(ctx context.Context, id int32) ([]*models.Image, error)
CheckExistence(ctx context.Context, imageID string) (bool, error)
DeleteByID(ctx context.Context, id string) error
DeleteByReferenceID(ctx context.Context, referenceID int32) error
}

type ImageRepoImp struct {
Expand All @@ -22,8 +25,7 @@ func NewImageRepoImp(postgres *pgxpool.Pool) *ImageRepoImp {
`CREATE TABLE IF NOT EXISTS images (
id TEXT PRIMARY KEY,
reference_id INTEGER,
create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (reference_id) REFERENCES cafes(id)
create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);`)
if err != nil {
log.GetLog().WithError(err).WithField("table", "images").Fatal("Unable to create table")
Expand Down Expand Up @@ -71,3 +73,27 @@ func (r *ImageRepoImp) CheckExistence(ctx context.Context, imageID string) (bool

return exists, err
}

func (r *ImageRepoImp) DeleteByID(ctx context.Context, id string) error {
_, err := r.postgres.Exec(ctx,
`DELETE FROM images
WHERE id = $1`, id)
if err != nil {
log.GetLog().Errorf("Unable to delete image. error: %v", err)
return err
}

return err
}

func (r *ImageRepoImp) DeleteByReferenceID(ctx context.Context, referenceID int32) error {
_, err := r.postgres.Exec(ctx,
`DELETE FROM images
WHERE reference_id = $1`, referenceID)
if err != nil {
log.GetLog().Errorf("Unable to delete image. error: %v", err)
return err
}

return err
}
Loading

0 comments on commit a7b6546

Please sign in to comment.