48 lines
1.0 KiB
SQL
48 lines
1.0 KiB
SQL
-- name: UpsertRating :one
|
|
INSERT INTO ratings (user_id, target_type, target_id, stars, review)
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
ON CONFLICT (user_id, target_type, target_id)
|
|
DO UPDATE SET stars = EXCLUDED.stars, review = EXCLUDED.review, updated_at = NOW()
|
|
RETURNING *;
|
|
|
|
|
|
-- name: GetRatingByUserAndTarget :one
|
|
SELECT *
|
|
FROM ratings
|
|
WHERE user_id = $1 AND target_type = $2 AND target_id = $3;
|
|
|
|
|
|
-- name: GetRatingsByTarget :many
|
|
SELECT *
|
|
FROM ratings
|
|
WHERE target_type = $1 AND target_id = $2
|
|
ORDER BY created_at DESC
|
|
LIMIT sqlc.narg('limit')::INT
|
|
OFFSET sqlc.narg('offset')::INT;
|
|
|
|
|
|
-- name: GetRatingSummary :one
|
|
SELECT
|
|
COUNT(*)::BIGINT AS total_count,
|
|
COALESCE(AVG(stars), 0)::FLOAT AS average_stars
|
|
FROM ratings
|
|
WHERE target_type = $1 AND target_id = $2;
|
|
|
|
|
|
-- name: GetUserRatings :many
|
|
SELECT *
|
|
FROM ratings
|
|
WHERE user_id = $1
|
|
ORDER BY updated_at DESC;
|
|
|
|
|
|
-- name: DeleteRating :exec
|
|
DELETE FROM ratings
|
|
WHERE id = $1 AND user_id = $2;
|
|
|
|
|
|
-- name: CountRatingsByTarget :one
|
|
SELECT COUNT(*)::BIGINT
|
|
FROM ratings
|
|
WHERE target_type = $1 AND target_id = $2;
|