package handlers import ( "context" "database/sql" "encoding/json" "fmt" oapi "nyanimedb/api" sqlc "nyanimedb/sql" log "github.com/sirupsen/logrus" ) func Word2Sqlc(s *string) *string { if s == nil || *s == "" { return nil } return s } func TitleStatus2Sqlc(s *oapi.TitleStatus) (*sqlc.TitleStatusT, error) { if s == nil { return nil, nil } var t sqlc.TitleStatusT switch *s { case oapi.Finished: t = sqlc.TitleStatusTFinished case oapi.Ongoing: t = sqlc.TitleStatusTOngoing case oapi.Planned: t = sqlc.TitleStatusTPlanned default: 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 } var t sqlc.ReleaseSeasonT switch *s { case oapi.Winter: t = sqlc.ReleaseSeasonTWinter case oapi.Spring: t = sqlc.ReleaseSeasonTSpring case oapi.Summer: t = sqlc.ReleaseSeasonTSummer case oapi.Fall: t = sqlc.ReleaseSeasonTFall default: return nil, fmt.Errorf("unexpected release season: %s", *s) } return &t, nil } func (s Server) GetTagsByTitleId(ctx context.Context, id int64) (oapi.Tags, error) { sqlc_title_tags, err := s.db.GetTitleTags(ctx, id) if err != nil { if err == sql.ErrNoRows { return nil, nil } return nil, fmt.Errorf("query GetTitleTags: %v", err) } oapi_tag_names := make(oapi.Tags, 1) for _, title_tag := range sqlc_title_tags { oapi_tag_name := make(map[string]string, 1) err = json.Unmarshal(title_tag, &oapi_tag_name) if err != nil { return nil, fmt.Errorf("unmarshalling title_tag: %v", err) } oapi_tag_names = append(oapi_tag_names, oapi_tag_name) } return oapi_tag_names, nil } func (s Server) GetImage(ctx context.Context, id int64) (*oapi.Image, error) { var oapi_image *oapi.Image sqlc_image, err := s.db.GetImageByID(ctx, id) if err != nil { if err == sql.ErrNoRows { return nil, nil } return oapi_image, fmt.Errorf("query GetImageByID: %v", err) } //can cast and dont use brain cause all this fields required in image table oapi_image.Id = &sqlc_image.ID oapi_image.ImagePath = &sqlc_image.ImagePath storageTypeStr := string(sqlc_image.StorageType) oapi_image.StorageType = &storageTypeStr return oapi_image, nil } func (s Server) GetStudio(ctx context.Context, id int64) (*oapi.Studio, error) { var oapi_studio oapi.Studio sqlc_studio, err := s.db.GetStudioByID(ctx, id) if err != nil { if err == sql.ErrNoRows { return nil, nil } return &oapi_studio, fmt.Errorf("query GetStudioByID: %v", err) } oapi_studio.Id = sqlc_studio.ID oapi_studio.Name = sqlc_studio.StudioName oapi_studio.Description = sqlc_studio.StudioDesc oapi_illust, err := s.GetImage(ctx, *sqlc_studio.IllustID) if err != nil { return &oapi_studio, fmt.Errorf("GetImage: %v", err) } if oapi_illust != nil { oapi_studio.Poster = oapi_illust } return &oapi_studio, nil } func (s Server) mapTitle(ctx context.Context, title sqlc.Title) (oapi.Title, error) { var oapi_title oapi.Title title_names := make(map[string][]string, 1) err := json.Unmarshal(title.TitleNames, &title_names) if err != nil { return oapi_title, fmt.Errorf("unmarshal TitleNames: %v", err) } episodes_lens := make(map[string]float64, 1) err = json.Unmarshal(title.EpisodesLen, &episodes_lens) if err != nil { return oapi_title, fmt.Errorf("unmarshal EpisodesLen: %v", err) } oapi_tag_names, err := s.GetTagsByTitleId(ctx, title.ID) if err != nil { return oapi_title, fmt.Errorf("GetTagsByTitleId: %v", err) } if oapi_tag_names != nil { oapi_title.Tags = oapi_tag_names } oapi_image, err := s.GetImage(ctx, *title.PosterID) if err != nil { return oapi_title, fmt.Errorf("GetImage: %v", err) } if oapi_image != nil { oapi_title.Poster = oapi_image } oapi_studio, err := s.GetStudio(ctx, title.StudioID) if err != nil { return oapi_title, fmt.Errorf("GetStudio: %v", err) } if oapi_studio != nil { oapi_title.Studio = oapi_studio } if title.ReleaseSeason != nil { rs := oapi.ReleaseSeason(*title.ReleaseSeason) oapi_title.ReleaseSeason = &rs } else { oapi_title.ReleaseSeason = nil } ts := oapi.TitleStatus(title.TitleStatus) oapi_title.TitleStatus = &ts oapi_title.Id = title.ID oapi_title.Rating = title.Rating oapi_title.RatingCount = title.RatingCount oapi_title.ReleaseYear = title.ReleaseYear oapi_title.TitleNames = title_names oapi_title.EpisodesAired = title.EpisodesAired oapi_title.EpisodesAll = title.EpisodesAll oapi_title.EpisodesLen = &episodes_lens return oapi_title, nil } func (s Server) GetTitleTitleId(ctx context.Context, request oapi.GetTitleTitleIdRequestObject) (oapi.GetTitleTitleIdResponseObject, error) { var oapi_title oapi.Title sqlc_title, err := s.db.GetTitleByID(ctx, request.TitleId) if err != nil { if err == sql.ErrNoRows { return oapi.GetTitleTitleId204Response{}, nil } log.Errorf("%v", err) return oapi.GetTitleTitleId500Response{}, nil } oapi_title, err = s.mapTitle(ctx, sqlc_title) if err != nil { log.Errorf("%v", err) return oapi.GetTitleTitleId500Response{}, nil } return oapi.GetTitleTitleId200JSONResponse(oapi_title), nil } func (s Server) GetTitle(ctx context.Context, request oapi.GetTitleRequestObject) (oapi.GetTitleResponseObject, error) { opai_titles := make([]oapi.Title, 1) 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, Offset: request.Params.Offset, Limit: request.Params.Limit, }) if err != nil { log.Errorf("%v", err) return oapi.GetTitle500Response{}, nil } if len(titles) == 0 { return oapi.GetTitle204Response{}, nil } for _, title := range titles { t, err := s.mapTitle(ctx, title) if err != nil { log.Errorf("%v", err) return oapi.GetTitle500Response{}, nil } opai_titles = append(opai_titles, t) } return oapi.GetTitle200JSONResponse(opai_titles), nil }