From e550d3d71360c4da68c7f9e978ef45f05e68b216 Mon Sep 17 00:00:00 2001 From: Vidhu Kant Sharma Date: Sat, 5 Feb 2022 22:15:48 +0530 Subject: implemented function for get suggested anime endpoint --- anime/anime.go | 58 +++++++++++++++++++++++++++++++++++------ anime/suggestedanime.structs.go | 31 ++++++++++++++++++++++ 2 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 anime/suggestedanime.structs.go diff --git a/anime/anime.go b/anime/anime.go index 6c65138..3344016 100644 --- a/anime/anime.go +++ b/anime/anime.go @@ -20,7 +20,6 @@ import ( "encoding/json" "errors" "fmt" - "log" "strconv" ) @@ -33,13 +32,13 @@ func SearchAnime(token, searchString string, limit, offset int, fields []string) // error handling for limit and offset limitsErr := limitsErrHandler(limit, offset) if limitsErr != nil { - log.Println(limitsErr) + return searchResults, limitsErr } // handle all the errors for the fields fields, err := fieldsErrHandler(fields) if err != nil { - log.Println(err) + return searchResults, err } // generate endpoint url with custom params @@ -77,7 +76,7 @@ func GetAnimeById(token string, animeId int, fields []string) (Anime, error) { // handle all the errors for the fields fields, err := fieldsErrHandler(fields) if err != nil { - log.Println(err) + return anime, err } endpoint, _ := urlGenerator( @@ -103,13 +102,13 @@ func GetAnimeRanking(token string, rankingType string, limit, offset int, fields // error handling for limit and offset limitsErr := limitsErrHandler(limit, offset) if limitsErr != nil { - log.Println(limitsErr) + return animeRanking, limitsErr } // handle all the errors for the fields fields, err := fieldsErrHandler(fields) if err != nil { - log.Println(err) + return animeRanking, err } // if ranking type is invalid @@ -160,13 +159,13 @@ func GetSeasonalAnime(token, year, season, sort string, limit, offset int, field // error handling for limit and offset limitsErr := limitsErrHandler(limit, offset) if limitsErr != nil { - log.Println(limitsErr) + return seasonalAnime, limitsErr } // handle all the errors for the fields fields, err := fieldsErrHandler(fields) if err != nil { - log.Println(err) + return seasonalAnime, err } // checks if valid season is specified @@ -206,3 +205,46 @@ func GetSeasonalAnime(token, year, season, sort string, limit, offset int, field return seasonalAnime, nil } + +// get anime suggestions for the user +func GetSuggestedAnime(token string, limit, offset int, fields []string) (SuggestedAnime, error){ + var suggestedAnime SuggestedAnime + + // error handling for limit and offset + limitsErr := limitsErrHandler(limit, offset) + if limitsErr != nil { + return suggestedAnime, limitsErr + } + + // handle all the errors for the fields + fields, err := fieldsErrHandler(fields) + if err != nil { + return suggestedAnime, err + } + + endpoint, _ := urlGenerator( + BASE_URL + "/suggestions", + []string{"limit", "offset", "fields"}, + [][]string{{strconv.Itoa(limit)}, {strconv.Itoa(offset)}, fields}, + true, + ) + + // gets data from API and stores it in a struct + var suggestedAnimeData SuggestedAnimeRaw + data := requestHandler(token, endpoint) + json.Unmarshal([]byte(data), &suggestedAnimeData) + + // Adding all the animes to another list to get formatted results later + var animes []Anime + for _, element := range suggestedAnimeData.Data { + animes = append(animes, element.Anime) + } + + // finally generate RecommendedAnime struct + suggestedAnime = SuggestedAnime { + Animes: animes, + Paging: suggestedAnimeData.Paging, + } + + return suggestedAnime, nil +} diff --git a/anime/suggestedanime.structs.go b/anime/suggestedanime.structs.go new file mode 100644 index 0000000..a7b3a60 --- /dev/null +++ b/anime/suggestedanime.structs.go @@ -0,0 +1,31 @@ +/* mal2go - MyAnimeList V2 API wrapper for Go + * Copyright (C) 2022 Vidhu Kant Sharma + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + +package anime + +// this is how the API returns data (looks horrible) +type SuggestedAnimeRaw struct { + Data []struct { + Anime Anime `json:"node"` + } `json:"data"` + Paging ListPaging `json:"paging"` +} + +// this is how mal2go returns data +type SuggestedAnime struct { + Animes []Anime + Paging ListPaging +} -- cgit v1.2.3