File size: 6,895 Bytes
a51a15b |
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Create devices table first
CREATE TABLE public.devices (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
account_id UUID NOT NULL,
name TEXT,
last_seen TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
is_online BOOLEAN DEFAULT FALSE,
CONSTRAINT fk_account FOREIGN KEY (account_id) REFERENCES basejump.accounts(id) ON DELETE CASCADE
);
-- Create recordings table
CREATE TABLE public.recordings (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
account_id UUID NOT NULL,
device_id UUID NOT NULL,
preprocessed_file_path TEXT,
meta JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
name TEXT,
ui_annotated BOOLEAN DEFAULT FALSE,
a11y_file_path TEXT,
audio_file_path TEXT,
action_annotated BOOLEAN DEFAULT FALSE,
raw_data_file_path TEXT,
metadata_file_path TEXT,
action_training_file_path TEXT,
CONSTRAINT fk_account FOREIGN KEY (account_id) REFERENCES basejump.accounts(id) ON DELETE CASCADE,
CONSTRAINT fk_device FOREIGN KEY (device_id) REFERENCES public.devices(id) ON DELETE CASCADE
);
-- Create indexes for foreign keys
CREATE INDEX idx_recordings_account_id ON public.recordings(account_id);
CREATE INDEX idx_recordings_device_id ON public.recordings(device_id);
CREATE INDEX idx_devices_account_id ON public.devices(account_id);
-- Add RLS policies (optional, can be customized as needed)
ALTER TABLE public.recordings ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.devices ENABLE ROW LEVEL SECURITY;
-- Create RLS policies for devices
CREATE POLICY "Account members can delete their own devices"
ON public.devices FOR DELETE
USING (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can insert their own devices"
ON public.devices FOR INSERT
WITH CHECK (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can only access their own devices"
ON public.devices FOR ALL
USING (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can update their own devices"
ON public.devices FOR UPDATE
USING (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can view their own devices"
ON public.devices FOR SELECT
USING (basejump.has_role_on_account(account_id));
-- Create RLS policies for recordings
CREATE POLICY "Account members can delete their own recordings"
ON public.recordings FOR DELETE
USING (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can insert their own recordings"
ON public.recordings FOR INSERT
WITH CHECK (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can only access their own recordings"
ON public.recordings FOR ALL
USING (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can update their own recordings"
ON public.recordings FOR UPDATE
USING (basejump.has_role_on_account(account_id));
CREATE POLICY "Account members can view their own recordings"
ON public.recordings FOR SELECT
USING (basejump.has_role_on_account(account_id));
-- Note: For threads and messages, you might want different RLS policies
-- depending on your application's requirements
-- Also drop the old function signature
DROP FUNCTION IF EXISTS transfer_device(UUID, UUID, TEXT);
CREATE OR REPLACE FUNCTION transfer_device(
device_id UUID, -- Parameter remains UUID
new_account_id UUID, -- Changed parameter name and implies new ownership target
device_name TEXT DEFAULT NULL
)
RETURNS SETOF devices AS $$
DECLARE
device_exists BOOLEAN;
updated_device devices;
BEGIN
-- Check if a device with the specified UUID exists
SELECT EXISTS (
SELECT 1 FROM devices WHERE id = device_id
) INTO device_exists;
IF device_exists THEN
-- Device exists: update its account ownership and last_seen timestamp
UPDATE devices
SET
account_id = new_account_id, -- Update account_id instead of user_id
name = COALESCE(device_name, name),
last_seen = NOW()
WHERE id = device_id
RETURNING * INTO updated_device;
RETURN NEXT updated_device;
ELSE
-- Device doesn't exist; return nothing so the caller can handle creation
RETURN;
END IF;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- Grant execute permission so that authenticated users can call this function
-- Updated function signature
GRANT EXECUTE ON FUNCTION transfer_device(UUID, UUID, TEXT) TO authenticated;
-- Create the ui_grounding bucket
INSERT INTO storage.buckets (id, name, public)
VALUES ('ui_grounding', 'ui_grounding', false)
ON CONFLICT (id) DO NOTHING; -- Avoid error if bucket already exists
-- Create the ui_grounding_trajs bucket
INSERT INTO storage.buckets (id, name, public)
VALUES ('ui_grounding_trajs', 'ui_grounding_trajs', false)
ON CONFLICT (id) DO NOTHING; -- Avoid error if bucket already exists
-- Create the recordings bucket
INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types)
VALUES ('recordings', 'recordings', false, null, null) -- Set file size limit and mime types as needed
ON CONFLICT (id) DO NOTHING; -- Avoid error if bucket already exists
-- RLS policies for the 'recordings' bucket
-- Allow members to view files in accounts they belong to
CREATE POLICY "Account members can select recording files"
ON storage.objects FOR SELECT
TO authenticated
USING (
bucket_id = 'recordings' AND
(storage.foldername(name))[1]::uuid IN (SELECT basejump.get_accounts_with_role())
);
-- Allow members to insert files into accounts they belong to
CREATE POLICY "Account members can insert recording files"
ON storage.objects FOR INSERT
TO authenticated
WITH CHECK (
bucket_id = 'recordings' AND
(storage.foldername(name))[1]::uuid IN (SELECT basejump.get_accounts_with_role())
);
-- Allow members to update files in accounts they belong to
CREATE POLICY "Account members can update recording files"
ON storage.objects FOR UPDATE
TO authenticated
USING (
bucket_id = 'recordings' AND
(storage.foldername(name))[1]::uuid IN (SELECT basejump.get_accounts_with_role())
);
-- Allow members to delete files from accounts they belong to
-- Consider restricting this further, e.g., to 'owner' role if needed:
-- (storage.foldername(name))[1]::uuid IN (SELECT basejump.get_accounts_with_role('owner'))
CREATE POLICY "Account members can delete recording files"
ON storage.objects FOR DELETE
TO authenticated
USING (
bucket_id = 'recordings' AND
(storage.foldername(name))[1]::uuid IN (SELECT basejump.get_accounts_with_role())
);
|