diff --git a/modules/backend/handlers/common.go b/modules/backend/handlers/common.go index dc3a4ba..e22ce3f 100644 --- a/modules/backend/handlers/common.go +++ b/modules/backend/handlers/common.go @@ -65,6 +65,7 @@ func (s Server) mapTitle(ctx context.Context, title sqlc.GetTitleByIDRow) (oapi. oapi_studio.Id = title.StudioID oapi_studio.Description = title.StudioDesc if title.StudioIllustID != nil { + oapi_studio.Poster = &oapi.Image{} oapi_studio.Poster.Id = title.StudioIllustID oapi_studio.Poster.ImagePath = title.StudioImagePath oapi_studio.Poster.StorageType = &title.StudioStorageType diff --git a/modules/backend/queries.sql b/modules/backend/queries.sql index 1d5cc45..d064660 100644 --- a/modules/backend/queries.sql +++ b/modules/backend/queries.sql @@ -193,12 +193,11 @@ WHERE ) AND ( - -- Если массив пуст (NULL или []) — не фильтруем - cardinality(sqlc.arg('title_statuses')::title_status_t[]) = 0 - OR - -- Иначе: статус есть в списке - t.title_status = ANY(sqlc.arg('title_statuses')::title_status_t[]) -) + 'title_statuses'::title_status_t[] IS NULL + OR array_length('title_statuses'::title_status_t[], 1) IS NULL + OR array_length('title_statuses'::title_status_t[], 1) = 0 + OR t.title_status = ANY('title_statuses'::title_status_t[]) + ) AND (sqlc.narg('rating')::float IS NULL OR t.rating >= sqlc.narg('rating')::float) AND (sqlc.narg('release_year')::int IS NULL OR t.release_year = sqlc.narg('release_year')::int) AND (sqlc.narg('release_season')::release_season_t IS NULL OR t.release_season = sqlc.narg('release_season')::release_season_t) @@ -326,15 +325,16 @@ WHERE ) AND ( - -- Если массив пуст (NULL или []) — не фильтруем - cardinality(sqlc.arg('title_statuses')::title_status_t[]) = 0 - OR - t.title_status = ANY(sqlc.arg('title_statuses')::title_status_t[]) + 'title_statuses'::title_status_t[] IS NULL + OR array_length('title_statuses'::title_status_t[], 1) IS NULL + OR array_length('title_statuses'::title_status_t[], 1) = 0 + OR t.title_status = ANY('title_statuses'::title_status_t[]) ) AND ( - cardinality(sqlc.arg('usertitle_statuses')::usertitle_status_t[]) = 0 - OR - u.status = ANY(sqlc.arg('usertitle_statuses')::usertitle_status_t[]) + 'usertitle_statuses'::title_status_t[] IS NULL + OR array_length('usertitle_statuses'::title_status_t[], 1) IS NULL + OR array_length('usertitle_statuses'::title_status_t[], 1) = 0 + OR t.title_status = ANY('usertitle_statuses'::title_status_t[]) ) AND (sqlc.narg('rate')::int IS NULL OR u.rate >= sqlc.narg('rate')::int) AND (sqlc.narg('rating')::float IS NULL OR t.rating >= sqlc.narg('rating')::float) diff --git a/sql/queries.sql.go b/sql/queries.sql.go index daa2875..daa2b56 100644 --- a/sql/queries.sql.go +++ b/sql/queries.sql.go @@ -434,15 +434,14 @@ WHERE ) AND ( - -- Если массив пуст (NULL или []) — не фильтруем - cardinality($7::title_status_t[]) = 0 - OR - -- Иначе: статус есть в списке - t.title_status = ANY($7::title_status_t[]) -) - AND ($8::float IS NULL OR t.rating >= $8::float) - AND ($9::int IS NULL OR t.release_year = $9::int) - AND ($10::release_season_t IS NULL OR t.release_season = $10::release_season_t) + 'title_statuses'::title_status_t[] IS NULL + OR array_length('title_statuses'::title_status_t[], 1) IS NULL + OR array_length('title_statuses'::title_status_t[], 1) = 0 + OR t.title_status = ANY('title_statuses'::title_status_t[]) + ) + AND ($7::float IS NULL OR t.rating >= $7::float) + AND ($8::int IS NULL OR t.release_year = $8::int) + AND ($9::release_season_t IS NULL OR t.release_season = $9::release_season_t) GROUP BY t.id, i.id, s.id @@ -465,7 +464,7 @@ ORDER BY CASE WHEN $2::text <> 'id' THEN t.id END ASC -LIMIT COALESCE($11::int, 100) +LIMIT COALESCE($10::int, 100) ` type SearchTitlesParams struct { @@ -475,7 +474,6 @@ type SearchTitlesParams struct { CursorID *int64 `json:"cursor_id"` CursorRating *float64 `json:"cursor_rating"` Word *string `json:"word"` - TitleStatuses []TitleStatusT `json:"title_statuses"` Rating *float64 `json:"rating"` ReleaseYear *int32 `json:"release_year"` ReleaseSeason *ReleaseSeasonT `json:"release_season"` @@ -508,7 +506,6 @@ func (q *Queries) SearchTitles(ctx context.Context, arg SearchTitlesParams) ([]S arg.CursorID, arg.CursorRating, arg.Word, - arg.TitleStatuses, arg.Rating, arg.ReleaseYear, arg.ReleaseSeason, @@ -649,20 +646,21 @@ WHERE ) AND ( - -- Если массив пуст (NULL или []) — не фильтруем - cardinality($7::title_status_t[]) = 0 - OR - t.title_status = ANY($7::title_status_t[]) + 'title_statuses'::title_status_t[] IS NULL + OR array_length('title_statuses'::title_status_t[], 1) IS NULL + OR array_length('title_statuses'::title_status_t[], 1) = 0 + OR t.title_status = ANY('title_statuses'::title_status_t[]) ) AND ( - cardinality($8::usertitle_status_t[]) = 0 - OR - u.status = ANY($8::usertitle_status_t[]) + 'usertitle_statuses'::title_status_t[] IS NULL + OR array_length('usertitle_statuses'::title_status_t[], 1) IS NULL + OR array_length('usertitle_statuses'::title_status_t[], 1) = 0 + OR t.title_status = ANY('usertitle_statuses'::title_status_t[]) ) - 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) + AND ($7::int IS NULL OR u.rate >= $7::int) + AND ($8::float IS NULL OR t.rating >= $8::float) + AND ($9::int IS NULL OR t.release_year = $9::int) + AND ($10::release_season_t IS NULL OR t.release_season = $10::release_season_t) GROUP BY t.id, i.id, s.id @@ -687,23 +685,21 @@ ORDER BY CASE WHEN $2::text <> 'id' THEN t.id END ASC -LIMIT COALESCE($13::int, 100) +LIMIT COALESCE($11::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"` - TitleStatuses []TitleStatusT `json:"title_statuses"` - UsertitleStatuses []UsertitleStatusT `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"` + 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"` + 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 { @@ -738,8 +734,6 @@ func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesPara arg.CursorID, arg.CursorRating, arg.Word, - arg.TitleStatuses, - arg.UsertitleStatuses, arg.Rate, arg.Rating, arg.ReleaseYear,