package handlers import ( "context" "encoding/json" "fmt" oapi "nyanimedb/api" sqlc "nyanimedb/sql" log "github.com/sirupsen/logrus" ) func Word2Sqlc(s *string) *string { if s == nil { return nil } if *s == "" { return nil } return s } func TitleStatus2Sqlc(s *oapi.TitleStatus) (*sqlc.TitleStatusT, error) { if s == nil { return nil, nil } var t sqlc.TitleStatusT if *s == "finished" { t = "finished" } else if *s == "ongoing" { t = "ongoing" } else if *s == "planned" { t = "planned" } else { return nil, fmt.Errorf("unexpected tittle status: %s", *s) } return &t, nil } func ReleaseSeason2sqlc(s *oapi.ReleaseSeason) (*sqlc.ReleaseSeasonT, error) { if s == nil { return nil, nil } //TODO var t sqlc.ReleaseSeasonT if *s == oapi.Winter { t = sqlc.ReleaseSeasonTWinter } else if *s == "spring" { t = "spring" } else if *s == "summer" { t = "summer" } else if *s == "fall" { t = "fall" } else { return nil, fmt.Errorf("unexpected release season: %s", *s) } return &t, nil } // unmarshall jsonb to map[string][]string func jsonb2map4names(b []byte) (*map[string][]string, error) { var t map[string][]string if err := json.Unmarshal(b, &t); err != nil { return nil, fmt.Errorf("invalid title_names JSON for title: %w", err) } return &t, nil } func jsonb2map4len(b []byte) (*map[string]float64, error) { var t map[string]float64 if err := json.Unmarshal(b, &t); err != nil { return nil, fmt.Errorf("invalid episodes_len JSON for title: %w", err) } return &t, nil } func (s Server) GetTitle(ctx context.Context, request oapi.GetTitleRequestObject) (oapi.GetTitleResponseObject, error) { var result []oapi.Title word := Word2Sqlc(request.Params.Word) status, err := TitleStatus2Sqlc(request.Params.Status) if err != nil { log.Errorf("%v", err) return oapi.GetTitle400Response{}, err } season, err := ReleaseSeason2sqlc(request.Params.ReleaseSeason) if err != nil { log.Errorf("%v", err) return oapi.GetTitle400Response{}, err } // param = nil means it will not be used titles, err := s.db.SearchTitles(ctx, sqlc.SearchTitlesParams{ Word: word, Status: status, Rating: request.Params.Rating, ReleaseYear: request.Params.ReleaseYear, ReleaseSeason: season, }) if err != nil { return oapi.GetTitle500Response{}, nil } if len(titles) == 0 { return oapi.GetTitle204Response{}, nil } for _, title := range titles { title_names, err := jsonb2map4names(title.TitleNames) if err != nil { log.Errorf("%v", err) return oapi.GetTitle500Response{}, err } episodes_lens, err := jsonb2map4len(title.EpisodesLen) if err != nil { log.Errorf("%v", err) return oapi.GetTitle500Response{}, err } t := oapi.Title{ Id: &title.ID, PosterId: title.PosterID, Rating: title.Rating, RatingCount: title.RatingCount, ReleaseSeason: (*oapi.ReleaseSeason)(title.ReleaseSeason), ReleaseYear: title.ReleaseYear, StudioId: &title.StudioID, TitleNames: title_names, TitleStatus: (*oapi.TitleStatus)(&title.TitleStatus), EpisodesAired: title.EpisodesAired, EpisodesAll: title.EpisodesAll, EpisodesLen: episodes_lens, } result = append(result, t) } return oapi.GetTitle200JSONResponse(result), nil }