mirror of
https://github.com/nagaoo0/HabbitGrid.git
synced 2026-01-11 15:34:54 +00:00
58 lines
1.9 KiB
PL/PgSQL
58 lines
1.9 KiB
PL/PgSQL
-- Create habits table with proper types, defaults, constraints, and RLS
|
|
-- Run this in Supabase SQL editor
|
|
|
|
-- Enable gen_random_uuid()
|
|
create extension if not exists pgcrypto;
|
|
|
|
create table if not exists public.habits (
|
|
id uuid primary key default gen_random_uuid(),
|
|
user_id uuid not null references auth.users(id) on delete cascade,
|
|
name text not null,
|
|
color text,
|
|
category text,
|
|
completions jsonb not null default '[]'::jsonb,
|
|
current_streak integer not null default 0,
|
|
longest_streak integer not null default 0,
|
|
sort_order integer not null default 0,
|
|
created_at timestamptz not null default now(),
|
|
updated_at timestamptz not null default now()
|
|
);
|
|
|
|
-- Useful indexes
|
|
create index if not exists idx_habits_user_id on public.habits(user_id);
|
|
create index if not exists idx_habits_user_sort on public.habits(user_id, sort_order);
|
|
|
|
-- Automatically update updated_at
|
|
create or replace function public.set_updated_at()
|
|
returns trigger language plpgsql as $$
|
|
begin
|
|
new.updated_at = now();
|
|
return new;
|
|
end;
|
|
$$;
|
|
|
|
drop trigger if exists trg_habits_set_updated_at on public.habits;
|
|
create trigger trg_habits_set_updated_at
|
|
before update on public.habits
|
|
for each row execute function public.set_updated_at();
|
|
|
|
-- Row Level Security
|
|
alter table public.habits enable row level security;
|
|
|
|
-- Policies: each user can only access their own rows
|
|
drop policy if exists habits_select on public.habits;
|
|
create policy habits_select on public.habits
|
|
for select using (auth.uid() = user_id);
|
|
|
|
drop policy if exists habits_insert on public.habits;
|
|
create policy habits_insert on public.habits
|
|
for insert with check (auth.uid() = user_id);
|
|
|
|
drop policy if exists habits_update on public.habits;
|
|
create policy habits_update on public.habits
|
|
for update using (auth.uid() = user_id) with check (auth.uid() = user_id);
|
|
|
|
drop policy if exists habits_delete on public.habits;
|
|
create policy habits_delete on public.habits
|
|
for delete using (auth.uid() = user_id);
|