chore: update user setting validator

This commit is contained in:
Steven 2022-08-20 21:51:28 +08:00
parent 3b1bb4a95d
commit c60bb12424
3 changed files with 62 additions and 4 deletions

View File

@ -1,5 +1,10 @@
package api package api
import (
"encoding/json"
"fmt"
)
type UserSettingKey string type UserSettingKey string
const ( const (
@ -20,6 +25,11 @@ func (key UserSettingKey) String() string {
return "" return ""
} }
var (
UserSettingLocaleValue = []string{"en", "zh"}
UserSettingMemoVisibilityValue = []Visibility{Privite, Protected, Public}
)
type UserSetting struct { type UserSetting struct {
UserID int UserID int
Key UserSettingKey `json:"key"` Key UserSettingKey `json:"key"`
@ -33,6 +43,48 @@ type UserSettingUpsert struct {
Value string `json:"value"` Value string `json:"value"`
} }
func (upsert UserSettingUpsert) Validate() error {
if upsert.Key == UserSettingLocaleKey {
var localeValue string
err := json.Unmarshal([]byte(upsert.Value), &localeValue)
if err != nil {
return fmt.Errorf("failed to unmarshal user setting locale value")
}
invalid := true
for _, value := range UserSettingLocaleValue {
if localeValue == value {
invalid = false
break
}
}
if invalid {
return fmt.Errorf("invalid user setting locale value")
}
} else if upsert.Key == UserSettingMemoVisibilityKey {
var memoVisibilityValue Visibility
err := json.Unmarshal([]byte(upsert.Value), &memoVisibilityValue)
if err != nil {
return fmt.Errorf("failed to unmarshal user setting memo visibility value")
}
invalid := true
for _, value := range UserSettingMemoVisibilityValue {
if memoVisibilityValue == value {
invalid = false
break
}
}
if invalid {
return fmt.Errorf("invalid user setting memo visibility value")
}
} else {
return fmt.Errorf("invalid user setting key")
}
return nil
}
type UserSettingFind struct { type UserSettingFind struct {
UserID int UserID int

View File

@ -43,7 +43,10 @@ func (s *Server) registerMemoRoutes(g *echo.Group) {
} }
if userMemoVisibilitySetting != nil { if userMemoVisibilitySetting != nil {
memoVisibility := api.Privite memoVisibility := api.Privite
json.Unmarshal([]byte(userMemoVisibilitySetting.Value), &memoVisibility) err := json.Unmarshal([]byte(userMemoVisibilitySetting.Value), &memoVisibility)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to unmarshal user setting value").SetInternal(err)
}
memoCreate.Visibility = memoVisibility memoCreate.Visibility = memoVisibility
} }

View File

@ -118,9 +118,8 @@ func (s *Server) registerUserRoutes(g *echo.Group) {
if err := json.NewDecoder(c.Request().Body).Decode(userSettingUpsert); err != nil { if err := json.NewDecoder(c.Request().Body).Decode(userSettingUpsert); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Malformatted post user setting upsert request").SetInternal(err) return echo.NewHTTPError(http.StatusBadRequest, "Malformatted post user setting upsert request").SetInternal(err)
} }
if err := userSettingUpsert.Validate(); err != nil {
if userSettingUpsert.Key.String() == "" { return echo.NewHTTPError(http.StatusBadRequest, "Invalid user setting format").SetInternal(err)
return echo.NewHTTPError(http.StatusBadRequest, "Invalid user setting key")
} }
userSettingUpsert.UserID = userID userSettingUpsert.UserID = userID
@ -191,6 +190,10 @@ func (s *Server) registerUserRoutes(g *echo.Group) {
return echo.NewHTTPError(http.StatusBadRequest, "Malformatted patch user request").SetInternal(err) return echo.NewHTTPError(http.StatusBadRequest, "Malformatted patch user request").SetInternal(err)
} }
if userPatch.Email != nil && !common.ValidateEmail(*userPatch.Email) {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid email format")
}
if userPatch.Password != nil && *userPatch.Password != "" { if userPatch.Password != nil && *userPatch.Password != "" {
passwordHash, err := bcrypt.GenerateFromPassword([]byte(*userPatch.Password), bcrypt.DefaultCost) passwordHash, err := bcrypt.GenerateFromPassword([]byte(*userPatch.Password), bcrypt.DefaultCost)
if err != nil { if err != nil {