- POST /api/v1/reviews (one per chat_id, UNIQUE) - GET /api/v1/users/:id/reviews (public list) - GET /api/v1/users/:id/stats (rating_avg, count) - migration 0004: reviews (rating 1-5, anonymous flag), user_stats aggregate - only chat participants can review; reviewed_id is other party
24 lines
1.2 KiB
SQL
24 lines
1.2 KiB
SQL
-- Отзывы и рейтинги после встречи
|
|
CREATE TABLE IF NOT EXISTS reviews (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
reviewer_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
reviewed_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
chat_id UUID NOT NULL REFERENCES chats(id) ON DELETE CASCADE,
|
|
rating SMALLINT NOT NULL CHECK (rating >= 1 AND rating <= 5),
|
|
body TEXT,
|
|
anonymous BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE (reviewer_id, chat_id), -- один отзыв на чат
|
|
CHECK (reviewer_id <> reviewed_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_reviews_reviewed ON reviews(reviewed_id, created_at DESC);
|
|
|
|
-- Агрегаты (можно считать по reviews но удобнее держать)
|
|
CREATE TABLE IF NOT EXISTS user_stats (
|
|
user_id UUID PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
|
|
rating_avg NUMERIC(3,2) NOT NULL DEFAULT 0,
|
|
rating_count INTEGER NOT NULL DEFAULT 0,
|
|
reviews_left INTEGER NOT NULL DEFAULT 0,
|
|
last_active_at TIMESTAMPTZ DEFAULT NOW()
|
|
); |