package user import ( "clickandjoin.app/storageserver/modules/image" "clickandjoin.app/storageserver/modules/scylladb" "clickandjoin.app/storageserver/modules/structs" "clickandjoin.app/storageserver/modules/utils" "github.com/gofiber/fiber/v2" "github.com/google/uuid" "github.com/sirupsen/logrus" ) func GetAvatar(c *fiber.Ctx) error { userId := c.Params("userId") if len(userId) != structs.LenUserId { logrus.Debugln("UserId is longer than allowed") return c.SendStatus(fiber.StatusBadRequest) } fileName := c.Params("fileName") // check if the filename length has not been manipulated by the user if len(fileName) > image.MaxFileNameLen { logrus.Debugln("Filename is longer than allowed") return c.SendStatus(fiber.StatusBadRequest) } // image resolution size := c.Query("size") img, err := image.GetImage(userId, fileName, size) if err != nil { return c.SendStatus(fiber.StatusBadRequest) } c.Context().SetContentType("image/webp") return c.Send(img) } func UpdateAvatar(c *fiber.Ctx) error { xAuthorization := utils.GetAuhorizationToken(c) if len(xAuthorization) != structs.LenXAuthorizationToken { return c.SendStatus(fiber.StatusUnauthorized) } foundSession := structs.UserSession{Id: xAuthorization} q := scylladb.Session.Query(scylladb.Sessions.Get("user_id")).BindStruct(foundSession) if err := q.GetRelease(&foundSession); err != nil { logrus.Errorln("Failed to get user session, err:", err) return c.SendStatus(fiber.StatusInternalServerError) } file, err := c.FormFile(image.FormFileKey) if err != nil { logrus.Errorln("Failed to get form file, err:", err) return c.SendStatus(fiber.StatusBadRequest) } if file.Size > image.MaxAvatarSize { return c.SendStatus(fiber.StatusRequestEntityTooLarge) } if valid := image.FileTypeVerification(file.Header.Get("Content-Type")); !valid { return c.SendStatus(fiber.StatusUnsupportedMediaType) } if err = image.DeleteOldAvatarImage(foundSession.UserId); err != nil { return c.SendStatus(fiber.StatusInternalServerError) } fileName := uuid.New().String() err = image.SaveImage( file, foundSession.UserId, utils.GetUserStoragePath(foundSession.UserId)+fileName, image.ImageSizes[image.DefaultImageSize], image.ImageSizes[image.DefaultImageSize], 40) if err != nil { return c.SendStatus(fiber.StatusBadRequest) } avatarUrl := utils.GetUserAvatarUrl(foundSession.UserId, fileName) user := structs.User{Id: foundSession.UserId, AvatarUrl: avatarUrl} q = scylladb.Session.Query(scylladb.Users.Update("avatar_url")).BindStruct(user) if err := q.ExecRelease(); err != nil { logrus.Errorln("Failed to update user avatar url, err:", err) return c.SendStatus(fiber.StatusInternalServerError) } return c.Status(fiber.StatusOK).JSON(structs.UpdateUserAvatarResponse{AvatarUrl: avatarUrl}) }