Spaces:
Running
Running
File size: 5,170 Bytes
90b88af | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | -- Phase 1: Additional tables for full feature support
-- Guest sessions tracking
create table if not exists guest_sessions (
id uuid primary key default gen_random_uuid(),
session_id text unique not null,
user_id uuid references profiles(id) on delete set null,
created_at timestamptz default now(),
expires_at timestamptz default (now() + interval '24 hours'),
last_active_at timestamptz default now()
);
-- Pipeline steps log
create table if not exists pipeline_steps (
id uuid primary key default gen_random_uuid(),
job_id uuid references jobs(id) on delete cascade,
step_name text not null,
status text not null default 'queued',
started_at timestamptz,
completed_at timestamptz,
error_message text,
output_json jsonb,
created_at timestamptz default now()
);
-- Raw API response storage
create table if not exists raw_api_responses (
id uuid primary key default gen_random_uuid(),
job_id uuid references jobs(id) on delete cascade,
source text not null,
endpoint text,
response_body text,
response_format text default 'xml',
stored_at timestamptz default now()
);
-- Processed/parsed results
create table if not exists processed_results (
id uuid primary key default gen_random_uuid(),
job_id uuid references jobs(id) on delete cascade,
result_type text not null,
result_data jsonb not null,
created_at timestamptz default now()
);
-- Saved analyses (user bookmarks)
create table if not exists saved_analyses (
id uuid primary key default gen_random_uuid(),
user_id uuid references profiles(id) on delete cascade not null,
job_id uuid references jobs(id) on delete cascade,
title text,
notes text,
created_at timestamptz default now()
);
-- Sequence cache (UniProt/NCBI)
create table if not exists sequence_cache (
id uuid primary key default gen_random_uuid(),
accession text unique not null,
source text not null,
result_json jsonb not null,
cached_at timestamptz default now(),
expires_at timestamptz default (now() + interval '7 days')
);
-- Structure cache
create table if not exists structure_cache (
id uuid primary key default gen_random_uuid(),
pdb_id text,
uniprot_accession text,
source text not null,
result_json jsonb not null,
cached_at timestamptz default now(),
expires_at timestamptz default (now() + interval '30 days')
);
-- Indexes
create index if not exists idx_pipeline_steps_job on pipeline_steps(job_id);
create index if not exists idx_raw_api_job on raw_api_responses(job_id);
create index if not exists idx_processed_results_job on processed_results(job_id);
create index if not exists idx_saved_analyses_user on saved_analyses(user_id);
create index if not exists idx_sequence_cache_acc on sequence_cache(accession);
create index if not exists idx_structure_cache_pdb on structure_cache(pdb_id);
create index if not exists idx_structure_cache_uniprot on structure_cache(uniprot_accession);
create index if not exists idx_guest_sessions_id on guest_sessions(session_id);
-- RLS
alter table pipeline_steps enable row level security;
alter table raw_api_responses enable row level security;
alter table processed_results enable row level security;
alter table saved_analyses enable row level security;
alter table sequence_cache enable row level security;
alter table structure_cache enable row level security;
alter table guest_sessions enable row level security;
-- Policies
create policy "Users can view own pipeline steps" on pipeline_steps for select
using (job_id in (select id from jobs where user_id = auth.uid()));
create policy "Users can view own raw responses" on raw_api_responses for select
using (job_id in (select id from jobs where user_id = auth.uid()));
create policy "Users can view own processed results" on processed_results for select
using (job_id in (select id from jobs where user_id = auth.uid()));
create policy "Users can manage own saved analyses" on saved_analyses for all
using (auth.uid() = user_id)
with check (auth.uid() = user_id);
-- Update profiles with additional columns from schema.md
alter table profiles add column if not exists username text;
alter table profiles add column if not exists display_name text;
alter table profiles add column if not exists avatar_url text;
alter table profiles add column if not exists onboarding_complete boolean default false;
alter table profiles add column if not exists tooltips_enabled boolean default true;
alter table profiles add column if not exists jobs_this_month int default 0;
alter table profiles add column if not exists blast_calls_today int default 0;
alter table profiles add column if not exists quota_reset_at timestamptz;
-- Add title, description columns to jobs for richer display
alter table jobs add column if not exists title text;
alter table jobs add column if not exists description text;
-- Add cleanup function for expired data
create or replace function public.cleanup_expired_data()
returns void as $$
begin
delete from sequence_cache where expires_at < now();
delete from structure_cache where expires_at < now();
delete from guest_sessions where expires_at < now();
end;
$$ language plpgsql security definer;
|