Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactored towards if-error conditions and less .Model(...) usage #261

Merged
merged 3 commits into from
Oct 15, 2023
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
11 changes: 4 additions & 7 deletions client/local/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -285,17 +285,14 @@ func storeImage(path string, i []byte) (string, error) {
}
}

out, errFile := os.Create(imgPath)
if errFile != nil {
log.WithError(errFile).Error("Unable to create the new testfile")
out, err := os.Create(imgPath)
if err != nil {
log.WithError(err).Error("Unable to create the new testfile")
}
defer func(out *os.File) {
if err := out.Close(); err != nil {
log.WithError(err).Error("File was not closed successfully")
}
}(out)
var opts jpeg.Options
opts.Quality = 100
errFile = jpeg.Encode(out, img, &opts)
return imgPath, errFile
return imgPath, jpeg.Encode(out, img, &jpeg.Options{Quality: 100})
}
108 changes: 41 additions & 67 deletions server/backend/cafeteria.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,12 @@ func (s *CampusServer) GetCafeteriaRatings(ctx context.Context, input *pb.ListCa
var result model.CafeteriaRatingAverage //get the average rating for this specific cafeteria
tx := s.db.WithContext(ctx)
cafeteriaId := getIDForCafeteriaName(input.CanteenId, tx)
res := tx.Model(&model.CafeteriaRatingAverage{}).
Where("cafeteriaId = ?", cafeteriaId).
First(&result)

res := tx.First(&result, "cafeteriaId = ?", cafeteriaId)
if res.Error != nil {
log.WithError(res.Error).Error("Error while querying the cafeteria with Id ", cafeteriaId)
return nil, status.Error(codes.Internal, "This cafeteria has not yet been rated.")
}

if res.RowsAffected > 0 {
ratings := queryLastCafeteriaRatingsWithLimit(input, cafeteriaId, tx)
cafeteriaTags := queryTags(cafeteriaId, -1, CAFETERIA, tx)
Expand Down Expand Up @@ -102,17 +99,14 @@ func queryLastCafeteriaRatingsWithLimit(input *pb.ListCanteenRatingsRequest, caf
} else {
to = input.To.AsTime()
}
err = tx.Model(&model.CafeteriaRating{}).
Where("cafeteriaID = ? AND timestamp < ? AND timestamp > ?", cafeteriaID, to, from).
err = tx.
Order("timestamp desc, cafeteriaRating desc").
Limit(limit).
Find(&ratings).Error
Find(&ratings, "cafeteriaID = ? AND timestamp < ? AND timestamp > ?", cafeteriaID, to, from).Error
} else {
err = tx.Model(&model.CafeteriaRating{}).
Where("cafeteriaID = ?", cafeteriaID).
Order("timestamp desc, cafeteriaRating desc").
err = tx.Order("timestamp desc, cafeteriaRating desc").
Limit(limit).
Find(&ratings).Error
Find(&ratings, "cafeteriaID = ?", cafeteriaID).Error
}

if err != nil {
Expand Down Expand Up @@ -152,17 +146,15 @@ func (s *CampusServer) GetDishRatings(ctx context.Context, input *pb.GetDishRati
cafeteriaID := getIDForCafeteriaName(input.CanteenId, tx)
dishID := getIDForDishName(input.Dish, cafeteriaID, tx)

err := tx.Model(&model.DishRatingAverage{}).
Where("cafeteriaID = ? AND dishID = ?", cafeteriaID, dishID).
First(&result)
res := tx.First(&result, "cafeteriaID = ? AND dishID = ?", cafeteriaID, dishID)

if err.Error != nil {
if res.Error != nil {
fields := log.Fields{"dishID": dishID, "cafeteriaID": cafeteriaID}
log.WithError(err.Error).WithFields(fields).Error("Error while querying the average ratings")
log.WithError(res.Error).WithFields(fields).Error("Error while querying the average ratings")
return nil, status.Error(codes.Internal, "This dish has not yet been rated.")
}

if err.RowsAffected > 0 {
if res.RowsAffected > 0 {
ratings := queryLastDishRatingsWithLimit(input, cafeteriaID, dishID, tx)
dishTags := queryTags(cafeteriaID, dishID, DISH, tx)
nameTags := queryTags(cafeteriaID, dishID, NAME, tx)
Expand Down Expand Up @@ -212,17 +204,13 @@ func queryLastDishRatingsWithLimit(input *pb.GetDishRatingsRequest, cafeteriaID
to = input.To.AsTime()
}

err = tx.Model(&model.DishRating{}).
Where("cafeteriaID = ? AND dishID = ? AND timestamp < ? AND timestamp > ?", cafeteriaID, dishID, to, from).
Order("timestamp desc, dishRating desc").
err = tx.Order("timestamp desc, dishRating desc").
Limit(limit).
Find(&ratings).Error
Find(&ratings, "cafeteriaID = ? AND dishID = ? AND timestamp < ? AND timestamp > ?", cafeteriaID, dishID, to, from).Error
} else {
err = tx.Model(&model.DishRating{}).
Where("cafeteriaID = ? AND dishID = ?", cafeteriaID, dishID).
Order("timestamp desc, dishRating desc").
err = tx.Order("timestamp desc, dishRating desc").
Limit(limit).
Find(&ratings).Error
Find(&ratings, "cafeteriaID = ? AND dishID = ?", cafeteriaID, dishID).Error
}

if err != nil {
Expand Down Expand Up @@ -374,7 +362,7 @@ func (s *CampusServer) CreateCanteenRating(ctx context.Context, input *pb.Create
Timestamp: time.Now(),
Image: resPath,
}
if err := tx.Model(&model.CafeteriaRating{}).Create(&rating).Error; err != nil {
if err := tx.Create(&rating).Error; err != nil {
log.WithError(err).Error("Error occurred while creating the new cafeteria rating.")
return nil, status.Error(codes.InvalidArgument, "Error while creating new cafeteria rating. Rating has not been saved.")

Expand All @@ -386,15 +374,13 @@ func (s *CampusServer) CreateCanteenRating(ctx context.Context, input *pb.Create
}

func imageWrapper(image []byte, path string, id int64) string {
var resPath = ""
if len(image) > 0 {
var resError error
path := fmt.Sprintf("%s%s%s%d%s", "/Storage/rating/", path, "/", id, "/")
resPath, resError = storeImage(path, image)

if resError != nil {
log.WithError(resError).Error("Error occurred while storing the image.")
}
if len(image) == 0 {
return ""
}
path = fmt.Sprintf("/Storage/rating/%s/%d/", path, id)
resPath, err := storeImage(path, image)
if err != nil {
log.WithError(err).Error("Error occurred while storing the image.")
}
return resPath
}
Expand All @@ -413,29 +399,26 @@ func storeImage(path string, i []byte) (string, error) {
img, _, _ := image.Decode(bytes.NewReader(i))
resizedImage := imaging.Resize(img, 1280, 0, imaging.Lanczos)

var opts jpeg.Options
quality := 100 // if image small enough use it directly
maxImageSize := 524288 // 0.55MB
if len(i) > maxImageSize {
opts.Quality = (maxImageSize / len(i)) * 100
} else {
opts.Quality = 100 // if image small enough use it directly
quality = (maxImageSize / len(i)) * 100
}

var imgPath = fmt.Sprintf("%s%x.jpeg", path, md5.Sum(i))

out, errFile := os.Create(imgPath)
if errFile != nil {
log.WithError(errFile).Error("Error while creating a new file on the path: ", path)
return imgPath, errFile
out, err := os.Create(imgPath)
if err != nil {
log.WithError(err).Error("Error while creating a new file on the path: ", path)
return imgPath, err
}
defer func(out *os.File) {
if err := out.Close(); err != nil {
log.WithError(err).Error("while closing the file.")
}
}(out)

errFile = jpeg.Encode(out, resizedImage, &opts)
return imgPath, errFile
return imgPath, jpeg.Encode(out, resizedImage, &jpeg.Options{Quality: quality})
}

// CreateDishRating RPC Endpoint
Expand All @@ -451,32 +434,28 @@ func (s *CampusServer) CreateDishRating(ctx context.Context, input *pb.CreateDis
return nil, errorRes
}

var dish *model.Dish
errDish := tx.Model(&model.Dish{}). //Dish must exist in the given mensa
Where("name LIKE ? AND cafeteriaID = ?", input.Dish, cafeteriaID).
First(&dish).Error
if errDish != nil || dish == nil {
log.WithError(errDish).Error("Error while creating a new dish rating.")
var dishInMensa *model.Dish
if err := tx.First(&dishInMensa, "name LIKE ? AND cafeteriaID = ?", input.Dish, cafeteriaID).Error; err != nil || dishInMensa == nil {
log.WithError(err).Error("Error while creating a new dishInMensa rating.")
return nil, status.Error(codes.InvalidArgument, "Dish is not offered in this week in this canteen. Rating has not been saved.")
}

resPath := imageWrapper(input.Image, "dishes", dish.Dish)
resPath := imageWrapper(input.Image, "dishes", dishInMensa.Dish)

rating := model.DishRating{
Comment: input.Comment,
CafeteriaID: cafeteriaID,
DishID: dish.Dish,
DishID: dishInMensa.Dish,
Points: input.Points,
Timestamp: time.Now(),
Image: resPath,
}

if err := tx.Model(&model.DishRating{}).Create(&rating).Error; err != nil {
log.WithError(err).Error("while creating a new dish rating.")
if err := tx.Create(&rating).Error; err != nil {
log.WithError(err).Error("while creating a new dishInMensa rating.")
return nil, status.Error(codes.Internal, "Error while creating the new rating in the database. Rating has not been saved.")
}

assignDishNameTag(rating, dish.Dish, tx)
assignDishNameTag(rating, dishInMensa.Dish, tx)

if err := storeRatingTags(rating.DishRating, input.RatingTags, DISH, tx); err != nil {
return &pb.CreateDishRatingReply{}, err
Expand All @@ -496,12 +475,11 @@ func assignDishNameTag(rating model.DishRating, dishID int64, tx *gorm.DB) {
log.WithError(err).Error("while loading the dishID for the given name.")
} else {
for _, tagID := range result {
err := tx.Model(&model.DishNameTag{}).Create(&model.DishNameTag{
if err := tx.Create(&model.DishNameTag{
CorrespondingRating: rating.DishRating,
Points: rating.Points,
TagNameID: tagID,
}).Error
if err != nil {
}).Error; err != nil {
log.WithError(err).Error("while creating a new dish name rating.")
}
}
Expand All @@ -512,7 +490,7 @@ func assignDishNameTag(rating model.DishRating, dishID int64, tx *gorm.DB) {
// Additionally, queries the cafeteria ID, since it checks whether the cafeteria actually exists.
func inputSanitizationForNewRatingElements(rating int32, comment string, cafeteriaName string, tx *gorm.DB) (int64, error) {
if rating > 5 || rating < 0 {
return -1, status.Error(codes.InvalidArgument, "Rating must be a positive number not larger than 10. Rating has not been saved.")
return -1, status.Error(codes.InvalidArgument, "Rating must be a positive number not larger than 5. Rating has not been saved.")
}

if len(comment) > 256 {
Expand All @@ -524,10 +502,7 @@ func inputSanitizationForNewRatingElements(rating int32, comment string, cafeter
}

var result *model.Cafeteria
res := tx.Model(&model.Cafeteria{}).
Where("name LIKE ?", cafeteriaName).
First(&result)
if errors.Is(res.Error, gorm.ErrRecordNotFound) || res.RowsAffected == 0 {
if res := tx.First(&result, "name LIKE ?", cafeteriaName); errors.Is(res.Error, gorm.ErrRecordNotFound) || res.RowsAffected == 0 {
log.WithError(res.Error).Error("Error while querying the cafeteria id by name: ", cafeteriaName)
return -1, status.Error(codes.InvalidArgument, "Cafeteria does not exist. Rating has not been saved.")
}
Expand Down Expand Up @@ -687,8 +662,7 @@ func (s *CampusServer) GetAvailableCafeteriaTags(ctx context.Context, _ *pb.List
func (s *CampusServer) GetCafeterias(ctx context.Context, _ *pb.ListCanteensRequest) (*pb.ListCanteensReply, error) {
var result []*pb.Canteen
var requestStatus error = nil
err := s.db.WithContext(ctx).Model(&model.Cafeteria{}).Select("cafeteria as id,address,latitude,longitude").Scan(&result).Error
if err != nil {
if err := s.db.WithContext(ctx).Model(&model.Cafeteria{}).Select("cafeteria as id,address,latitude,longitude").Scan(&result).Error; err != nil {
log.WithError(err).Error("while loading Cafeterias from database.")
requestStatus = status.Error(codes.Internal, "Cafeterias could not be loaded from the database.")
}
Expand Down
39 changes: 15 additions & 24 deletions server/backend/cron/average_rating_computation.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,10 @@ func computeAverageNameTags(c *CronService) {
if err != nil {
log.WithError(err).Error("while precomputing average name tags.")
} else if len(results) > 0 {
errDelete := c.db.Where("1=1").Delete(&model.DishNameTagAverage{}).Error // Does not work with "true"
if errDelete != nil {
log.WithError(errDelete).Error("Error while deleting old averages in the table.")
if err := c.db.Where("1=1").Delete(&model.DishNameTagAverage{}).Error; err != nil {
log.WithError(err).Error("Error while deleting old averages in the table.")
}
err := c.db.Model(&model.DishNameTagAverage{}).Create(&results).Error
if err != nil {
if err := c.db.Create(&results).Error; err != nil {
log.WithError(err).Error("while creating a new average name tag rating in the database.")
}
}
Expand All @@ -49,13 +47,11 @@ func computeAverageForDishesInCafeteriasTags(c *CronService) {
if err != nil {
log.WithError(err).Error("while precomputing average dish tags.")
} else if len(results) > 0 {
errDelete := c.db.Where("1=1").Delete(&model.DishRatingTagAverage{}).Error
if errDelete != nil {
log.WithError(errDelete).Error("Error while deleting old averages in the table.")
if err := c.db.Where("1=1").Delete(&model.DishRatingTagAverage{}).Error; err != nil {
log.WithError(err).Error("Error while deleting old averages in the table.")
}

err := c.db.Model(&model.DishRatingTagAverage{}).Create(&results).Error
if err != nil {
if err := c.db.Create(&results).Error; err != nil {
log.WithError(err).Error("while creating a new average dish tag rating in the database.")
}

Expand All @@ -72,13 +68,11 @@ func computeAverageCafeteriaTags(c *CronService) {
if err != nil {
log.WithError(err).Error("while precomputing average cafeteria tags.")
} else if len(results) > 0 {
errDelete := c.db.Where("1=1").Delete(&model.CafeteriaRatingTagsAverage{}).Error
if errDelete != nil {
log.WithError(errDelete).Error("Error while deleting old averages in the table.")
if err := c.db.Where("1=1").Delete(&model.CafeteriaRatingTagsAverage{}).Error; err != nil {
log.WithError(err).Error("Error while deleting old averages in the table.")
}

err := c.db.Model(&model.CafeteriaRatingTagsAverage{}).Create(&results).Error
if err != nil {
if err := c.db.Create(&results).Error; err != nil {
log.WithError(err).Error("while creating a new average cafeteria tag rating in the database.")
}
}
Expand All @@ -93,12 +87,10 @@ func computeAverageForDishesInCafeterias(c *CronService) {
if err != nil {
log.WithError(err).Error("while precomputing average dish ratings.")
} else if len(results) > 0 {
errDelete := c.db.Where("1=1").Delete(&model.DishRatingAverage{}).Error
if errDelete != nil {
log.WithError(errDelete).Error("Error while deleting old averages in the table.")
if err := c.db.Where("1=1").Delete(&model.DishRatingAverage{}).Error; err != nil {
log.WithError(err).Error("Error while deleting old averages in the table.")
}
err := c.db.Model(&model.DishRatingAverage{}).Create(&results).Error
if err != nil {
if err := c.db.Create(&results).Error; err != nil {
log.WithError(err).Error("while creating a new average dish rating in the database.")
}
}
Expand All @@ -113,12 +105,11 @@ func computeAverageForCafeteria(c *CronService) {
if err != nil {
log.WithError(err).Error("while precomputing average cafeteria ratings.")
} else if len(results) > 0 {
errDelete := c.db.Where("1=1").Delete(&model.CafeteriaRatingAverage{}).Error
if errDelete != nil {
log.WithError(errDelete).Error("Error while deleting old averages in the table.")
if err := c.db.Where("1=1").Delete(&model.CafeteriaRatingAverage{}).Error; err != nil {
log.WithError(err).Error("Error while deleting old averages in the table.")
}

err := c.db.Model(&model.CafeteriaRatingAverage{}).Create(&results).Error
err := c.db.Create(&results).Error
if err != nil {
log.WithError(err).Error("while creating a new average cafeteria rating in the database.")
}
Expand Down
Loading