feat: GetUsertitles implemented
This commit is contained in:
parent
cbbc2c179d
commit
e792d5780b
8 changed files with 456 additions and 283 deletions
|
|
@ -342,25 +342,30 @@ func (q *Queries) InsertTitleTags(ctx context.Context, arg InsertTitleTagsParams
|
|||
|
||||
const searchTitles = `-- name: SearchTitles :many
|
||||
SELECT
|
||||
t.id, t.title_names, t.studio_id, t.poster_id, t.title_status, t.rating, t.rating_count, t.release_year, t.release_season, t.season, t.episodes_aired, t.episodes_all, t.episodes_len,
|
||||
t.id as id,
|
||||
t.title_names as title_names,
|
||||
t.poster_id as poster_id,
|
||||
t.title_status as title_status,
|
||||
t.rating as rating,
|
||||
t.rating_count as rating_count,
|
||||
t.release_year as release_year,
|
||||
t.release_season as release_season,
|
||||
t.season as season,
|
||||
t.episodes_aired as episodes_aired,
|
||||
t.episodes_all as episodes_all,
|
||||
i.storage_type::text as title_storage_type,
|
||||
i.image_path as title_image_path,
|
||||
COALESCE(
|
||||
jsonb_agg(g.tag_names) FILTER (WHERE g.tag_names IS NOT NULL),
|
||||
'[]'::jsonb
|
||||
)::jsonb as tag_names,
|
||||
s.studio_name as studio_name,
|
||||
s.illust_id as studio_illust_id,
|
||||
s.studio_desc as studio_desc,
|
||||
si.storage_type::text as studio_storage_type,
|
||||
si.image_path as studio_image_path
|
||||
s.studio_name as studio_name
|
||||
|
||||
FROM titles as t
|
||||
LEFT JOIN images as i ON (t.poster_id = i.id)
|
||||
LEFT JOIN title_tags as tt ON (t.id = tt.title_id)
|
||||
LEFT JOIN tags as g ON (tt.tag_id = g.id)
|
||||
LEFT JOIN studios as s ON (t.studio_id = s.id)
|
||||
LEFT JOIN images as si ON (s.illust_id = si.id)
|
||||
|
||||
WHERE
|
||||
CASE
|
||||
|
|
@ -440,7 +445,7 @@ WHERE
|
|||
AND ($10::release_season_t IS NULL OR t.release_season = $10::release_season_t)
|
||||
|
||||
GROUP BY
|
||||
t.id, i.id, s.id, si.id
|
||||
t.id, i.id, s.id
|
||||
|
||||
ORDER BY
|
||||
CASE WHEN $1::boolean THEN
|
||||
|
|
@ -478,27 +483,21 @@ type SearchTitlesParams struct {
|
|||
}
|
||||
|
||||
type SearchTitlesRow struct {
|
||||
ID int64 `json:"id"`
|
||||
TitleNames json.RawMessage `json:"title_names"`
|
||||
StudioID int64 `json:"studio_id"`
|
||||
PosterID *int64 `json:"poster_id"`
|
||||
TitleStatus TitleStatusT `json:"title_status"`
|
||||
Rating *float64 `json:"rating"`
|
||||
RatingCount *int32 `json:"rating_count"`
|
||||
ReleaseYear *int32 `json:"release_year"`
|
||||
ReleaseSeason *ReleaseSeasonT `json:"release_season"`
|
||||
Season *int32 `json:"season"`
|
||||
EpisodesAired *int32 `json:"episodes_aired"`
|
||||
EpisodesAll *int32 `json:"episodes_all"`
|
||||
EpisodesLen []byte `json:"episodes_len"`
|
||||
TitleStorageType string `json:"title_storage_type"`
|
||||
TitleImagePath *string `json:"title_image_path"`
|
||||
TagNames json.RawMessage `json:"tag_names"`
|
||||
StudioName *string `json:"studio_name"`
|
||||
StudioIllustID *int64 `json:"studio_illust_id"`
|
||||
StudioDesc *string `json:"studio_desc"`
|
||||
StudioStorageType string `json:"studio_storage_type"`
|
||||
StudioImagePath *string `json:"studio_image_path"`
|
||||
ID int64 `json:"id"`
|
||||
TitleNames json.RawMessage `json:"title_names"`
|
||||
PosterID *int64 `json:"poster_id"`
|
||||
TitleStatus TitleStatusT `json:"title_status"`
|
||||
Rating *float64 `json:"rating"`
|
||||
RatingCount *int32 `json:"rating_count"`
|
||||
ReleaseYear *int32 `json:"release_year"`
|
||||
ReleaseSeason *ReleaseSeasonT `json:"release_season"`
|
||||
Season *int32 `json:"season"`
|
||||
EpisodesAired *int32 `json:"episodes_aired"`
|
||||
EpisodesAll *int32 `json:"episodes_all"`
|
||||
TitleStorageType string `json:"title_storage_type"`
|
||||
TitleImagePath *string `json:"title_image_path"`
|
||||
TagNames json.RawMessage `json:"tag_names"`
|
||||
StudioName *string `json:"studio_name"`
|
||||
}
|
||||
|
||||
func (q *Queries) SearchTitles(ctx context.Context, arg SearchTitlesParams) ([]SearchTitlesRow, error) {
|
||||
|
|
@ -525,7 +524,6 @@ func (q *Queries) SearchTitles(ctx context.Context, arg SearchTitlesParams) ([]S
|
|||
if err := rows.Scan(
|
||||
&i.ID,
|
||||
&i.TitleNames,
|
||||
&i.StudioID,
|
||||
&i.PosterID,
|
||||
&i.TitleStatus,
|
||||
&i.Rating,
|
||||
|
|
@ -535,15 +533,10 @@ func (q *Queries) SearchTitles(ctx context.Context, arg SearchTitlesParams) ([]S
|
|||
&i.Season,
|
||||
&i.EpisodesAired,
|
||||
&i.EpisodesAll,
|
||||
&i.EpisodesLen,
|
||||
&i.TitleStorageType,
|
||||
&i.TitleImagePath,
|
||||
&i.TagNames,
|
||||
&i.StudioName,
|
||||
&i.StudioIllustID,
|
||||
&i.StudioDesc,
|
||||
&i.StudioStorageType,
|
||||
&i.StudioImagePath,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -558,7 +551,17 @@ func (q *Queries) SearchTitles(ctx context.Context, arg SearchTitlesParams) ([]S
|
|||
const searchUserTitles = `-- name: SearchUserTitles :many
|
||||
|
||||
SELECT
|
||||
t.id, t.title_names, t.studio_id, t.poster_id, t.title_status, t.rating, t.rating_count, t.release_year, t.release_season, t.season, t.episodes_aired, t.episodes_all, t.episodes_len,
|
||||
t.id as id,
|
||||
t.title_names as title_names,
|
||||
t.poster_id as poster_id,
|
||||
t.title_status as title_status,
|
||||
t.rating as rating,
|
||||
t.rating_count as rating_count,
|
||||
t.release_year as release_year,
|
||||
t.release_season as release_season,
|
||||
t.season as season,
|
||||
t.episodes_aired as episodes_aired,
|
||||
t.episodes_all as episodes_all,
|
||||
u.user_id as user_id,
|
||||
u.status as usertitle_status,
|
||||
u.rate as user_rate,
|
||||
|
|
@ -566,20 +569,18 @@ SELECT
|
|||
u.ctime as user_ctime,
|
||||
i.storage_type::text as title_storage_type,
|
||||
i.image_path as title_image_path,
|
||||
jsonb_agg(g.tag_name)'[]'::jsonb as tag_names,
|
||||
s.studio_name as studio_name,
|
||||
s.illust_id as studio_illust_id,
|
||||
s.studio_desc as studio_desc,
|
||||
si.storage_type::text as studio_storage_type,
|
||||
si.image_path as studio_image_path
|
||||
COALESCE(
|
||||
jsonb_agg(g.tag_names) FILTER (WHERE g.tag_names IS NOT NULL),
|
||||
'[]'::jsonb
|
||||
)::jsonb as tag_names,
|
||||
s.studio_name as studio_name
|
||||
|
||||
FROM usertitles as u
|
||||
LEFT JOIN titles as t ON (u.title_id = t.id)
|
||||
JOIN titles as t ON (u.title_id = t.id)
|
||||
LEFT JOIN images as i ON (t.poster_id = i.id)
|
||||
LEFT JOIN title_tags as tt ON (t.id = tt.title_id)
|
||||
LEFT JOIN tags as g ON (tt.tag_id = g.id)
|
||||
LEFT JOIN studios as s ON (t.studio_id = s.id)
|
||||
LEFT JOIN images as si ON (s.illust_id = si.id)
|
||||
|
||||
WHERE
|
||||
CASE
|
||||
|
|
@ -647,15 +648,24 @@ WHERE
|
|||
END
|
||||
)
|
||||
|
||||
AND (u.status::text IN ($7::text, $8::text, $9::text, $10::text))
|
||||
AND (t.title_status::text IN ($7::text, $11::text, $8::text))
|
||||
AND ($12::int IS NULL OR u.rate >= $12::int)
|
||||
AND ($13::float IS NULL OR t.rating >= $13::float)
|
||||
AND ($14::int IS NULL OR t.release_year = $14::int)
|
||||
AND ($15::release_season_t IS NULL OR t.release_season = $15::release_season_t)
|
||||
AND (
|
||||
-- Если массив пуст (NULL или []) — не фильтруем
|
||||
cardinality($7::text[]) = 0
|
||||
OR
|
||||
t.title_status = ANY($7::text[])
|
||||
)
|
||||
AND (
|
||||
cardinality($8::text[]) = 0
|
||||
OR
|
||||
u.status = ANY($8::text[])
|
||||
)
|
||||
AND ($9::int IS NULL OR u.rate >= $9::int)
|
||||
AND ($10::float IS NULL OR t.rating >= $10::float)
|
||||
AND ($11::int IS NULL OR t.release_year = $11::int)
|
||||
AND ($12::release_season_t IS NULL OR t.release_season = $12::release_season_t)
|
||||
|
||||
GROUP BY
|
||||
t.id, i.id, s.id, si.id
|
||||
t.id, i.id, s.id
|
||||
|
||||
ORDER BY
|
||||
CASE WHEN $1::boolean THEN
|
||||
|
|
@ -677,55 +687,46 @@ ORDER BY
|
|||
|
||||
CASE WHEN $2::text <> 'id' THEN t.id END ASC
|
||||
|
||||
LIMIT COALESCE($16::int, 100)
|
||||
LIMIT COALESCE($13::int, 100)
|
||||
`
|
||||
|
||||
type SearchUserTitlesParams struct {
|
||||
Forward bool `json:"forward"`
|
||||
SortBy string `json:"sort_by"`
|
||||
CursorYear *int32 `json:"cursor_year"`
|
||||
CursorID *int64 `json:"cursor_id"`
|
||||
CursorRating *float64 `json:"cursor_rating"`
|
||||
Word *string `json:"word"`
|
||||
Ongoing string `json:"ongoing"`
|
||||
Planned string `json:"planned"`
|
||||
Dropped string `json:"dropped"`
|
||||
InProgress string `json:"in-progress"`
|
||||
Finished string `json:"finished"`
|
||||
Rate *int32 `json:"rate"`
|
||||
Rating *float64 `json:"rating"`
|
||||
ReleaseYear *int32 `json:"release_year"`
|
||||
ReleaseSeason *ReleaseSeasonT `json:"release_season"`
|
||||
Limit *int32 `json:"limit"`
|
||||
Forward bool `json:"forward"`
|
||||
SortBy string `json:"sort_by"`
|
||||
CursorYear *int32 `json:"cursor_year"`
|
||||
CursorID *int64 `json:"cursor_id"`
|
||||
CursorRating *float64 `json:"cursor_rating"`
|
||||
Word *string `json:"word"`
|
||||
TitleStatuses []string `json:"title_statuses"`
|
||||
UsertitleStatuses []string `json:"usertitle_statuses"`
|
||||
Rate *int32 `json:"rate"`
|
||||
Rating *float64 `json:"rating"`
|
||||
ReleaseYear *int32 `json:"release_year"`
|
||||
ReleaseSeason *ReleaseSeasonT `json:"release_season"`
|
||||
Limit *int32 `json:"limit"`
|
||||
}
|
||||
|
||||
type SearchUserTitlesRow struct {
|
||||
ID *int64 `json:"id"`
|
||||
TitleNames []byte `json:"title_names"`
|
||||
StudioID *int64 `json:"studio_id"`
|
||||
PosterID *int64 `json:"poster_id"`
|
||||
TitleStatus *TitleStatusT `json:"title_status"`
|
||||
Rating *float64 `json:"rating"`
|
||||
RatingCount *int32 `json:"rating_count"`
|
||||
ReleaseYear *int32 `json:"release_year"`
|
||||
ReleaseSeason *ReleaseSeasonT `json:"release_season"`
|
||||
Season *int32 `json:"season"`
|
||||
EpisodesAired *int32 `json:"episodes_aired"`
|
||||
EpisodesAll *int32 `json:"episodes_all"`
|
||||
EpisodesLen []byte `json:"episodes_len"`
|
||||
UserID int64 `json:"user_id"`
|
||||
UsertitleStatus UsertitleStatusT `json:"usertitle_status"`
|
||||
UserRate *int32 `json:"user_rate"`
|
||||
ReviewID *int64 `json:"review_id"`
|
||||
UserCtime pgtype.Timestamptz `json:"user_ctime"`
|
||||
TitleStorageType string `json:"title_storage_type"`
|
||||
TitleImagePath *string `json:"title_image_path"`
|
||||
TagNames json.RawMessage `json:"tag_names"`
|
||||
StudioName *string `json:"studio_name"`
|
||||
StudioIllustID *int64 `json:"studio_illust_id"`
|
||||
StudioDesc *string `json:"studio_desc"`
|
||||
StudioStorageType string `json:"studio_storage_type"`
|
||||
StudioImagePath *string `json:"studio_image_path"`
|
||||
ID int64 `json:"id"`
|
||||
TitleNames json.RawMessage `json:"title_names"`
|
||||
PosterID *int64 `json:"poster_id"`
|
||||
TitleStatus TitleStatusT `json:"title_status"`
|
||||
Rating *float64 `json:"rating"`
|
||||
RatingCount *int32 `json:"rating_count"`
|
||||
ReleaseYear *int32 `json:"release_year"`
|
||||
ReleaseSeason *ReleaseSeasonT `json:"release_season"`
|
||||
Season *int32 `json:"season"`
|
||||
EpisodesAired *int32 `json:"episodes_aired"`
|
||||
EpisodesAll *int32 `json:"episodes_all"`
|
||||
UserID int64 `json:"user_id"`
|
||||
UsertitleStatus UsertitleStatusT `json:"usertitle_status"`
|
||||
UserRate *int32 `json:"user_rate"`
|
||||
ReviewID *int64 `json:"review_id"`
|
||||
UserCtime pgtype.Timestamptz `json:"user_ctime"`
|
||||
TitleStorageType string `json:"title_storage_type"`
|
||||
TitleImagePath *string `json:"title_image_path"`
|
||||
TagNames json.RawMessage `json:"tag_names"`
|
||||
StudioName *string `json:"studio_name"`
|
||||
}
|
||||
|
||||
// 100 is default limit
|
||||
|
|
@ -737,11 +738,8 @@ func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesPara
|
|||
arg.CursorID,
|
||||
arg.CursorRating,
|
||||
arg.Word,
|
||||
arg.Ongoing,
|
||||
arg.Planned,
|
||||
arg.Dropped,
|
||||
arg.InProgress,
|
||||
arg.Finished,
|
||||
arg.TitleStatuses,
|
||||
arg.UsertitleStatuses,
|
||||
arg.Rate,
|
||||
arg.Rating,
|
||||
arg.ReleaseYear,
|
||||
|
|
@ -758,7 +756,6 @@ func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesPara
|
|||
if err := rows.Scan(
|
||||
&i.ID,
|
||||
&i.TitleNames,
|
||||
&i.StudioID,
|
||||
&i.PosterID,
|
||||
&i.TitleStatus,
|
||||
&i.Rating,
|
||||
|
|
@ -768,7 +765,6 @@ func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesPara
|
|||
&i.Season,
|
||||
&i.EpisodesAired,
|
||||
&i.EpisodesAll,
|
||||
&i.EpisodesLen,
|
||||
&i.UserID,
|
||||
&i.UsertitleStatus,
|
||||
&i.UserRate,
|
||||
|
|
@ -778,10 +774,6 @@ func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesPara
|
|||
&i.TitleImagePath,
|
||||
&i.TagNames,
|
||||
&i.StudioName,
|
||||
&i.StudioIllustID,
|
||||
&i.StudioDesc,
|
||||
&i.StudioStorageType,
|
||||
&i.StudioImagePath,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue