Skip to main content

feedback

Overview

The feedback table stores user-submitted feedback about the platform. Each entry includes the feedback text, a category, and browser context information (URL, user agent, viewport size) to help developers reproduce and understand issues.

Schema

-- From 20260206_feedback_table.sql
CREATE TABLE feedback (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL,
category TEXT DEFAULT 'general',
content TEXT NOT NULL,
page_url TEXT,
user_agent TEXT,
viewport_width INTEGER,
viewport_height INTEGER,
status TEXT DEFAULT 'new' CHECK (status IN ('new', 'reviewed', 'resolved', 'wontfix')),
admin_notes TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);

Columns

ColumnTypeNullableDefaultDescription
iduuidNogen_random_uuid()Primary key
user_iduuidYes--User who submitted (null if deleted)
categorytextNo'general'Feedback category
contenttextNo--Feedback text
page_urltextYes--URL where feedback was submitted
user_agenttextYes--Browser user agent
viewport_widthintegerYes--Browser viewport width
viewport_heightintegerYes--Browser viewport height
statustextNo'new'Review status: new, reviewed, resolved, wontfix
admin_notestextYes--Admin notes on the feedback
created_attimestamptzNoNOW()Submission timestamp

RLS Policies

-- SELECT: Users can view their own feedback; admins can view all
CREATE POLICY "Users can view own feedback"
ON feedback FOR SELECT
USING (
auth.uid() = user_id OR
EXISTS (SELECT 1 FROM admin_roles WHERE admin_roles.user_id = auth.uid())
);

-- INSERT: Authenticated users can submit feedback
CREATE POLICY "Users can submit feedback"
ON feedback FOR INSERT
WITH CHECK (auth.uid() = user_id);

-- UPDATE: Admins can update feedback status
CREATE POLICY "Admins can update feedback"
ON feedback FOR UPDATE
USING (EXISTS (SELECT 1 FROM admin_roles WHERE admin_roles.user_id = auth.uid()));

Last updated: 2026-02-07