// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.30.0 // source: queries.sql package sqlc import ( "context" "encoding/json" "time" "github.com/jackc/pgx/v5/pgtype" ) const createImage = `-- name: CreateImage :one INSERT INTO images (storage_type, image_path) VALUES ($1, $2) RETURNING id, storage_type, image_path ` type CreateImageParams struct { StorageType StorageTypeT `json:"storage_type"` ImagePath string `json:"image_path"` } func (q *Queries) CreateImage(ctx context.Context, arg CreateImageParams) (Image, error) { row := q.db.QueryRow(ctx, createImage, arg.StorageType, arg.ImagePath) var i Image err := row.Scan(&i.ID, &i.StorageType, &i.ImagePath) return i, err } const getImageByID = `-- name: GetImageByID :one SELECT id, storage_type, image_path FROM images WHERE id = $1::bigint ` func (q *Queries) GetImageByID(ctx context.Context, illustID int64) (Image, error) { row := q.db.QueryRow(ctx, getImageByID, illustID) var i Image err := row.Scan(&i.ID, &i.StorageType, &i.ImagePath) return i, err } const getReviewByID = `-- name: GetReviewByID :one SELECT id, data, rating, user_id, title_id, created_at FROM reviews WHERE review_id = $1::bigint ` // 100 is default limit // -- name: ListTitles :many // SELECT title_id, title_names, studio_id, poster_id, signal_ids, // // title_status, rating, rating_count, release_year, release_season, // season, episodes_aired, episodes_all, episodes_len // // FROM titles // ORDER BY title_id // LIMIT $1 OFFSET $2; // -- name: UpdateTitle :one // UPDATE titles // SET // // title_names = COALESCE(sqlc.narg('title_names'), title_names), // studio_id = COALESCE(sqlc.narg('studio_id'), studio_id), // poster_id = COALESCE(sqlc.narg('poster_id'), poster_id), // signal_ids = COALESCE(sqlc.narg('signal_ids'), signal_ids), // title_status = COALESCE(sqlc.narg('title_status'), title_status), // release_year = COALESCE(sqlc.narg('release_year'), release_year), // release_season = COALESCE(sqlc.narg('release_season'), release_season), // episodes_aired = COALESCE(sqlc.narg('episodes_aired'), episodes_aired), // episodes_all = COALESCE(sqlc.narg('episodes_all'), episodes_all), // episodes_len = COALESCE(sqlc.narg('episodes_len'), episodes_len) // // WHERE title_id = sqlc.arg('title_id') // RETURNING *; func (q *Queries) GetReviewByID(ctx context.Context, reviewID int64) (Review, error) { row := q.db.QueryRow(ctx, getReviewByID, reviewID) var i Review err := row.Scan( &i.ID, &i.Data, &i.Rating, &i.UserID, &i.TitleID, &i.CreatedAt, ) return i, err } const getStudioByID = `-- name: GetStudioByID :one SELECT id, studio_name, illust_id, studio_desc FROM studios WHERE id = $1::bigint ` func (q *Queries) GetStudioByID(ctx context.Context, studioID int64) (Studio, error) { row := q.db.QueryRow(ctx, getStudioByID, studioID) var i Studio err := row.Scan( &i.ID, &i.StudioName, &i.IllustID, &i.StudioDesc, ) return i, err } const getTitleByID = `-- name: GetTitleByID :one 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, 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 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 t.id = $1::bigint GROUP BY t.id, i.id, s.id, si.id ` type GetTitleByIDRow 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"` } // -- name: DeleteUser :exec // DELETE FROM users // WHERE user_id = $1; // sqlc.struct: TitlesFull func (q *Queries) GetTitleByID(ctx context.Context, titleID int64) (GetTitleByIDRow, error) { row := q.db.QueryRow(ctx, getTitleByID, titleID) var i GetTitleByIDRow err := row.Scan( &i.ID, &i.TitleNames, &i.StudioID, &i.PosterID, &i.TitleStatus, &i.Rating, &i.RatingCount, &i.ReleaseYear, &i.ReleaseSeason, &i.Season, &i.EpisodesAired, &i.EpisodesAll, &i.EpisodesLen, &i.TitleStorageType, &i.TitleImagePath, &i.TagNames, &i.StudioName, &i.StudioIllustID, &i.StudioDesc, &i.StudioStorageType, &i.StudioImagePath, ) return i, err } const getTitleTags = `-- name: GetTitleTags :many SELECT tag_names FROM tags as g JOIN title_tags as t ON(t.tag_id = g.id) WHERE t.title_id = $1::bigint ` func (q *Queries) GetTitleTags(ctx context.Context, titleID int64) ([]json.RawMessage, error) { rows, err := q.db.Query(ctx, getTitleTags, titleID) if err != nil { return nil, err } defer rows.Close() items := []json.RawMessage{} for rows.Next() { var tag_names json.RawMessage if err := rows.Scan(&tag_names); err != nil { return nil, err } items = append(items, tag_names) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const getUserByID = `-- name: GetUserByID :one SELECT id, avatar_id, mail, nickname, disp_name, user_desc, creation_date FROM users WHERE id = $1 ` type GetUserByIDRow struct { ID int64 `json:"id"` AvatarID *int64 `json:"avatar_id"` Mail *string `json:"mail"` Nickname string `json:"nickname"` DispName *string `json:"disp_name"` UserDesc *string `json:"user_desc"` CreationDate time.Time `json:"creation_date"` } func (q *Queries) GetUserByID(ctx context.Context, id int64) (GetUserByIDRow, error) { row := q.db.QueryRow(ctx, getUserByID, id) var i GetUserByIDRow err := row.Scan( &i.ID, &i.AvatarID, &i.Mail, &i.Nickname, &i.DispName, &i.UserDesc, &i.CreationDate, ) return i, err } const insertStudio = `-- name: InsertStudio :one INSERT INTO studios (studio_name, illust_id, studio_desc) VALUES ( $1::text, $2::bigint, $3::text) RETURNING id, studio_name, illust_id, studio_desc ` type InsertStudioParams struct { StudioName string `json:"studio_name"` IllustID *int64 `json:"illust_id"` StudioDesc *string `json:"studio_desc"` } func (q *Queries) InsertStudio(ctx context.Context, arg InsertStudioParams) (Studio, error) { row := q.db.QueryRow(ctx, insertStudio, arg.StudioName, arg.IllustID, arg.StudioDesc) var i Studio err := row.Scan( &i.ID, &i.StudioName, &i.IllustID, &i.StudioDesc, ) return i, err } const insertTag = `-- name: InsertTag :one INSERT INTO tags (tag_names) VALUES ( $1::jsonb) RETURNING id, tag_names ` func (q *Queries) InsertTag(ctx context.Context, tagNames json.RawMessage) (Tag, error) { row := q.db.QueryRow(ctx, insertTag, tagNames) var i Tag err := row.Scan(&i.ID, &i.TagNames) return i, err } const insertTitleTags = `-- name: InsertTitleTags :one INSERT INTO title_tags (title_id, tag_id) VALUES ( $1::bigint, $2::bigint) RETURNING title_id, tag_id ` type InsertTitleTagsParams struct { TitleID int64 `json:"title_id"` TagID int64 `json:"tag_id"` } func (q *Queries) InsertTitleTags(ctx context.Context, arg InsertTitleTagsParams) (TitleTag, error) { row := q.db.QueryRow(ctx, insertTitleTags, arg.TitleID, arg.TagID) var i TitleTag err := row.Scan(&i.TitleID, &i.TagID) return i, err } const searchTitles = `-- name: SearchTitles :many SELECT 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 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) WHERE CASE WHEN $1::boolean THEN -- forward: greater than cursor (next page) CASE $2::text WHEN 'year' THEN ($3::int IS NULL) OR (t.release_year > $3::int) OR (t.release_year = $3::int AND t.id > $4::bigint) WHEN 'rating' THEN ($5::float IS NULL) OR (t.rating > $5::float) OR (t.rating = $5::float AND t.id > $4::bigint) WHEN 'id' THEN ($4::bigint IS NULL) OR (t.id > $4::bigint) ELSE true -- fallback END ELSE -- backward: less than cursor (prev page) CASE $2::text WHEN 'year' THEN ($3::int IS NULL) OR (t.release_year < $3::int) OR (t.release_year = $3::int AND t.id < $4::bigint) WHEN 'rating' THEN ($5::float IS NULL) OR (t.rating < $5::float) OR (t.rating = $5::float AND t.id < $4::bigint) WHEN 'id' THEN ($4::bigint IS NULL) OR (t.id < $4::bigint) ELSE true END END AND ( CASE WHEN $6::text IS NOT NULL THEN ( SELECT bool_and( EXISTS ( SELECT 1 FROM jsonb_each_text(t.title_names) AS t(key, val) WHERE val ILIKE pattern ) ) FROM unnest( ARRAY( SELECT '%' || trim(w) || '%' FROM unnest(string_to_array($6::text, ' ')) AS w WHERE trim(w) <> '' ) ) AS pattern ) ELSE true END ) AND ( $7::title_status_t[] IS NULL OR array_length($7::title_status_t[], 1) IS NULL OR array_length($7::title_status_t[], 1) = 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) GROUP BY t.id, i.id, s.id ORDER BY CASE WHEN $1::boolean THEN CASE WHEN $2::text = 'id' THEN t.id WHEN $2::text = 'year' THEN t.release_year WHEN $2::text = 'rating' THEN t.rating END END ASC, CASE WHEN NOT $1::boolean THEN CASE WHEN $2::text = 'id' THEN t.id WHEN $2::text = 'year' THEN t.release_year WHEN $2::text = 'rating' THEN t.rating END END DESC, CASE WHEN $2::text <> 'id' THEN t.id END ASC LIMIT COALESCE($11::int, 100) ` type SearchTitlesParams 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"` Rating *float64 `json:"rating"` ReleaseYear *int32 `json:"release_year"` ReleaseSeason *ReleaseSeasonT `json:"release_season"` Limit *int32 `json:"limit"` } type SearchTitlesRow struct { 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) { rows, err := q.db.Query(ctx, searchTitles, arg.Forward, arg.SortBy, arg.CursorYear, arg.CursorID, arg.CursorRating, arg.Word, arg.TitleStatuses, arg.Rating, arg.ReleaseYear, arg.ReleaseSeason, arg.Limit, ) if err != nil { return nil, err } defer rows.Close() items := []SearchTitlesRow{} for rows.Next() { var i SearchTitlesRow if err := rows.Scan( &i.ID, &i.TitleNames, &i.PosterID, &i.TitleStatus, &i.Rating, &i.RatingCount, &i.ReleaseYear, &i.ReleaseSeason, &i.Season, &i.EpisodesAired, &i.EpisodesAll, &i.TitleStorageType, &i.TitleImagePath, &i.TagNames, &i.StudioName, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const searchUserTitles = `-- name: SearchUserTitles :many SELECT 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, u.review_id as review_id, u.ctime as user_ctime, 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 FROM usertitles as u 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) WHERE CASE WHEN $1::boolean THEN -- forward: greater than cursor (next page) CASE $2::text WHEN 'year' THEN ($3::int IS NULL) OR (t.release_year > $3::int) OR (t.release_year = $3::int AND t.id > $4::bigint) WHEN 'rating' THEN ($5::float IS NULL) OR (t.rating > $5::float) OR (t.rating = $5::float AND t.id > $4::bigint) WHEN 'id' THEN ($4::bigint IS NULL) OR (t.id > $4::bigint) ELSE true -- fallback END ELSE -- backward: less than cursor (prev page) CASE $2::text WHEN 'year' THEN ($3::int IS NULL) OR (t.release_year < $3::int) OR (t.release_year = $3::int AND t.id < $4::bigint) WHEN 'rating' THEN ($5::float IS NULL) OR (t.rating < $5::float) OR (t.rating = $5::float AND t.id < $4::bigint) WHEN 'id' THEN ($4::bigint IS NULL) OR (t.id < $4::bigint) ELSE true END END AND ( CASE WHEN $6::text IS NOT NULL THEN ( SELECT bool_and( EXISTS ( SELECT 1 FROM jsonb_each_text(t.title_names) AS t(key, val) WHERE val ILIKE pattern ) ) FROM unnest( ARRAY( SELECT '%' || trim(w) || '%' FROM unnest(string_to_array($6::text, ' ')) AS w WHERE trim(w) <> '' ) ) AS pattern ) ELSE true END ) AND ( $7::title_status_t[] IS NULL OR array_length($7::title_status_t[], 1) IS NULL OR array_length($7::title_status_t[], 1) = 0 OR t.title_status = ANY($7::title_status_t[]) ) AND ( $8::usertitle_status_t[] IS NULL OR array_length($8::usertitle_status_t[], 1) IS NULL OR array_length($8::usertitle_status_t[], 1) = 0 OR t.title_status = ANY($8::usertitle_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) GROUP BY t.id, i.id, s.id ORDER BY CASE WHEN $1::boolean THEN CASE WHEN $2::text = 'id' THEN t.id WHEN $2::text = 'year' THEN t.release_year WHEN $2::text = 'rating' THEN t.rating WHEN $2::text = 'rate' THEN u.rate END END ASC, CASE WHEN NOT $1::boolean THEN CASE WHEN $2::text = 'id' THEN t.id WHEN $2::text = 'year' THEN t.release_year WHEN $2::text = 'rating' THEN t.rating WHEN $2::text = 'rate' THEN u.rate END END DESC, CASE WHEN $2::text <> 'id' THEN t.id END ASC 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"` 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"` } type SearchUserTitlesRow struct { 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 func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesParams) ([]SearchUserTitlesRow, error) { rows, err := q.db.Query(ctx, searchUserTitles, arg.Forward, arg.SortBy, arg.CursorYear, arg.CursorID, arg.CursorRating, arg.Word, arg.TitleStatuses, arg.UsertitleStatuses, arg.Rate, arg.Rating, arg.ReleaseYear, arg.ReleaseSeason, arg.Limit, ) if err != nil { return nil, err } defer rows.Close() items := []SearchUserTitlesRow{} for rows.Next() { var i SearchUserTitlesRow if err := rows.Scan( &i.ID, &i.TitleNames, &i.PosterID, &i.TitleStatus, &i.Rating, &i.RatingCount, &i.ReleaseYear, &i.ReleaseSeason, &i.Season, &i.EpisodesAired, &i.EpisodesAll, &i.UserID, &i.UsertitleStatus, &i.UserRate, &i.ReviewID, &i.UserCtime, &i.TitleStorageType, &i.TitleImagePath, &i.TagNames, &i.StudioName, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const updateUser = `-- name: UpdateUser :one UPDATE users SET avatar_id = COALESCE($1, avatar_id), disp_name = COALESCE($2, disp_name), user_desc = COALESCE($3, user_desc), mail = COALESCE($4, mail) WHERE id = $5 RETURNING id, avatar_id, nickname, disp_name, user_desc, creation_date, mail ` type UpdateUserParams struct { AvatarID *int64 `json:"avatar_id"` DispName *string `json:"disp_name"` UserDesc *string `json:"user_desc"` Mail *string `json:"mail"` UserID int64 `json:"user_id"` } type UpdateUserRow struct { ID int64 `json:"id"` AvatarID *int64 `json:"avatar_id"` Nickname string `json:"nickname"` DispName *string `json:"disp_name"` UserDesc *string `json:"user_desc"` CreationDate time.Time `json:"creation_date"` Mail *string `json:"mail"` } // -- name: ListUsers :many // SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date // FROM users // ORDER BY user_id // LIMIT $1 OFFSET $2; // -- name: CreateUser :one // INSERT INTO users (avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date) // VALUES ($1, $2, $3, $4, $5, $6, $7) // RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date; func (q *Queries) UpdateUser(ctx context.Context, arg UpdateUserParams) (UpdateUserRow, error) { row := q.db.QueryRow(ctx, updateUser, arg.AvatarID, arg.DispName, arg.UserDesc, arg.Mail, arg.UserID, ) var i UpdateUserRow err := row.Scan( &i.ID, &i.AvatarID, &i.Nickname, &i.DispName, &i.UserDesc, &i.CreationDate, &i.Mail, ) return i, err }