From d0d0d0cdc4218f1f944481a5116c74d81682deff Mon Sep 17 00:00:00 2001 From: Vidhu Kant Sharma Date: Tue, 15 Aug 2023 13:37:22 +0530 Subject: added validators for read-only endpoints --- validators.go | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) (limited to 'validators.go') diff --git a/validators.go b/validators.go index 206585b..2dafaad 100644 --- a/validators.go +++ b/validators.go @@ -16,3 +16,279 @@ */ package mg + +import ( + "strings" + "slices" +) + +func validateAnimeFields(fields *[]string) error { + // if no fields given, set all + if cap(*fields) == 0 { + *fields = DefaultAnimeFields + return nil + } + + // check if given fields exist in DefaultAnimeFields + for _, f := range *fields { + if !slices.Contains(DefaultAnimeFields, f) { + return ErrInvalidField + } + } + + return nil +} + +func validateAnimeRankingType(t string) error { + if !slices.Contains([]string{ + RankingTypeAll, + RankingTypeByPopularity, + RankingTypeFavorite, + RankingTypeAiring, + RankingTypeUpcoming, + RankingTypeTV, + RankingTypeOVA, + RankingTypeMovie, + RankingTypeSpecial, + }, t) { + return ErrInvalidRankingType + } + + return nil +} + +func validateAnimeListSort(s string) error { + if !slices.Contains([]string{ + SortByListScore, + SortByListUpdatedAt, + SortByAnimeTitle, + SortByAnimeStartDate, + SortByAnimeId, + }, s) { + return ErrInvalidSort + } + + return nil +} + +func validateAnimeListStatus(s string) error { + if !slices.Contains([]string{ + ListStatusCompleted, + ListStatusOnHold, + ListStatusDropped, + ListStatusWatching, + ListStatusPTW, + }, s) { + return ErrInvalidStatus + } + + return nil +} + +func validateAnimeSeason(s string) error { + if !slices.Contains([]string{ + SeasonWinter, + SeasonSpring, + SeasonSummer, + SeasonFall, + }, s) { + return ErrInvalidSeason + } + + return nil +} + +func validateAnimeSeasonSort(s string) error { + if !slices.Contains([]string{ + SeasonSortByAnimeScore, + SeasonSortByNumListUsers, + }, s) { + return ErrInvalidSort + } + + return nil +} + +func validateMangaFields(fields *[]string) error { + // if no fields given, set all + if cap(*fields) == 0 { + *fields = DefaultMangaFields + return nil + } + + // check if given fields exist in DefaultAnimeFields + for _, f := range *fields { + if !slices.Contains(DefaultMangaFields, f) { + return ErrInvalidField + } + } + + return nil +} + +func validateMangaRankingType(t string) error { + if !slices.Contains([]string{ + RankingTypeAll, + RankingTypeByPopularity, + RankingTypeFavorite, + RankingTypeManga, + RankingTypeNovel, + RankingTypeOneShot, + RankingTypeDoujin, + RankingTypeManhwa, + RankingTypeManhua, + }, t) { + return ErrInvalidRankingType + } + + return nil +} + +func validateMangaListSort(s string) error { + if !slices.Contains([]string{ + SortByListScore, + SortByListUpdatedAt, + SortByMangaTitle, + SortByMangaStartDate, + SortByMangaId, + }, s) { + return ErrInvalidSort + } + + return nil +} + +func validateMangaListStatus(s string) error { + if !slices.Contains([]string{ + ListStatusCompleted, + ListStatusOnHold, + ListStatusDropped, + ListStatusReading, + ListStatusPTR, + }, s) { + return ErrInvalidStatus + } + + return nil +} + +func validateScore(score int) error { + if score >= 0 && score <= 10 { + return nil + } + + return ErrInvalidScore +} + +func validatePriority(priority int) error { + if priority >= 0 && priority <= 2 { + return nil + } + + return ErrInvalidPriority +} + +func validateRewatchValue(val int) error { + if val >= 0 && val <= 5 { + return nil + } + + return ErrInvalidRewatchValue +} + +func validateRereadValue(val int) error { + if val >= 0 && val <= 5 { + return nil + } + + return ErrInvalidRereadValue +} + +func validateAnimeSearchParams(params *SearchParams) error { + if strings.TrimSpace(params.SearchString) == "" { + return ErrEmptySearchString + } + + if params.Limit > 100 || params.Limit < 1 { + return ErrLimitOutOfRange + } + + err := validateAnimeFields(¶ms.Fields) + + return err +} + +func validateAnimeRankingParams(params *RankingParams) error { + err := validateAnimeRankingType(params.RankingType) + if err != nil { + return err + } + + if params.Limit > 500 || params.Limit < 1 { + return ErrLimitOutOfRange + } + + err = validateAnimeFields(¶ms.Fields) + + return err +} + +func validateSeasonalParams(params *SeasonalParams) error { + // check if year is int + + err := validateAnimeSeason(params.Season) + if err != nil { + return err + } + + err = validateAnimeSeasonSort(params.Sort) + if err != nil { + return err + } + + if params.Limit > 500 || params.Limit < 1 { + return ErrLimitOutOfRange + } + + err = validateMangaFields(¶ms.Fields) + + return err +} + +func validateSuggestedParams(params *SuggestedParams) error { + if params.Limit > 100 || params.Limit < 1 { + return ErrLimitOutOfRange + } + + return validateAnimeFields(¶ms.Fields) +} + +func validateMangaSearchParams(params *SearchParams) error { + if strings.TrimSpace(params.SearchString) == "" { + return ErrEmptySearchString + } + + if params.Limit > 100 || params.Limit < 1 { + return ErrLimitOutOfRange + } + + err := validateMangaFields(¶ms.Fields) + + return err +} + + +func validateMangaRankingParams(params *RankingParams) error { + err := validateMangaRankingType(params.RankingType) + if err != nil { + return err + } + + if params.Limit > 500 || params.Limit < 1 { + return ErrLimitOutOfRange + } + + err = validateMangaFields(¶ms.Fields) + + return err +} -- cgit v1.2.3