41 lines
1.8 KiB
SQL
41 lines
1.8 KiB
SQL
/*
|
|
* -------------------------------------------------------
|
|
* Shared Communications Table for Courses, Events, Bookings
|
|
* Tracks email, phone, letter, meeting, note, sms entries
|
|
* -------------------------------------------------------
|
|
*/
|
|
|
|
CREATE TABLE IF NOT EXISTS public.module_communications (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
account_id uuid NOT NULL REFERENCES public.accounts(id) ON DELETE CASCADE,
|
|
module text NOT NULL CHECK (module IN ('courses', 'events', 'bookings')),
|
|
entity_id uuid NOT NULL,
|
|
type text NOT NULL DEFAULT 'note' CHECK (type IN ('email', 'phone', 'letter', 'meeting', 'note', 'sms')),
|
|
direction text NOT NULL DEFAULT 'internal' CHECK (direction IN ('inbound', 'outbound', 'internal')),
|
|
subject text,
|
|
body text,
|
|
email_to text,
|
|
email_cc text,
|
|
attachment_paths text[],
|
|
created_by uuid REFERENCES auth.users(id) ON DELETE SET NULL,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS ix_module_communications_entity
|
|
ON public.module_communications(module, entity_id, created_at DESC);
|
|
|
|
CREATE INDEX IF NOT EXISTS ix_module_communications_account
|
|
ON public.module_communications(account_id, module, created_at DESC);
|
|
|
|
ALTER TABLE public.module_communications ENABLE ROW LEVEL SECURITY;
|
|
REVOKE ALL ON public.module_communications FROM authenticated, service_role;
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON public.module_communications TO authenticated;
|
|
GRANT ALL ON public.module_communications TO service_role;
|
|
|
|
CREATE POLICY module_communications_select ON public.module_communications
|
|
FOR SELECT TO authenticated USING (public.has_role_on_account(account_id));
|
|
|
|
CREATE POLICY module_communications_mutate ON public.module_communications
|
|
FOR ALL TO authenticated USING (public.has_role_on_account(account_id))
|
|
WITH CHECK (public.has_role_on_account(account_id));
|