diff --git a/attached_assets/Pasted--WARNING-This-schema-is-for-context-only-and-is-not-mea_1765838402288.txt b/attached_assets/Pasted--WARNING-This-schema-is-for-context-only-and-is-not-mea_1765838402288.txt new file mode 100644 index 0000000..74538bc --- /dev/null +++ b/attached_assets/Pasted--WARNING-This-schema-is-for-context-only-and-is-not-mea_1765838402288.txt @@ -0,0 +1,4291 @@ +-- WARNING: This schema is for context only and is not meant to be run. +-- Table order and constraints may not be valid for execution. + +CREATE TABLE public.achievements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + icon text, + points_reward integer DEFAULT 0, + badge_color text, + rarity text, + xp_reward integer DEFAULT 0, + category character varying NOT NULL DEFAULT 'milestone'::character varying, + CONSTRAINT achievements_pkey PRIMARY KEY (id) +); +CREATE TABLE public.activity_events ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + actor_id uuid NOT NULL, + verb text NOT NULL, + object_type text NOT NULL, + object_id uuid, + target_id uuid, + metadata jsonb, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT activity_events_pkey PRIMARY KEY (id), + CONSTRAINT activity_events_actor_id_fkey FOREIGN KEY (actor_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.activity_logs ( + id character varying NOT NULL DEFAULT (gen_random_uuid())::character varying, + user_id character varying, + action text NOT NULL, + details text, + ip_address text, + user_agent text, + status text NOT NULL, + timestamp timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT activity_logs_pkey PRIMARY KEY (id), + CONSTRAINT activity_logs_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) +); +CREATE TABLE public.aethex_alerts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid, + type text NOT NULL, + severity text NOT NULL CHECK (severity = ANY (ARRAY['critical'::text, 'warning'::text, 'info'::text])), + message text NOT NULL, + is_resolved boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + resolved_at timestamp with time zone, + CONSTRAINT aethex_alerts_pkey PRIMARY KEY (id), + CONSTRAINT aethex_alerts_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.aethex_applications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + creator_id uuid NOT NULL, + opportunity_id uuid NOT NULL, + status text DEFAULT 'submitted'::text, + cover_letter text, + response_message text, + applied_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT aethex_applications_pkey PRIMARY KEY (id), + CONSTRAINT aethex_applications_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.aethex_creators(id), + CONSTRAINT aethex_applications_opportunity_id_fkey FOREIGN KEY (opportunity_id) REFERENCES public.aethex_opportunities(id) +); +CREATE TABLE public.aethex_badges ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + icon text, + color text DEFAULT '#ffffff'::text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT aethex_badges_pkey PRIMARY KEY (id) +); +CREATE TABLE public.aethex_creators ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + username text NOT NULL UNIQUE, + bio text, + skills ARRAY DEFAULT '{}'::text[], + avatar_url text, + experience_level text, + arm_affiliations ARRAY DEFAULT '{}'::text[], + primary_arm text, + is_discoverable boolean DEFAULT true, + allow_recommendations boolean DEFAULT true, + devconnect_linked boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT aethex_creators_pkey PRIMARY KEY (id), + CONSTRAINT aethex_creators_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.aethex_devconnect_links ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + aethex_creator_id uuid NOT NULL, + devconnect_username text NOT NULL, + devconnect_profile_url text, + verified boolean DEFAULT false, + linked_at timestamp with time zone DEFAULT now(), + CONSTRAINT aethex_devconnect_links_pkey PRIMARY KEY (id), + CONSTRAINT aethex_devconnect_links_aethex_creator_id_fkey FOREIGN KEY (aethex_creator_id) REFERENCES public.aethex_creators(id) +); +CREATE TABLE public.aethex_event_registrations ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + event_id uuid NOT NULL, + user_id uuid NOT NULL, + registered_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT aethex_event_registrations_pkey PRIMARY KEY (id), + CONSTRAINT aethex_event_registrations_event_id_fkey FOREIGN KEY (event_id) REFERENCES public.aethex_events(id), + CONSTRAINT aethex_event_registrations_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.aethex_events ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid, + title text NOT NULL, + description text, + date date NOT NULL, + time time without time zone NOT NULL, + location text, + capacity integer, + image_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone, + category text, + price numeric, + featured boolean, + speakers ARRAY, + agenda jsonb, + full_description text, + map_url text, + ticket_types jsonb, + CONSTRAINT aethex_events_pkey PRIMARY KEY (id), + CONSTRAINT aethex_events_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.aethex_opportunities ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + title text NOT NULL, + description text NOT NULL, + job_type text NOT NULL, + salary_min integer, + salary_max integer, + experience_level text, + arm_affiliation text NOT NULL, + posted_by_id uuid NOT NULL, + status text DEFAULT 'open'::text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT aethex_opportunities_pkey PRIMARY KEY (id), + CONSTRAINT aethex_opportunities_posted_by_id_fkey FOREIGN KEY (posted_by_id) REFERENCES public.aethex_creators(id) +); +CREATE TABLE public.aethex_passports ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL UNIQUE, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT aethex_passports_pkey PRIMARY KEY (id), + CONSTRAINT aethex_passports_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.aethex_projects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + creator_id uuid NOT NULL, + title text NOT NULL, + description text, + url text, + image_url text, + tags ARRAY DEFAULT '{}'::text[], + is_featured boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT aethex_projects_pkey PRIMARY KEY (id), + CONSTRAINT aethex_projects_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.aethex_creators(id) +); +CREATE TABLE public.aethex_sites ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + url text, + status text, + uptime numeric, + response_time integer, + users integer, + requests integer, + last_check timestamp with time zone, + services ARRAY, + metrics jsonb, + created_at timestamp with time zone NOT NULL DEFAULT now(), + metrics_history ARRAY, + owner_id uuid, + api_key_hash text, + handshake_token text, + handshake_token_expires_at timestamp with time zone, + CONSTRAINT aethex_sites_pkey PRIMARY KEY (id), + CONSTRAINT aethex_sites_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.aethex_skill_endorsements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + creator_id uuid NOT NULL, + endorsed_by_id uuid NOT NULL, + skill text NOT NULL, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT aethex_skill_endorsements_pkey PRIMARY KEY (id), + CONSTRAINT aethex_skill_endorsements_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.aethex_creators(id), + CONSTRAINT aethex_skill_endorsements_endorsed_by_id_fkey FOREIGN KEY (endorsed_by_id) REFERENCES public.aethex_creators(id) +); +CREATE TABLE public.announcements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid, + author_id uuid, + title text NOT NULL, + content text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT announcements_pkey PRIMARY KEY (id), + CONSTRAINT announcements_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id), + CONSTRAINT announcements_author_id_fkey FOREIGN KEY (author_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.api_keys ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + api_key text NOT NULL UNIQUE, + name text NOT NULL, + last_used_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + expires_at timestamp with time zone, + CONSTRAINT api_keys_pkey PRIMARY KEY (id), + CONSTRAINT api_keys_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.app_2db261233c_achievements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name character varying NOT NULL, + description text, + category character varying NOT NULL, + type character varying NOT NULL, + criteria jsonb NOT NULL, + rewards jsonb DEFAULT '{}'::jsonb, + icon_url text, + rarity character varying DEFAULT 'common'::character varying, + points integer DEFAULT 0, + active boolean DEFAULT true, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_achievements_pkey PRIMARY KEY (id) +); +CREATE TABLE public.app_2db261233c_admin_logs ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + admin_id uuid NOT NULL, + action character varying NOT NULL, + target_type character varying, + target_id uuid, + details jsonb DEFAULT '{}'::jsonb, + ip_address inet, + user_agent text, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_admin_logs_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_admin_logs_admin_id_fkey FOREIGN KEY (admin_id) REFERENCES public.app_2db261233c_users(id) +); +CREATE TABLE public.app_2db261233c_comments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + post_id uuid, + content_id uuid, + parent_id uuid, + content text NOT NULL, + likes_count integer DEFAULT 0, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_comments_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_comments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id), + CONSTRAINT app_2db261233c_comments_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.app_2db261233c_posts(id), + CONSTRAINT app_2db261233c_comments_content_id_fkey FOREIGN KEY (content_id) REFERENCES public.app_2db261233c_content(id), + CONSTRAINT app_2db261233c_comments_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES public.app_2db261233c_comments(id) +); +CREATE TABLE public.app_2db261233c_content ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + type character varying NOT NULL, + title text NOT NULL, + description text, + content_url text, + thumbnail_url text, + metadata jsonb DEFAULT '{}'::jsonb, + category character varying, + tags ARRAY, + status character varying DEFAULT 'published'::character varying, + visibility character varying DEFAULT 'public'::character varying, + views_count integer DEFAULT 0, + likes_count integer DEFAULT 0, + comments_count integer DEFAULT 0, + shares_count integer DEFAULT 0, + featured boolean DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_content_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_content_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id) +); +CREATE TABLE public.app_2db261233c_follows ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + follower_id uuid NOT NULL, + following_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_follows_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_follows_follower_id_fkey FOREIGN KEY (follower_id) REFERENCES public.app_2db261233c_users(id), + CONSTRAINT app_2db261233c_follows_following_id_fkey FOREIGN KEY (following_id) REFERENCES public.app_2db261233c_users(id) +); +CREATE TABLE public.app_2db261233c_gaming_stats ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL UNIQUE, + games_played integer DEFAULT 0, + total_playtime integer DEFAULT 0, + worlds_created integer DEFAULT 0, + tournaments_won integer DEFAULT 0, + current_streak integer DEFAULT 0, + best_streak integer DEFAULT 0, + favorite_games ARRAY, + stats jsonb DEFAULT '{}'::jsonb, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_gaming_stats_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_gaming_stats_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id) +); +CREATE TABLE public.app_2db261233c_likes ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + post_id uuid, + content_id uuid, + comment_id uuid, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_likes_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_likes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id), + CONSTRAINT app_2db261233c_likes_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.app_2db261233c_posts(id), + CONSTRAINT app_2db261233c_likes_content_id_fkey FOREIGN KEY (content_id) REFERENCES public.app_2db261233c_content(id), + CONSTRAINT app_2db261233c_likes_comment_id_fkey FOREIGN KEY (comment_id) REFERENCES public.app_2db261233c_comments(id) +); +CREATE TABLE public.app_2db261233c_notifications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + type character varying NOT NULL, + title text NOT NULL, + message text, + data jsonb DEFAULT '{}'::jsonb, + read boolean DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_notifications_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_notifications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id) +); +CREATE TABLE public.app_2db261233c_posts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + content text NOT NULL, + media_urls ARRAY, + type character varying DEFAULT 'social'::character varying, + visibility character varying DEFAULT 'public'::character varying, + likes_count integer DEFAULT 0, + comments_count integer DEFAULT 0, + shares_count integer DEFAULT 0, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_posts_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_posts_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id) +); +CREATE TABLE public.app_2db261233c_professional_profiles ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL UNIQUE, + job_title text, + company text, + industry text, + skills ARRAY, + experience_years integer, + education jsonb DEFAULT '[]'::jsonb, + certifications jsonb DEFAULT '[]'::jsonb, + portfolio_url text, + linkedin_url text, + github_url text, + resume_url text, + availability character varying DEFAULT 'not_looking'::character varying, + salary_range text, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_professional_profiles_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_professional_profiles_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id) +); +CREATE TABLE public.app_2db261233c_user_achievements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + achievement_id uuid NOT NULL, + progress integer DEFAULT 0, + completed boolean DEFAULT false, + completed_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_user_achievements_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_user_achievements_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.app_2db261233c_users(id), + CONSTRAINT app_2db261233c_user_achievements_achievement_id_fkey FOREIGN KEY (achievement_id) REFERENCES public.app_2db261233c_achievements(id) +); +CREATE TABLE public.app_2db261233c_users ( + id uuid NOT NULL, + username character varying NOT NULL UNIQUE, + full_name text, + avatar_url text, + bio text, + location text, + website text, + gaming_level integer DEFAULT 1, + gaming_xp integer DEFAULT 0, + social_score integer DEFAULT 0, + professional_tier character varying DEFAULT 'free'::character varying, + total_uploads integer DEFAULT 0, + total_achievements integer DEFAULT 0, + status character varying DEFAULT 'active'::character varying, + privacy_settings jsonb DEFAULT '{"gaming": "public", "profile": "public", "professional": "public"}'::jsonb, + notification_settings jsonb DEFAULT '{"push": true, "email": true, "in_app": true}'::jsonb, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT app_2db261233c_users_pkey PRIMARY KEY (id), + CONSTRAINT app_2db261233c_users_id_fkey FOREIGN KEY (id) REFERENCES auth.users(id) +); +CREATE TABLE public.applications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + type text NOT NULL CHECK (type = ANY (ARRAY['contributor'::text, 'career'::text])), + full_name text NOT NULL, + email text NOT NULL, + location text, + role_interest text, + primary_skill text, + experience_level text, + availability text, + portfolio_url text, + resume_url text, + interests ARRAY, + message text, + status text NOT NULL DEFAULT 'new'::text, + submitted_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT applications_pkey PRIMARY KEY (id) +); +CREATE TABLE public.architect_waitlist ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid UNIQUE, + email text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT architect_waitlist_pkey PRIMARY KEY (id), + CONSTRAINT architect_waitlist_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.arm_follows ( + id bigint NOT NULL DEFAULT nextval('arm_follows_id_seq'::regclass), + user_id uuid NOT NULL, + arm_affiliation text NOT NULL, + followed_at timestamp with time zone DEFAULT now(), + CONSTRAINT arm_follows_pkey PRIMARY KEY (id), + CONSTRAINT arm_follows_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.assets ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid, + user_id uuid, + name text NOT NULL, + file_type text, + size bigint, + url text NOT NULL, + tags ARRAY, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + site_id uuid, + CONSTRAINT assets_pkey PRIMARY KEY (id), + CONSTRAINT assets_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.projects(id), + CONSTRAINT assets_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT assets_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.audit_logs ( + id integer NOT NULL DEFAULT nextval('audit_logs_id_seq'::regclass), + guild_id text NOT NULL, + action text NOT NULL, + user_id text NOT NULL, + user_tag text, + details jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT audit_logs_pkey PRIMARY KEY (id) +); +CREATE TABLE public.auth_logs ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid, + event_type text NOT NULL, + ip_address inet, + user_agent text, + metadata jsonb, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT auth_logs_pkey PRIMARY KEY (id) +); +CREATE TABLE public.auth_nonces ( + id bigint NOT NULL DEFAULT nextval('auth_nonces_id_seq'::regclass), + wallet_address text NOT NULL, + nonce text NOT NULL UNIQUE, + created_at timestamp with time zone DEFAULT now(), + expires_at timestamp with time zone NOT NULL, + used boolean DEFAULT false, + ip_address inet, + CONSTRAINT auth_nonces_pkey PRIMARY KEY (id) +); +CREATE TABLE public.automod_config ( + guild_id text NOT NULL, + links_enabled boolean DEFAULT false, + links_action text DEFAULT 'delete'::text, + spam_enabled boolean DEFAULT false, + spam_threshold integer DEFAULT 5, + badwords jsonb DEFAULT '[]'::jsonb, + invites_enabled boolean DEFAULT false, + mentions_enabled boolean DEFAULT false, + mentions_limit integer DEFAULT 5, + exempt_roles jsonb DEFAULT '[]'::jsonb, + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT automod_config_pkey PRIMARY KEY (guild_id) +); +CREATE TABLE public.blockchain_transactions ( + id bigint NOT NULL DEFAULT nextval('blockchain_transactions_id_seq'::regclass), + transaction_hash text NOT NULL UNIQUE, + block_number bigint NOT NULL, + chain_id integer NOT NULL, + from_address text NOT NULL, + to_address text, + value numeric DEFAULT 0, + value_currency text DEFAULT 'ETH'::text, + gas_used numeric, + gas_price numeric, + transaction_type text, + status text DEFAULT 'confirmed'::text, + timestamp timestamp with time zone NOT NULL, + metadata jsonb DEFAULT '{}'::jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT blockchain_transactions_pkey PRIMARY KEY (id) +); +CREATE TABLE public.blog_categories ( + id text NOT NULL, + name text NOT NULL, + slug text NOT NULL UNIQUE, + description text, + theme text NOT NULL, + border_color text NOT NULL, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT blog_categories_pkey PRIMARY KEY (id) +); +CREATE TABLE public.blog_comments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + post_id uuid NOT NULL, + user_id uuid NOT NULL, + parent_comment_id uuid, + content text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT blog_comments_pkey PRIMARY KEY (id), + CONSTRAINT blog_comments_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.blog_posts(id), + CONSTRAINT blog_comments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT blog_comments_parent_comment_id_fkey FOREIGN KEY (parent_comment_id) REFERENCES public.blog_comments(id) +); +CREATE TABLE public.blog_post_likes ( + post_id uuid NOT NULL, + user_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT blog_post_likes_pkey PRIMARY KEY (post_id, user_id), + CONSTRAINT blog_post_likes_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.blog_posts(id), + CONSTRAINT blog_post_likes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.blog_posts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + slug text NOT NULL UNIQUE, + title text NOT NULL, + content text, + author_id uuid, + image_url text, + tags ARRAY, + status text DEFAULT 'draft'::text, + published_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + image_prompt text, + excerpt text, + author text, + date text, + read_time text, + category text, + image text, + likes integer DEFAULT 0, + comments integer DEFAULT 0, + body_html text, + CONSTRAINT blog_posts_pkey PRIMARY KEY (id), + CONSTRAINT blog_posts_author_id_fkey FOREIGN KEY (author_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.books ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + category text, + release_date text, + rating numeric, + is_free boolean DEFAULT false, + long_description text, + tags ARRAY, + image_prompt text, + image_url text, + purchase_links jsonb, + content text, + display_order smallint, + created_at timestamp with time zone NOT NULL DEFAULT now(), + description text, + CONSTRAINT books_pkey PRIMARY KEY (id) +); +CREATE TABLE public.bounties ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + bounty_id text NOT NULL UNIQUE, + title text NOT NULL, + description text NOT NULL, + reward_usd numeric NOT NULL CHECK (reward_usd IS NULL OR reward_usd >= 0::numeric), + xp_reward integer DEFAULT 0 CHECK (xp_reward >= 0), + difficulty text DEFAULT 'intermediate'::text CHECK (difficulty = ANY (ARRAY['beginner'::text, 'intermediate'::text, 'advanced'::text, 'expert'::text])), + skills ARRAY DEFAULT '{}'::text[], + applicant_count integer DEFAULT 0 CHECK (applicant_count >= 0), + time_estimate text, + posted_by uuid, + project text, + status text DEFAULT 'open'::text CHECK (status = ANY (ARRAY['open'::text, 'in_progress'::text, 'completed'::text, 'cancelled'::text])), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + claimed_by uuid, + claimed_at timestamp with time zone, + submission_url text, + submission_notes text, + submitted_at timestamp with time zone, + CONSTRAINT bounties_pkey PRIMARY KEY (id), + CONSTRAINT bounties_posted_by_fkey FOREIGN KEY (posted_by) REFERENCES public.user_profiles(id), + CONSTRAINT bounties_claimed_by_fkey FOREIGN KEY (claimed_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.bounty_applications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + bounty_id uuid, + user_id uuid, + message text NOT NULL, + status text DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'accepted'::text, 'rejected'::text])), + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT bounty_applications_pkey PRIMARY KEY (id), + CONSTRAINT bounty_applications_bounty_id_fkey FOREIGN KEY (bounty_id) REFERENCES public.bounties(id), + CONSTRAINT bounty_applications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.bounty_claims ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + grid_member_id uuid NOT NULL, + bounty_id uuid NOT NULL, + status character varying NOT NULL DEFAULT 'claimed'::character varying CHECK (status::text = ANY (ARRAY['claimed'::character varying, 'submitted'::character varying, 'approved'::character varying, 'rejected'::character varying]::text[])), + claimed_at timestamp with time zone NOT NULL DEFAULT now(), + submitted_at timestamp with time zone, + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT bounty_claims_pkey PRIMARY KEY (id), + CONSTRAINT bounty_claims_grid_member_id_fkey FOREIGN KEY (grid_member_id) REFERENCES public.grid_members(id), + CONSTRAINT bounty_claims_bounty_id_fkey FOREIGN KEY (bounty_id) REFERENCES public.bounties(id) +); +CREATE TABLE public.changelogs ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + version_date date NOT NULL, + title text NOT NULL, + changes jsonb NOT NULL, + created_at timestamp with time zone DEFAULT now(), + site_name text, + site_id uuid, + tags jsonb, + CONSTRAINT changelogs_pkey PRIMARY KEY (id), + CONSTRAINT changelogs_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.collaboration_comments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + post_id uuid NOT NULL, + user_id uuid NOT NULL, + content text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT collaboration_comments_pkey PRIMARY KEY (id), + CONSTRAINT collaboration_comments_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.collaboration_posts(id), + CONSTRAINT collaboration_comments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.collaboration_post_likes ( + post_id uuid NOT NULL, + user_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT collaboration_post_likes_pkey PRIMARY KEY (post_id, user_id), + CONSTRAINT collaboration_post_likes_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.collaboration_posts(id), + CONSTRAINT collaboration_post_likes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.collaboration_posts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + title text NOT NULL, + content text NOT NULL, + arm_affiliation text NOT NULL DEFAULT 'labs'::text, + created_by uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + is_published boolean DEFAULT true, + likes_count integer DEFAULT 0, + comments_count integer DEFAULT 0, + tags ARRAY DEFAULT ARRAY[]::text[], + category text, + CONSTRAINT collaboration_posts_pkey PRIMARY KEY (id), + CONSTRAINT collaboration_posts_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.collaboration_posts_authors ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + collaboration_post_id uuid NOT NULL, + user_id uuid NOT NULL, + role text NOT NULL DEFAULT 'contributor'::text, + joined_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT collaboration_posts_authors_pkey PRIMARY KEY (id), + CONSTRAINT collaboration_posts_authors_collaboration_post_id_fkey FOREIGN KEY (collaboration_post_id) REFERENCES public.collaboration_posts(id), + CONSTRAINT collaboration_posts_authors_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.command_cooldowns ( + id integer NOT NULL DEFAULT nextval('command_cooldowns_id_seq'::regclass), + guild_id character varying NOT NULL, + user_id character varying NOT NULL, + command character varying NOT NULL, + expires_at timestamp with time zone NOT NULL, + CONSTRAINT command_cooldowns_pkey PRIMARY KEY (id) +); +CREATE TABLE public.command_logs ( + id integer NOT NULL DEFAULT nextval('command_logs_id_seq'::regclass), + guild_id character varying NOT NULL, + user_id character varying NOT NULL, + command character varying NOT NULL, + options jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT command_logs_pkey PRIMARY KEY (id) +); +CREATE TABLE public.comments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + post_id uuid NOT NULL, + user_id uuid NOT NULL, + parent_comment_id uuid, + content text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT comments_pkey PRIMARY KEY (id), + CONSTRAINT comments_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.posts(id), + CONSTRAINT comments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT comments_parent_comment_id_fkey FOREIGN KEY (parent_comment_id) REFERENCES public.comments(id) +); +CREATE TABLE public.community_comments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + post_id uuid NOT NULL, + user_id uuid NOT NULL, + content text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT community_comments_pkey PRIMARY KEY (id), + CONSTRAINT community_comments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id), + CONSTRAINT community_comments_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.community_posts(id) +); +CREATE TABLE public.community_likes ( + id integer NOT NULL DEFAULT nextval('community_likes_id_seq'::regclass), + post_id uuid NOT NULL, + liker_id uuid NOT NULL, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT community_likes_pkey PRIMARY KEY (id) +); +CREATE TABLE public.community_notifications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + actor_id uuid NOT NULL, + post_id uuid, + collaboration_post_id uuid, + notification_type text NOT NULL, + title text NOT NULL, + description text, + read boolean DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT community_notifications_pkey PRIMARY KEY (id), + CONSTRAINT community_notifications_actor_id_fkey FOREIGN KEY (actor_id) REFERENCES public.user_profiles(id), + CONSTRAINT community_notifications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id), + CONSTRAINT community_notifications_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.community_posts(id), + CONSTRAINT community_notifications_collaboration_post_id_fkey FOREIGN KEY (collaboration_post_id) REFERENCES public.collaboration_posts(id) +); +CREATE TABLE public.community_post_likes ( + post_id uuid NOT NULL, + user_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT community_post_likes_pkey PRIMARY KEY (post_id, user_id), + CONSTRAINT community_post_likes_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.community_posts(id), + CONSTRAINT community_post_likes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.community_posts ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + author_id uuid, + title text NOT NULL, + content text NOT NULL, + category text, + tags ARRAY, + likes_count integer DEFAULT 0, + comments_count integer DEFAULT 0, + is_published boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + arm_affiliation text DEFAULT 'labs'::text CHECK (arm_affiliation = ANY (ARRAY['labs'::text, 'gameforge'::text, 'corp'::text, 'foundation'::text, 'devlink'::text, 'nexus'::text, 'staff'::text])), + CONSTRAINT community_posts_pkey PRIMARY KEY (id), + CONSTRAINT community_posts_author_id_fkey FOREIGN KEY (author_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.company_documents ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + description text, + file_url text, + category text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT company_documents_pkey PRIMARY KEY (id), + CONSTRAINT company_documents_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.connections ( + id text NOT NULL DEFAULT (gen_random_uuid())::text, + from text NOT NULL, + to text NOT NULL, + directed boolean DEFAULT true, + status text CHECK (status = ANY (ARRAY['healthy'::text, 'warning'::text, 'error'::text])), + bandwidth numeric, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT connections_pkey PRIMARY KEY (id), + CONSTRAINT connections_from_fkey FOREIGN KEY (from) REFERENCES public.nodes(id), + CONSTRAINT connections_to_fkey FOREIGN KEY (to) REFERENCES public.nodes(id) +); +CREATE TABLE public.consultancy_services ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + title text NOT NULL UNIQUE, + price numeric NOT NULL, + price_description text, + description text, + features ARRAY NOT NULL, + is_featured boolean NOT NULL DEFAULT false, + display_order integer, + created_at timestamp with time zone NOT NULL DEFAULT now(), + category text, + long_description text, + CONSTRAINT consultancy_services_pkey PRIMARY KEY (id) +); +CREATE TABLE public.contact_submissions ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL, + email text NOT NULL, + subject text, + message text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT contact_submissions_pkey PRIMARY KEY (id) +); +CREATE TABLE public.contracts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + site_id uuid NOT NULL, + title text NOT NULL, + status text, + document_url text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT contracts_pkey PRIMARY KEY (id), + CONSTRAINT contracts_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT contracts_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.conversations ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + participant_ids ARRAY NOT NULL, + last_message_at timestamp with time zone NOT NULL DEFAULT now(), + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT conversations_pkey PRIMARY KEY (id) +); +CREATE TABLE public.corp_activity_log ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + company_id uuid NOT NULL, + actor_id uuid NOT NULL, + action text NOT NULL, + resource_type text, + resource_id uuid, + metadata jsonb, + ip_address text, + user_agent text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_activity_log_pkey PRIMARY KEY (id), + CONSTRAINT corp_activity_log_company_id_fkey FOREIGN KEY (company_id) REFERENCES public.user_profiles(id), + CONSTRAINT corp_activity_log_actor_id_fkey FOREIGN KEY (actor_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.corp_contract_milestones ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + contract_id uuid NOT NULL, + milestone_name text NOT NULL, + description text, + due_date date, + deliverables text, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'in_progress'::text, 'completed'::text, 'blocked'::text])), + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_contract_milestones_pkey PRIMARY KEY (id), + CONSTRAINT corp_contract_milestones_contract_id_fkey FOREIGN KEY (contract_id) REFERENCES public.corp_contracts(id) +); +CREATE TABLE public.corp_contracts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + client_company_id uuid NOT NULL, + vendor_id uuid NOT NULL, + contract_name text NOT NULL, + contract_type text NOT NULL CHECK (contract_type = ANY (ARRAY['service'::text, 'retainer'::text, 'license'::text, 'nda'::text, 'other'::text])), + description text, + start_date date, + end_date date, + contract_value numeric, + status text NOT NULL DEFAULT 'draft'::text CHECK (status = ANY (ARRAY['draft'::text, 'pending_approval'::text, 'signed'::text, 'active'::text, 'completed'::text, 'terminated'::text, 'archived'::text])), + document_url text, + signed_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_contracts_pkey PRIMARY KEY (id), + CONSTRAINT corp_contracts_client_company_id_fkey FOREIGN KEY (client_company_id) REFERENCES public.user_profiles(id), + CONSTRAINT corp_contracts_vendor_id_fkey FOREIGN KEY (vendor_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.corp_financial_summary ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + company_id uuid NOT NULL UNIQUE, + period_start date NOT NULL, + period_end date NOT NULL, + total_invoiced numeric DEFAULT 0, + total_paid numeric DEFAULT 0, + total_overdue numeric DEFAULT 0, + active_contracts integer DEFAULT 0, + completed_contracts integer DEFAULT 0, + total_contract_value numeric DEFAULT 0, + average_payment_days integer, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_financial_summary_pkey PRIMARY KEY (id), + CONSTRAINT corp_financial_summary_company_id_fkey FOREIGN KEY (company_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.corp_invoice_items ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + invoice_id uuid NOT NULL, + description text NOT NULL, + quantity numeric NOT NULL DEFAULT 1, + unit_price numeric NOT NULL, + amount numeric NOT NULL, + category text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_invoice_items_pkey PRIMARY KEY (id), + CONSTRAINT corp_invoice_items_invoice_id_fkey FOREIGN KEY (invoice_id) REFERENCES public.corp_invoices(id) +); +CREATE TABLE public.corp_invoice_payments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + invoice_id uuid NOT NULL, + amount_paid numeric NOT NULL, + payment_date date NOT NULL DEFAULT now(), + payment_method text NOT NULL DEFAULT 'bank_transfer'::text, + reference_number text, + notes text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_invoice_payments_pkey PRIMARY KEY (id), + CONSTRAINT corp_invoice_payments_invoice_id_fkey FOREIGN KEY (invoice_id) REFERENCES public.corp_invoices(id) +); +CREATE TABLE public.corp_invoices ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + client_company_id uuid NOT NULL, + invoice_number text NOT NULL UNIQUE, + project_id uuid, + description text, + issue_date date NOT NULL DEFAULT now(), + due_date date NOT NULL, + amount_due numeric NOT NULL, + amount_paid numeric NOT NULL DEFAULT 0, + status text NOT NULL DEFAULT 'draft'::text CHECK (status = ANY (ARRAY['draft'::text, 'sent'::text, 'viewed'::text, 'paid'::text, 'overdue'::text, 'cancelled'::text])), + currency text NOT NULL DEFAULT 'USD'::text, + notes text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_invoices_pkey PRIMARY KEY (id), + CONSTRAINT corp_invoices_client_company_id_fkey FOREIGN KEY (client_company_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.corp_projects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + client_company_id uuid NOT NULL, + project_name text NOT NULL, + description text, + status text NOT NULL DEFAULT 'active'::text CHECK (status = ANY (ARRAY['planning'::text, 'active'::text, 'paused'::text, 'completed'::text, 'archived'::text])), + budget numeric, + spent numeric DEFAULT 0, + start_date date, + end_date date, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_projects_pkey PRIMARY KEY (id), + CONSTRAINT corp_projects_client_company_id_fkey FOREIGN KEY (client_company_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.corp_team_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + company_id uuid NOT NULL, + user_id uuid NOT NULL, + role text NOT NULL CHECK (role = ANY (ARRAY['owner'::text, 'admin'::text, 'member'::text, 'viewer'::text])), + email text NOT NULL, + full_name text, + job_title text, + status text NOT NULL DEFAULT 'active'::text CHECK (status = ANY (ARRAY['active'::text, 'inactive'::text, 'pending_invite'::text])), + invited_at timestamp with time zone, + joined_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corp_team_members_pkey PRIMARY KEY (id), + CONSTRAINT corp_team_members_company_id_fkey FOREIGN KEY (company_id) REFERENCES public.user_profiles(id), + CONSTRAINT corp_team_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.corporate_career_applications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + job_title text NOT NULL, + full_name text NOT NULL, + email text NOT NULL, + portfolio_url text, + cover_letter text, + submitted_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corporate_career_applications_pkey PRIMARY KEY (id) +); +CREATE TABLE public.corporate_career_interest ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + full_name text NOT NULL, + email text NOT NULL, + area_of_interest text, + linkedin_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corporate_career_interest_pkey PRIMARY KEY (id), + CONSTRAINT corporate_career_interest_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.corporate_investor_docs ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + description text, + file_url text NOT NULL, + document_type text, + published_date date, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT corporate_investor_docs_pkey PRIMARY KEY (id), + CONSTRAINT corporate_investor_docs_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.corporate_job_postings ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + department text, + location text, + job_type text, + description text NOT NULL, + is_active boolean DEFAULT true, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT corporate_job_postings_pkey PRIMARY KEY (id), + CONSTRAINT corporate_job_postings_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.corporate_leadership ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + profile_id uuid UNIQUE, + name text NOT NULL, + title text NOT NULL, + bio text, + image_url text, + social_links jsonb, + display_order integer DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT corporate_leadership_pkey PRIMARY KEY (id), + CONSTRAINT corporate_leadership_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id), + CONSTRAINT corporate_leadership_profile_id_fkey FOREIGN KEY (profile_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.corporate_news ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + slug text NOT NULL UNIQUE, + title text NOT NULL, + excerpt text, + content text NOT NULL, + image_url text, + author_id uuid, + published_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + tags ARRAY, + CONSTRAINT corporate_news_pkey PRIMARY KEY (id), + CONSTRAINT corporate_news_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id), + CONSTRAINT corporate_news_author_id_fkey FOREIGN KEY (author_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.corporate_whitepapers ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + description text, + file_url text NOT NULL, + image_url text, + published_date date, + tags ARRAY, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT corporate_whitepapers_pkey PRIMARY KEY (id), + CONSTRAINT corporate_whitepapers_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.creations ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + category text, + description text, + tags ARRAY, + image_prompt text, + image_url text, + links jsonb, + display_order smallint, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT creations_pkey PRIMARY KEY (id) +); +CREATE TABLE public.creator_assets ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + experience_id uuid, + name text NOT NULL, + description text, + type text NOT NULL, + file_url text NOT NULL, + thumbnail_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT creator_assets_pkey PRIMARY KEY (id), + CONSTRAINT creator_assets_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT creator_assets_experience_id_fkey FOREIGN KEY (experience_id) REFERENCES public.experiences(id) +); +CREATE TABLE public.creator_dashboard ( + user_id uuid NOT NULL, + total_projects integer DEFAULT 0, + total_assets integer DEFAULT 0, + total_experiences integer DEFAULT 0, + last_synced_at timestamp with time zone, + CONSTRAINT creator_dashboard_pkey PRIMARY KEY (user_id), + CONSTRAINT creator_dashboard_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.customers ( + id uuid NOT NULL, + stripe_customer_id text, + CONSTRAINT customers_pkey PRIMARY KEY (id), + CONSTRAINT customers_id_fkey FOREIGN KEY (id) REFERENCES auth.users(id) +); +CREATE TABLE public.defi_positions ( + id bigint NOT NULL DEFAULT nextval('defi_positions_id_seq'::regclass), + user_id uuid NOT NULL, + wallet_address text NOT NULL, + chain_id integer NOT NULL, + protocol_name text NOT NULL, + position_type text NOT NULL, + token_address text, + token_symbol text, + amount numeric NOT NULL DEFAULT 0, + amount_usd numeric DEFAULT 0, + apy numeric DEFAULT 0, + rewards_earned numeric DEFAULT 0, + rewards_usd numeric DEFAULT 0, + metadata jsonb DEFAULT '{}'::jsonb, + last_synced_at timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT defi_positions_pkey PRIMARY KEY (id), + CONSTRAINT defi_positions_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.designer_waitlist ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid UNIQUE, + email text NOT NULL UNIQUE, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT designer_waitlist_pkey PRIMARY KEY (id), + CONSTRAINT designer_waitlist_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.developer_waitlist ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid UNIQUE, + email text NOT NULL UNIQUE, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT developer_waitlist_pkey PRIMARY KEY (id), + CONSTRAINT developer_waitlist_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.devhub_collaboration_sessions ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid, + user_id uuid, + status text DEFAULT 'active'::text, + created_at timestamp with time zone DEFAULT now(), + ended_at timestamp with time zone, + site_id uuid, + CONSTRAINT devhub_collaboration_sessions_pkey PRIMARY KEY (id), + CONSTRAINT devhub_collaboration_sessions_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.projects(id), + CONSTRAINT devhub_collaboration_sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT devhub_collaboration_sessions_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.devlink_achievements ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + achievement_type text NOT NULL, + title text, + description text, + xp_earned integer DEFAULT 0, + badge_url text, + unlocked_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_achievements_pkey PRIMARY KEY (id), + CONSTRAINT devlink_achievements_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_applications ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + job_id uuid, + applicant_id uuid, + cover_letter text, + proposed_rate text, + estimated_timeline text, + availability_start_date timestamp with time zone, + portfolio_links ARRAY DEFAULT '{}'::text[], + status text DEFAULT 'pending'::text, + reviewed boolean DEFAULT false, + review_text text, + rating integer, + categories jsonb DEFAULT '{}'::jsonb, + would_work_again boolean, + company_response text, + company_response_date timestamp with time zone, + created_date timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_applications_pkey PRIMARY KEY (id), + CONSTRAINT devlink_applications_job_id_fkey FOREIGN KEY (job_id) REFERENCES public.devlink_jobs(id), + CONSTRAINT devlink_applications_applicant_id_fkey FOREIGN KEY (applicant_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_certifications ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + skill_name text NOT NULL, + certification_level text, + score integer, + percentile integer, + certificate_url text, + verification_code text UNIQUE, + issued_date timestamp with time zone DEFAULT now(), + expiry_date timestamp with time zone, + status text DEFAULT 'active'::text, + verified boolean DEFAULT false, + CONSTRAINT devlink_certifications_pkey PRIMARY KEY (id), + CONSTRAINT devlink_certifications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_collab_messages ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + room_id uuid, + sender_id uuid, + message_type text DEFAULT 'text'::text, + content text, + file_url text, + attachments jsonb DEFAULT '[]'::jsonb, + read boolean DEFAULT false, + read_at timestamp with time zone, + created_date timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_collab_messages_pkey PRIMARY KEY (id), + CONSTRAINT devlink_collab_messages_room_id_fkey FOREIGN KEY (room_id) REFERENCES public.devlink_collab_rooms(id), + CONSTRAINT devlink_collab_messages_sender_id_fkey FOREIGN KEY (sender_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_collab_rooms ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + room_name text NOT NULL, + room_type text DEFAULT 'general'::text, + creator_id uuid, + participant_ids ARRAY DEFAULT '{}'::uuid[], + related_job_id uuid, + status text DEFAULT 'active'::text, + started_at timestamp with time zone DEFAULT now(), + code_snippets jsonb DEFAULT '[]'::jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_collab_rooms_pkey PRIMARY KEY (id), + CONSTRAINT devlink_collab_rooms_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.devlink_profiles(id), + CONSTRAINT devlink_collab_rooms_related_job_id_fkey FOREIGN KEY (related_job_id) REFERENCES public.devlink_jobs(id) +); +CREATE TABLE public.devlink_collab_tasks ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + room_id uuid, + title text NOT NULL, + description text, + priority text DEFAULT 'medium'::text, + due_date timestamp with time zone, + estimated_hours integer, + created_by uuid, + assigned_to uuid, + status text DEFAULT 'pending'::text, + blocked_by ARRAY, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_collab_tasks_pkey PRIMARY KEY (id), + CONSTRAINT devlink_collab_tasks_room_id_fkey FOREIGN KEY (room_id) REFERENCES public.devlink_collab_rooms(id), + CONSTRAINT devlink_collab_tasks_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.devlink_profiles(id), + CONSTRAINT devlink_collab_tasks_assigned_to_fkey FOREIGN KEY (assigned_to) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_company_profiles ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + company_name text NOT NULL, + tagline text, + description text, + industry text, + company_size text, + founded_year integer, + location text, + website_url text, + logo_url text, + banner_url text, + brand_colors jsonb DEFAULT '{}'::jsonb, + social_links jsonb DEFAULT '{}'::jsonb, + culture_values ARRAY DEFAULT '{}'::text[], + perks_benefits ARRAY DEFAULT '{}'::text[], + tech_stack ARRAY DEFAULT '{}'::text[], + current_projects jsonb DEFAULT '[]'::jsonb, + verified boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_company_profiles_pkey PRIMARY KEY (id), + CONSTRAINT devlink_company_profiles_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_daily_challenges ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + date date DEFAULT CURRENT_DATE, + challenge_type text, + title text, + description text, + xp_reward integer DEFAULT 0, + target_count integer DEFAULT 1, + current_progress integer DEFAULT 0, + completed boolean DEFAULT false, + completed_at timestamp with time zone, + streak_bonus integer DEFAULT 0, + bonus_xp integer DEFAULT 0, + CONSTRAINT devlink_daily_challenges_pkey PRIMARY KEY (id), + CONSTRAINT devlink_daily_challenges_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_endorsements ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + endorsee_id uuid, + endorser_id uuid, + skill_name text NOT NULL, + relationship text, + endorsement_strength integer DEFAULT 1, + created_date timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_endorsements_pkey PRIMARY KEY (id), + CONSTRAINT devlink_endorsements_endorsee_id_fkey FOREIGN KEY (endorsee_id) REFERENCES public.devlink_profiles(id), + CONSTRAINT devlink_endorsements_endorser_id_fkey FOREIGN KEY (endorser_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_escrow_transactions ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + job_id uuid, + developer_id uuid, + employer_id uuid, + total_amount numeric, + funded_amount numeric DEFAULT 0, + released_amount numeric DEFAULT 0, + currency text DEFAULT 'USD'::text, + status text DEFAULT 'pending'::text, + funded_date timestamp with time zone, + created_date timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_escrow_transactions_pkey PRIMARY KEY (id), + CONSTRAINT devlink_escrow_transactions_job_id_fkey FOREIGN KEY (job_id) REFERENCES public.devlink_jobs(id), + CONSTRAINT devlink_escrow_transactions_developer_id_fkey FOREIGN KEY (developer_id) REFERENCES public.devlink_profiles(id), + CONSTRAINT devlink_escrow_transactions_employer_id_fkey FOREIGN KEY (employer_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_forum_posts ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + author_id uuid, + title text NOT NULL, + content text, + category text, + tags ARRAY DEFAULT '{}'::text[], + upvotes integer DEFAULT 0, + downvotes integer DEFAULT 0, + view_count integer DEFAULT 0, + reply_count integer DEFAULT 0, + pinned boolean DEFAULT false, + locked boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_forum_posts_pkey PRIMARY KEY (id), + CONSTRAINT devlink_forum_posts_author_id_fkey FOREIGN KEY (author_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_forum_replies ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + post_id uuid, + author_id uuid, + content text NOT NULL, + upvotes integer DEFAULT 0, + downvotes integer DEFAULT 0, + is_solution boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_forum_replies_pkey PRIMARY KEY (id), + CONSTRAINT devlink_forum_replies_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.devlink_forum_posts(id), + CONSTRAINT devlink_forum_replies_author_id_fkey FOREIGN KEY (author_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_jobs ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + title text NOT NULL, + description text, + required_roles ARRAY DEFAULT '{}'::text[], + required_skills ARRAY DEFAULT '{}'::text[], + experience_level text, + programming_languages ARRAY DEFAULT '{}'::text[], + frameworks ARRAY DEFAULT '{}'::text[], + payment_type text DEFAULT 'fixed'::text, + budget_range jsonb DEFAULT '{}'::jsonb, + salary_min numeric, + salary_max numeric, + timeline text, + remote_type text DEFAULT 'remote'::text, + preferred_locations ARRAY DEFAULT '{}'::text[], + preferred_timezones ARRAY DEFAULT '{}'::text[], + company_size text, + status text DEFAULT 'open'::text, + application_deadline timestamp with time zone, + application_count integer DEFAULT 0, + view_count integer DEFAULT 0, + employer_id uuid, + company_name text, + company_logo text, + metadata jsonb DEFAULT '{}'::jsonb, + created_date timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_jobs_pkey PRIMARY KEY (id), + CONSTRAINT devlink_jobs_employer_id_fkey FOREIGN KEY (employer_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_learning_paths ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + path_name text NOT NULL, + target_role text, + current_level text, + target_level text, + skill_gaps jsonb DEFAULT '[]'::jsonb, + recommended_resources jsonb DEFAULT '[]'::jsonb, + suggested_projects jsonb DEFAULT '[]'::jsonb, + milestones jsonb DEFAULT '[]'::jsonb, + estimated_duration_weeks integer, + progress_percentage integer DEFAULT 0, + ai_recommendations jsonb DEFAULT '{}'::jsonb, + last_updated timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_learning_paths_pkey PRIMARY KEY (id), + CONSTRAINT devlink_learning_paths_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_messages ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + sender_id uuid, + receiver_id uuid, + content text NOT NULL, + read boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_messages_pkey PRIMARY KEY (id), + CONSTRAINT devlink_messages_sender_id_fkey FOREIGN KEY (sender_id) REFERENCES public.devlink_profiles(id), + CONSTRAINT devlink_messages_receiver_id_fkey FOREIGN KEY (receiver_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_milestones ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + job_id uuid, + escrow_id uuid, + title text NOT NULL, + description text, + amount numeric, + status text DEFAULT 'pending'::text, + submission_notes text, + submitted_date timestamp with time zone, + approved_date timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_milestones_pkey PRIMARY KEY (id), + CONSTRAINT devlink_milestones_job_id_fkey FOREIGN KEY (job_id) REFERENCES public.devlink_jobs(id), + CONSTRAINT devlink_milestones_escrow_id_fkey FOREIGN KEY (escrow_id) REFERENCES public.devlink_escrow_transactions(id) +); +CREATE TABLE public.devlink_notifications ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + type text DEFAULT 'info'::text, + title text NOT NULL, + message text, + link text, + metadata jsonb DEFAULT '{}'::jsonb, + read boolean DEFAULT false, + created_date timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_notifications_pkey PRIMARY KEY (id), + CONSTRAINT devlink_notifications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_portfolios ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + title text NOT NULL, + description text, + project_type text, + technologies ARRAY DEFAULT '{}'::text[], + images ARRAY DEFAULT '{}'::text[], + video_url text, + live_url text, + github_url text, + roblox_game_id text, + featured boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_portfolios_pkey PRIMARY KEY (id), + CONSTRAINT devlink_portfolios_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_profiles ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + email text UNIQUE, + full_name text, + avatar_url text, + roblox_avatar_url text, + banner_url text, + bio text, + developer_roles ARRAY DEFAULT '{}'::text[], + skills ARRAY DEFAULT '{}'::text[], + experience_level text, + years_of_experience integer DEFAULT 0, + portfolio_links ARRAY DEFAULT '{}'::text[], + work_status text DEFAULT 'available'::text, + payment_preferences jsonb DEFAULT '{}'::jsonb, + hourly_rate numeric, + roblox_username text, + roblox_user_id text, + roblox_verified boolean DEFAULT false, + roblox_data jsonb DEFAULT '{}'::jsonb, + roblox_reputation_score integer DEFAULT 0, + roblox_reputation_tier text, + use_roblox_display_name boolean DEFAULT false, + use_roblox_avatar boolean DEFAULT false, + github_username text, + github_verified boolean DEFAULT false, + devforum_username text, + devforum_verified boolean DEFAULT false, + forum_reputation integer DEFAULT 0, + xp_points integer DEFAULT 0, + level integer DEFAULT 1, + community_points integer DEFAULT 0, + streak_days integer DEFAULT 0, + user_type text DEFAULT 'developer'::text, + company_name text, + company_id uuid, + platform_roles ARRAY DEFAULT '{}'::text[], + avatar_customization jsonb DEFAULT '{}'::jsonb, + admin boolean DEFAULT false, + is_premium boolean DEFAULT false, + stripe_account_id text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_profiles_pkey PRIMARY KEY (id) +); +CREATE TABLE public.devlink_reviews ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + job_id uuid, + reviewer_id uuid, + reviewee_id uuid, + rating integer CHECK (rating >= 1 AND rating <= 5), + review_text text, + review_type text, + categories jsonb DEFAULT '{}'::jsonb, + would_work_again boolean, + created_date timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_reviews_pkey PRIMARY KEY (id), + CONSTRAINT devlink_reviews_job_id_fkey FOREIGN KEY (job_id) REFERENCES public.devlink_jobs(id), + CONSTRAINT devlink_reviews_reviewer_id_fkey FOREIGN KEY (reviewer_id) REFERENCES public.devlink_profiles(id), + CONSTRAINT devlink_reviews_reviewee_id_fkey FOREIGN KEY (reviewee_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_saved_jobs ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + job_id uuid, + priority text DEFAULT 'medium'::text, + notes text, + created_date timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_saved_jobs_pkey PRIMARY KEY (id), + CONSTRAINT devlink_saved_jobs_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id), + CONSTRAINT devlink_saved_jobs_job_id_fkey FOREIGN KEY (job_id) REFERENCES public.devlink_jobs(id) +); +CREATE TABLE public.devlink_skill_assessments ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + skill_name text NOT NULL, + assessment_type text, + score integer, + questions_answered integer DEFAULT 0, + questions_correct integer DEFAULT 0, + time_taken_minutes integer, + time_limit_minutes integer, + passed boolean DEFAULT false, + passing_score integer, + anti_cheat_flags jsonb DEFAULT '[]'::jsonb, + proctoring_enabled boolean DEFAULT false, + questions jsonb DEFAULT '[]'::jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_skill_assessments_pkey PRIMARY KEY (id), + CONSTRAINT devlink_skill_assessments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_studios ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + company_profile_id uuid, + studio_name text, + description text, + roblox_group_id text, + roblox_group_data jsonb DEFAULT '{}'::jsonb, + user_role_in_group text, + user_rank_in_group integer, + verified boolean DEFAULT false, + status text DEFAULT 'active'::text, + member_count integer DEFAULT 0, + banner_url text, + total_games integer DEFAULT 0, + total_visits bigint DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_studios_pkey PRIMARY KEY (id), + CONSTRAINT devlink_studios_company_profile_id_fkey FOREIGN KEY (company_profile_id) REFERENCES public.devlink_company_profiles(id) +); +CREATE TABLE public.devlink_teams ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + name text NOT NULL, + description text, + owner_id uuid, + member_ids ARRAY DEFAULT '{}'::uuid[], + logo_url text, + status text DEFAULT 'active'::text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_teams_pkey PRIMARY KEY (id), + CONSTRAINT devlink_teams_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES public.devlink_profiles(id) +); +CREATE TABLE public.devlink_waitlist_signups ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + email text NOT NULL UNIQUE, + name text, + user_type text DEFAULT 'developer'::text, + referral_source text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT devlink_waitlist_signups_pkey PRIMARY KEY (id) +); +CREATE TABLE public.discord_checkins ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + discord_user_id character varying NOT NULL, + user_id uuid, + checkin_type character varying NOT NULL, + message text, + channel_id character varying, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT discord_checkins_pkey PRIMARY KEY (id), + CONSTRAINT discord_checkins_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.discord_config ( + key text NOT NULL, + value jsonb NOT NULL, + updated_at timestamp without time zone DEFAULT now(), + CONSTRAINT discord_config_pkey PRIMARY KEY (key) +); +CREATE TABLE public.discord_linking_sessions ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + session_token text NOT NULL UNIQUE, + expires_at timestamp without time zone NOT NULL, + created_at timestamp without time zone DEFAULT now(), + CONSTRAINT discord_linking_sessions_pkey PRIMARY KEY (id), + CONSTRAINT discord_linking_sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.discord_links ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + discord_id text NOT NULL UNIQUE, + user_id uuid NOT NULL, + primary_arm text DEFAULT 'labs'::text CHECK (primary_arm = ANY (ARRAY['labs'::text, 'gameforge'::text, 'corp'::text, 'foundation'::text, 'devlink'::text])), + linked_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now(), + CONSTRAINT discord_links_pkey PRIMARY KEY (id), + CONSTRAINT discord_links_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.discord_post_webhooks ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + guild_id text NOT NULL, + channel_id text NOT NULL, + webhook_url text NOT NULL, + webhook_id text NOT NULL, + arm_affiliation text NOT NULL, + auto_post boolean DEFAULT true, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT discord_post_webhooks_pkey PRIMARY KEY (id), + CONSTRAINT discord_post_webhooks_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.discord_role_mappings ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + arm text NOT NULL CHECK (arm = ANY (ARRAY['labs'::text, 'gameforge'::text, 'corp'::text, 'foundation'::text, 'devlink'::text])), + user_type text NOT NULL CHECK (user_type = ANY (ARRAY['game_developer'::text, 'community_member'::text, 'pro_supporter'::text, 'staff'::text, 'creator'::text])), + discord_role_name text NOT NULL, + discord_role_id text, + server_id text, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now(), + CONSTRAINT discord_role_mappings_pkey PRIMARY KEY (id) +); +CREATE TABLE public.discord_user_roles ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + discord_id text NOT NULL, + server_id text NOT NULL, + role_id text NOT NULL, + role_name text NOT NULL, + assigned_at timestamp without time zone DEFAULT now(), + last_verified timestamp without time zone, + CONSTRAINT discord_user_roles_pkey PRIMARY KEY (id) +); +CREATE TABLE public.discord_verifications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + discord_id text NOT NULL, + verification_code text NOT NULL UNIQUE, + expires_at timestamp without time zone NOT NULL, + created_at timestamp without time zone DEFAULT now(), + CONSTRAINT discord_verifications_pkey PRIMARY KEY (id) +); +CREATE TABLE public.doc_edits ( + id integer NOT NULL DEFAULT nextval('doc_edits_id_seq'::regclass), + space_id text NOT NULL, + page_id text NOT NULL, + title text NOT NULL, + content text NOT NULL, + updated_at timestamp with time zone DEFAULT now(), + updated_by text, + CONSTRAINT doc_edits_pkey PRIMARY KEY (id) +); +CREATE TABLE public.employee_data ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + site_id uuid NOT NULL, + personal_details jsonb, + job_history jsonb, + benefits_info jsonb, + compliance_docs jsonb, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT employee_data_pkey PRIMARY KEY (id), + CONSTRAINT employee_data_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT employee_data_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.employee_edits ( + id integer NOT NULL DEFAULT nextval('employee_edits_id_seq'::regclass), + employee_id text NOT NULL UNIQUE, + data jsonb NOT NULL, + updated_at timestamp with time zone DEFAULT now(), + updated_by text, + CONSTRAINT employee_edits_pkey PRIMARY KEY (id) +); +CREATE TABLE public.endorsements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + endorser_id uuid NOT NULL, + endorsed_id uuid NOT NULL, + skill text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT endorsements_pkey PRIMARY KEY (id), + CONSTRAINT endorsements_endorser_id_fkey FOREIGN KEY (endorser_id) REFERENCES auth.users(id), + CONSTRAINT endorsements_endorsed_id_fkey FOREIGN KEY (endorsed_id) REFERENCES auth.users(id) +); +CREATE TABLE public.ethos_artist_profiles ( + user_id uuid NOT NULL, + skills ARRAY NOT NULL DEFAULT '{}'::text[], + for_hire boolean NOT NULL DEFAULT true, + bio text, + portfolio_url text, + sample_price_track numeric, + sample_price_sfx numeric, + sample_price_score numeric, + turnaround_days integer, + verified boolean NOT NULL DEFAULT false, + total_downloads integer NOT NULL DEFAULT 0, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + price_list jsonb DEFAULT '{"day_rate": null, "sfx_pack": null, "full_score": null, "track_custom": null, "contact_for_quote": false}'::jsonb, + ecosystem_license_accepted boolean NOT NULL DEFAULT false, + ecosystem_license_accepted_at timestamp with time zone, + CONSTRAINT ethos_artist_profiles_pkey PRIMARY KEY (user_id), + CONSTRAINT ethos_artist_profiles_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.ethos_ecosystem_licenses ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + track_id uuid NOT NULL, + artist_id uuid NOT NULL, + accepted_at timestamp with time zone NOT NULL DEFAULT now(), + agreement_version text NOT NULL DEFAULT '1.0'::text, + agreement_text_hash text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT ethos_ecosystem_licenses_pkey PRIMARY KEY (id), + CONSTRAINT ethos_ecosystem_licenses_track_id_fkey FOREIGN KEY (track_id) REFERENCES public.ethos_tracks(id), + CONSTRAINT ethos_ecosystem_licenses_artist_id_fkey FOREIGN KEY (artist_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.ethos_guild_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + role text NOT NULL DEFAULT 'member'::text CHECK (role = ANY (ARRAY['member'::text, 'curator'::text, 'admin'::text])), + joined_at timestamp with time zone NOT NULL DEFAULT now(), + bio text, + CONSTRAINT ethos_guild_members_pkey PRIMARY KEY (id), + CONSTRAINT ethos_guild_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.ethos_licensing_agreements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + track_id uuid NOT NULL, + licensee_id uuid NOT NULL, + license_type text NOT NULL CHECK (license_type = ANY (ARRAY['commercial_one_time'::text, 'commercial_exclusive'::text, 'broadcast'::text])), + agreement_url text, + approved boolean NOT NULL DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + expires_at timestamp with time zone, + CONSTRAINT ethos_licensing_agreements_pkey PRIMARY KEY (id), + CONSTRAINT ethos_licensing_agreements_track_id_fkey FOREIGN KEY (track_id) REFERENCES public.ethos_tracks(id), + CONSTRAINT ethos_licensing_agreements_licensee_id_fkey FOREIGN KEY (licensee_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.ethos_service_requests ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + artist_id uuid NOT NULL, + requester_id uuid NOT NULL, + service_type text NOT NULL CHECK (service_type = ANY (ARRAY['track_custom'::text, 'sfx_pack'::text, 'full_score'::text, 'day_rate'::text, 'contact_for_quote'::text])), + description text NOT NULL, + budget numeric, + deadline timestamp with time zone, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'accepted'::text, 'declined'::text, 'in_progress'::text, 'completed'::text, 'cancelled'::text])), + notes text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT ethos_service_requests_pkey PRIMARY KEY (id), + CONSTRAINT ethos_service_requests_artist_id_fkey FOREIGN KEY (artist_id) REFERENCES public.user_profiles(id), + CONSTRAINT ethos_service_requests_requester_id_fkey FOREIGN KEY (requester_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.ethos_tracks ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + title text NOT NULL, + description text, + file_url text NOT NULL, + duration_seconds integer, + genre ARRAY, + license_type text NOT NULL DEFAULT 'ecosystem'::text CHECK (license_type = ANY (ARRAY['ecosystem'::text, 'commercial_sample'::text])), + bpm integer, + is_published boolean NOT NULL DEFAULT true, + download_count integer NOT NULL DEFAULT 0, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT ethos_tracks_pkey PRIMARY KEY (id), + CONSTRAINT ethos_tracks_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.ethos_verification_audit_log ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + request_id uuid NOT NULL, + action text NOT NULL CHECK (action = ANY (ARRAY['submitted'::text, 'approved'::text, 'rejected'::text, 'resubmitted'::text])), + actor_id uuid, + notes text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT ethos_verification_audit_log_pkey PRIMARY KEY (id), + CONSTRAINT ethos_verification_audit_log_request_id_fkey FOREIGN KEY (request_id) REFERENCES public.ethos_verification_requests(id), + CONSTRAINT ethos_verification_audit_log_actor_id_fkey FOREIGN KEY (actor_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.ethos_verification_requests ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + artist_profile_id uuid NOT NULL, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'approved'::text, 'rejected'::text])), + submitted_at timestamp with time zone NOT NULL DEFAULT now(), + reviewed_at timestamp with time zone, + reviewed_by uuid, + rejection_reason text, + submission_notes text, + portfolio_links ARRAY, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT ethos_verification_requests_pkey PRIMARY KEY (id), + CONSTRAINT ethos_verification_requests_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id), + CONSTRAINT ethos_verification_requests_artist_profile_id_fkey FOREIGN KEY (artist_profile_id) REFERENCES public.ethos_artist_profiles(user_id), + CONSTRAINT ethos_verification_requests_reviewed_by_fkey FOREIGN KEY (reviewed_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.experiences ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + creator_user_id uuid, + title text NOT NULL, + description text, + thumbnail_url text, + banner_url text, + version text DEFAULT '1.0.0'::text, + status text DEFAULT 'private'::text CHECK (status = ANY (ARRAY['public'::text, 'private'::text, 'under_review'::text])), + tags ARRAY, + player_count integer DEFAULT 0, + max_players integer DEFAULT 10, + server_size integer DEFAULT 10, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + slug text, + is_published boolean DEFAULT false, + creator_group_id uuid, + roblox_place_id bigint, + CONSTRAINT experiences_pkey PRIMARY KEY (id), + CONSTRAINT experiences_creator_id_fkey FOREIGN KEY (creator_user_id) REFERENCES public.profiles(id), + CONSTRAINT experiences_creator_group_id_fkey FOREIGN KEY (creator_group_id) REFERENCES public.groups(id) +); +CREATE TABLE public.fan_art ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid, + user_id uuid, + title text NOT NULL, + description text, + image_url text NOT NULL, + is_approved boolean DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + is_featured boolean NOT NULL DEFAULT false, + username text, + CONSTRAINT fan_art_pkey PRIMARY KEY (id) +); +CREATE TABLE public.faqs ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + question text NOT NULL, + answer text NOT NULL, + category text, + display_order integer, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT faqs_pkey PRIMARY KEY (id), + CONSTRAINT fk_site FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.featured_studios ( + id bigint NOT NULL DEFAULT nextval('featured_studios_id_seq'::regclass), + name text NOT NULL UNIQUE, + tagline text, + metrics text, + specialties ARRAY, + rank integer, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT featured_studios_pkey PRIMARY KEY (id) +); +CREATE TABLE public.federation_applications ( + id integer NOT NULL DEFAULT nextval('federation_applications_id_seq'::regclass), + guild_id character varying NOT NULL UNIQUE, + guild_name character varying, + guild_icon character varying, + owner_id character varying, + member_count integer DEFAULT 0, + reason text, + status character varying DEFAULT 'pending'::character varying, + reviewed_by character varying, + reviewed_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT federation_applications_pkey PRIMARY KEY (id) +); +CREATE TABLE public.federation_bans ( + id integer NOT NULL DEFAULT nextval('federation_bans_id_seq'::regclass), + user_id character varying NOT NULL, + username character varying, + reason text, + evidence text, + severity character varying DEFAULT 'low'::character varying, + reported_by character varying, + reported_by_guild_id character varying, + active boolean DEFAULT true, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT federation_bans_pkey PRIMARY KEY (id) +); +CREATE TABLE public.federation_featured ( + id integer NOT NULL DEFAULT nextval('federation_featured_id_seq'::regclass), + guild_id character varying NOT NULL UNIQUE, + subscription_id character varying, + active boolean DEFAULT true, + expires_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT federation_featured_pkey PRIMARY KEY (id) +); +CREATE TABLE public.federation_mappings ( + role_id text NOT NULL, + role_name text, + guild_id text, + guild_name text, + linked_at timestamp with time zone DEFAULT now(), + CONSTRAINT federation_mappings_pkey PRIMARY KEY (role_id) +); +CREATE TABLE public.federation_reputation ( + id integer NOT NULL DEFAULT nextval('federation_reputation_id_seq'::regclass), + guild_id character varying NOT NULL UNIQUE, + valid_reports integer DEFAULT 0, + false_positives integer DEFAULT 0, + total_reports integer DEFAULT 0, + last_updated timestamp with time zone DEFAULT now(), + CONSTRAINT federation_reputation_pkey PRIMARY KEY (id) +); +CREATE TABLE public.federation_servers ( + id integer NOT NULL DEFAULT nextval('federation_servers_id_seq'::regclass), + guild_id character varying NOT NULL UNIQUE, + guild_name character varying, + guild_icon character varying, + owner_id character varying, + member_count integer DEFAULT 0, + status character varying DEFAULT 'pending'::character varying, + tier character varying DEFAULT 'free'::character varying, + trust_level character varying DEFAULT 'bronze'::character varying, + reputation_score integer DEFAULT 0, + subscription_id character varying, + subscription_status character varying, + invite_code character varying, + description text, + joined_federation_at timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT federation_servers_pkey PRIMARY KEY (id) +); +CREATE TABLE public.feedback_surveys ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + description text, + questions jsonb, + is_active boolean DEFAULT true, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT feedback_surveys_pkey PRIMARY KEY (id), + CONSTRAINT feedback_surveys_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.followers ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + follower_id uuid NOT NULL, + following_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT followers_pkey PRIMARY KEY (id), + CONSTRAINT followers_follower_id_fkey FOREIGN KEY (follower_id) REFERENCES public.profiles(id), + CONSTRAINT followers_following_id_fkey FOREIGN KEY (following_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.forum_categories ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + display_order integer, + site_id uuid, + slug text UNIQUE, + CONSTRAINT forum_categories_pkey PRIMARY KEY (id), + CONSTRAINT forum_categories_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.forum_comments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + post_id uuid, + user_id uuid, + parent_comment_id uuid, + content text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT forum_comments_pkey PRIMARY KEY (id), + CONSTRAINT forum_comments_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.forum_posts(id), + CONSTRAINT forum_comments_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT forum_comments_parent_comment_id_fkey FOREIGN KEY (parent_comment_id) REFERENCES public.forum_comments(id) +); +CREATE TABLE public.forum_likes ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + post_id uuid, + comment_id uuid, + user_id uuid, + reaction_type text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT forum_likes_pkey PRIMARY KEY (id), + CONSTRAINT forum_likes_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.forum_posts(id), + CONSTRAINT forum_likes_comment_id_fkey FOREIGN KEY (comment_id) REFERENCES public.forum_comments(id), + CONSTRAINT forum_likes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.forum_post_tags ( + post_id uuid NOT NULL, + tag_id uuid NOT NULL, + CONSTRAINT forum_post_tags_pkey PRIMARY KEY (post_id, tag_id), + CONSTRAINT forum_post_tags_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.forum_posts(id), + CONSTRAINT forum_post_tags_tag_id_fkey FOREIGN KEY (tag_id) REFERENCES public.forum_tags(id) +); +CREATE TABLE public.forum_posts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + category_id uuid, + user_id uuid, + title text NOT NULL, + content text, + views_count integer DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + site_id uuid, + slug text, + last_activity_at timestamp with time zone DEFAULT now(), + CONSTRAINT forum_posts_pkey PRIMARY KEY (id), + CONSTRAINT forum_posts_category_id_fkey FOREIGN KEY (category_id) REFERENCES public.forum_categories(id), + CONSTRAINT forum_posts_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT forum_posts_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.forum_tags ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT forum_tags_pkey PRIMARY KEY (id) +); +CREATE TABLE public.foundation_activity ( + id integer NOT NULL DEFAULT nextval('foundation_activity_id_seq'::regclass), + member_id uuid, + action text, + points integer DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT foundation_activity_pkey PRIMARY KEY (id) +); +CREATE TABLE public.foundation_contributions ( + id integer NOT NULL DEFAULT nextval('foundation_contributions_id_seq'::regclass), + contributor_id uuid, + type text, + amount numeric, + description text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT foundation_contributions_pkey PRIMARY KEY (id) +); +CREATE TABLE public.foundation_course_content ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + course_id uuid NOT NULL, + content_type text NOT NULL CHECK (content_type = ANY (ARRAY['markdown'::text, 'pdf'::text, 'code-sample'::text, 'video-link'::text])), + title text NOT NULL, + content_url text, + file_size_kb integer DEFAULT 0, + chapter_count integer DEFAULT 1, + download_count integer DEFAULT 0, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now(), + CONSTRAINT foundation_course_content_pkey PRIMARY KEY (id), + CONSTRAINT foundation_course_content_course_id_fkey FOREIGN KEY (course_id) REFERENCES public.foundation_courses(id) +); +CREATE TABLE public.foundation_course_materials ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + course_id uuid NOT NULL, + title text NOT NULL, + content text NOT NULL, + format text NOT NULL CHECK (format = ANY (ARRAY['markdown'::text, 'pdf'::text, 'code'::text, 'video'::text])), + file_size_kb integer DEFAULT 0, + download_count integer DEFAULT 0, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now(), + CONSTRAINT foundation_course_materials_pkey PRIMARY KEY (id), + CONSTRAINT foundation_course_materials_course_id_fkey FOREIGN KEY (course_id) REFERENCES public.foundation_courses(id) +); +CREATE TABLE public.foundation_courses ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + slug text NOT NULL UNIQUE, + title text NOT NULL, + description text NOT NULL, + content text, + category text NOT NULL CHECK (category = ANY (ARRAY['game-dev'::text, 'web-dev'::text, 'ai-ml'::text, 'design'::text, 'business'::text])), + difficulty text NOT NULL CHECK (difficulty = ANY (ARRAY['beginner'::text, 'intermediate'::text, 'advanced'::text])), + instructor_id uuid, + cover_image_url text, + estimated_hours integer DEFAULT 0, + is_published boolean DEFAULT false, + created_at timestamp without time zone DEFAULT now(), + updated_at timestamp without time zone DEFAULT now(), + CONSTRAINT foundation_courses_pkey PRIMARY KEY (id), + CONSTRAINT foundation_courses_instructor_id_fkey FOREIGN KEY (instructor_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.foundation_mentorship_requests ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + mentor_id uuid NOT NULL, + mentee_id uuid NOT NULL, + message text, + expertise_area text, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'accepted'::text, 'rejected'::text, 'cancelled'::text])), + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT foundation_mentorship_requests_pkey PRIMARY KEY (id), + CONSTRAINT foundation_mentorship_requests_mentor_id_fkey FOREIGN KEY (mentor_id) REFERENCES public.user_profiles(id), + CONSTRAINT foundation_mentorship_requests_mentee_id_fkey FOREIGN KEY (mentee_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.fourthwall_orders ( + id bigint NOT NULL DEFAULT nextval('fourthwall_orders_id_seq'::regclass), + fourthwall_order_id text NOT NULL UNIQUE, + customer_email text NOT NULL, + items jsonb DEFAULT '[]'::jsonb, + total_amount numeric NOT NULL, + status text NOT NULL DEFAULT 'pending'::text, + paid_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT fourthwall_orders_pkey PRIMARY KEY (id) +); +CREATE TABLE public.fourthwall_products ( + id bigint NOT NULL DEFAULT nextval('fourthwall_products_id_seq'::regclass), + fourthwall_id text NOT NULL UNIQUE, + name text NOT NULL, + description text, + price numeric NOT NULL, + currency text NOT NULL DEFAULT 'USD'::text, + image_url text, + category text, + synced_at timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT fourthwall_products_pkey PRIMARY KEY (id) +); +CREATE TABLE public.fourthwall_webhook_logs ( + id bigint NOT NULL DEFAULT nextval('fourthwall_webhook_logs_id_seq'::regclass), + event_type text NOT NULL, + payload jsonb, + received_at timestamp with time zone DEFAULT now(), + CONSTRAINT fourthwall_webhook_logs_pkey PRIMARY KEY (id) +); +CREATE TABLE public.game_auth_tokens ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + game text NOT NULL, + token text NOT NULL UNIQUE, + player_token text, + expires_at timestamp without time zone NOT NULL, + created_at timestamp without time zone DEFAULT now(), + last_used timestamp without time zone, + metadata jsonb DEFAULT '{}'::jsonb, + CONSTRAINT game_auth_tokens_pkey PRIMARY KEY (id), + CONSTRAINT game_auth_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.game_sessions ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + game text NOT NULL, + session_token text NOT NULL UNIQUE, + device_id text, + platform text, + expires_at timestamp without time zone NOT NULL, + last_activity timestamp without time zone DEFAULT now(), + created_at timestamp without time zone DEFAULT now(), + CONSTRAINT game_sessions_pkey PRIMARY KEY (id), + CONSTRAINT game_sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.gameforge_builds ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid NOT NULL, + version text NOT NULL, + build_type text NOT NULL CHECK (build_type = ANY (ARRAY['alpha'::text, 'beta'::text, 'release_candidate'::text, 'final'::text])), + release_date timestamp with time zone NOT NULL DEFAULT now(), + download_url text, + changelog text, + file_size bigint, + target_platforms ARRAY NOT NULL DEFAULT '{}'::text[], + download_count integer NOT NULL DEFAULT 0, + created_by uuid, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT gameforge_builds_pkey PRIMARY KEY (id), + CONSTRAINT gameforge_builds_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.gameforge_projects(id), + CONSTRAINT gameforge_builds_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.gameforge_metrics ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid NOT NULL, + metric_date timestamp with time zone NOT NULL DEFAULT now(), + metric_type text NOT NULL CHECK (metric_type = ANY (ARRAY['monthly'::text, 'sprint'::text, 'milestone'::text])), + velocity integer, + hours_logged integer, + team_size_avg integer, + bugs_found integer DEFAULT 0, + bugs_fixed integer DEFAULT 0, + build_count integer DEFAULT 0, + days_from_planned_to_release integer, + on_schedule boolean, + budget_allocated numeric, + budget_spent numeric, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT gameforge_metrics_pkey PRIMARY KEY (id), + CONSTRAINT gameforge_metrics_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.gameforge_projects(id) +); +CREATE TABLE public.gameforge_projects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + status text NOT NULL DEFAULT 'planning'::text CHECK (status = ANY (ARRAY['planning'::text, 'in_development'::text, 'qa'::text, 'released'::text, 'hiatus'::text, 'cancelled'::text])), + lead_id uuid NOT NULL, + platform text NOT NULL CHECK (platform = ANY (ARRAY['Unity'::text, 'Unreal'::text, 'Godot'::text, 'Custom'::text, 'WebGL'::text])), + genre ARRAY NOT NULL DEFAULT '{}'::text[], + target_release_date timestamp with time zone, + actual_release_date timestamp with time zone, + budget numeric, + current_spend numeric NOT NULL DEFAULT 0, + team_size integer DEFAULT 0, + repository_url text, + documentation_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT gameforge_projects_pkey PRIMARY KEY (id), + CONSTRAINT gameforge_projects_lead_id_fkey FOREIGN KEY (lead_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.gameforge_sprint_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + sprint_id uuid NOT NULL, + user_id uuid NOT NULL, + role text NOT NULL DEFAULT 'contributor'::text CHECK (role = ANY (ARRAY['lead'::text, 'contributor'::text, 'reviewer'::text])), + joined_at timestamp with time zone NOT NULL DEFAULT now(), + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT gameforge_sprint_members_pkey PRIMARY KEY (id), + CONSTRAINT gameforge_sprint_members_sprint_id_fkey FOREIGN KEY (sprint_id) REFERENCES public.gameforge_sprints(id), + CONSTRAINT gameforge_sprint_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.gameforge_sprints ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid NOT NULL, + sprint_number integer NOT NULL, + title text NOT NULL, + description text, + phase text NOT NULL DEFAULT 'planning'::text CHECK (phase = ANY (ARRAY['planning'::text, 'active'::text, 'completed'::text, 'cancelled'::text])), + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'active'::text, 'on_hold'::text, 'completed'::text])), + goal text, + start_date timestamp with time zone, + end_date timestamp with time zone, + planned_velocity integer, + actual_velocity integer, + created_by uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT gameforge_sprints_pkey PRIMARY KEY (id), + CONSTRAINT gameforge_sprints_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.gameforge_projects(id), + CONSTRAINT gameforge_sprints_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.gameforge_tasks ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + sprint_id uuid, + project_id uuid NOT NULL, + title text NOT NULL, + description text, + status text NOT NULL DEFAULT 'todo'::text CHECK (status = ANY (ARRAY['todo'::text, 'in_progress'::text, 'in_review'::text, 'done'::text, 'blocked'::text])), + priority text NOT NULL DEFAULT 'medium'::text CHECK (priority = ANY (ARRAY['low'::text, 'medium'::text, 'high'::text, 'critical'::text])), + estimated_hours numeric, + actual_hours numeric, + assigned_to uuid, + created_by uuid NOT NULL, + due_date timestamp with time zone, + completed_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT gameforge_tasks_pkey PRIMARY KEY (id), + CONSTRAINT gameforge_tasks_sprint_id_fkey FOREIGN KEY (sprint_id) REFERENCES public.gameforge_sprints(id), + CONSTRAINT gameforge_tasks_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.gameforge_projects(id), + CONSTRAINT gameforge_tasks_assigned_to_fkey FOREIGN KEY (assigned_to) REFERENCES public.user_profiles(id), + CONSTRAINT gameforge_tasks_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.gameforge_team_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + role text NOT NULL CHECK (role = ANY (ARRAY['engineer'::text, 'designer'::text, 'artist'::text, 'producer'::text, 'qa'::text, 'sound_designer'::text, 'writer'::text, 'manager'::text])), + position text, + contract_type text NOT NULL DEFAULT 'employee'::text CHECK (contract_type = ANY (ARRAY['employee'::text, 'contractor'::text, 'consultant'::text, 'intern'::text])), + hourly_rate numeric, + project_ids ARRAY NOT NULL DEFAULT '{}'::uuid[], + skills ARRAY DEFAULT '{}'::text[], + bio text, + joined_date timestamp with time zone NOT NULL DEFAULT now(), + left_date timestamp with time zone, + is_active boolean NOT NULL DEFAULT true, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT gameforge_team_members_pkey PRIMARY KEY (id), + CONSTRAINT gameforge_team_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.giveaways ( + message_id text NOT NULL, + channel_id text, + guild_id text, + prize text, + winners_count integer DEFAULT 1, + required_role text, + host_id text, + end_time timestamp with time zone, + entries jsonb DEFAULT '[]'::jsonb, + status text DEFAULT 'active'::text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT giveaways_pkey PRIMARY KEY (message_id) +); +CREATE TABLE public.goals ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + site_id uuid NOT NULL, + title text NOT NULL, + description text, + status text DEFAULT 'in_progress'::text, + progress integer DEFAULT 0, + due_date date, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT goals_pkey PRIMARY KEY (id), + CONSTRAINT goals_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT goals_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.grid_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + discord_id text NOT NULL UNIQUE, + discord_username text NOT NULL, + display_name text, + avatar_url text, + bio text DEFAULT 'Grid member via Discord Activity'::text, + xp integer DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT grid_members_pkey PRIMARY KEY (id) +); +CREATE TABLE public.group_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + group_id uuid NOT NULL, + user_id uuid NOT NULL, + joined_at timestamp with time zone NOT NULL DEFAULT now(), + group_role_id uuid, + role text NOT NULL DEFAULT 'member'::text, + CONSTRAINT group_members_pkey PRIMARY KEY (id), + CONSTRAINT group_members_group_id_fkey FOREIGN KEY (group_id) REFERENCES public.groups(id), + CONSTRAINT group_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT group_members_group_role_id_fkey FOREIGN KEY (group_role_id) REFERENCES public.group_roles(id) +); +CREATE TABLE public.group_roles ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + group_id uuid NOT NULL, + name text NOT NULL, + permissions jsonb NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT group_roles_pkey PRIMARY KEY (id), + CONSTRAINT group_roles_group_id_fkey FOREIGN KEY (group_id) REFERENCES public.groups(id) +); +CREATE TABLE public.groups ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + owner_id uuid NOT NULL, + name text NOT NULL UNIQUE, + slug text NOT NULL UNIQUE, + description text, + avatar_url text, + banner_url text, + is_verified boolean DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT groups_pkey PRIMARY KEY (id), + CONSTRAINT groups_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.guild_user_xp ( + id integer NOT NULL DEFAULT nextval('guild_user_xp_id_seq'::regclass), + guild_id character varying NOT NULL, + user_id character varying NOT NULL, + xp integer DEFAULT 0, + level integer DEFAULT 0, + prestige integer DEFAULT 0, + messages integer DEFAULT 0, + voice_minutes integer DEFAULT 0, + last_xp_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT guild_user_xp_pkey PRIMARY KEY (id) +); +CREATE TABLE public.help_requests ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + requester_id uuid NOT NULL, + requester_username character varying NOT NULL, + title text NOT NULL, + description text, + category character varying NOT NULL, + status character varying DEFAULT 'open'::character varying, + helper_id uuid, + helper_username character varying, + created_at timestamp with time zone DEFAULT now(), + resolved_at timestamp with time zone, + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT help_requests_pkey PRIMARY KEY (id), + CONSTRAINT help_requests_requester_id_fkey FOREIGN KEY (requester_id) REFERENCES public.user_profiles(id), + CONSTRAINT help_requests_helper_id_fkey FOREIGN KEY (helper_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.inspirations ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + title text NOT NULL, + description text, + image_url text, + category text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + location_name text, + latitude numeric, + longitude numeric, + CONSTRAINT inspirations_pkey PRIMARY KEY (id) +); +CREATE TABLE public.interested_prospects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + full_name text NOT NULL, + email text NOT NULL UNIQUE, + area_of_interest text, + linkedin_url text, + submitted_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT interested_prospects_pkey PRIMARY KEY (id) +); +CREATE TABLE public.invitations ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + token text NOT NULL UNIQUE, + email text NOT NULL, + role text NOT NULL, + status text NOT NULL DEFAULT 'pending'::text, + created_at timestamp with time zone DEFAULT now(), + expires_at timestamp with time zone NOT NULL, + CONSTRAINT invitations_pkey PRIMARY KEY (id), + CONSTRAINT invitations_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.invites ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + inviter_id uuid NOT NULL, + invitee_email text NOT NULL, + token text NOT NULL UNIQUE, + status text NOT NULL DEFAULT 'pending'::text, + accepted_by uuid, + created_at timestamp with time zone NOT NULL DEFAULT now(), + accepted_at timestamp with time zone, + message text, + CONSTRAINT invites_pkey PRIMARY KEY (id), + CONSTRAINT invites_inviter_id_fkey FOREIGN KEY (inviter_id) REFERENCES auth.users(id), + CONSTRAINT invites_accepted_by_fkey FOREIGN KEY (accepted_by) REFERENCES auth.users(id) +); +CREATE TABLE public.invoices ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + sender_id uuid NOT NULL, + recipient_id uuid, + site_id uuid NOT NULL, + amount numeric NOT NULL, + due_date date, + status text DEFAULT 'pending'::text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT invoices_pkey PRIMARY KEY (id), + CONSTRAINT invoices_sender_id_fkey FOREIGN KEY (sender_id) REFERENCES public.profiles(id), + CONSTRAINT invoices_recipient_id_fkey FOREIGN KEY (recipient_id) REFERENCES public.profiles(id), + CONSTRAINT invoices_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.ip_blacklist ( + id character varying NOT NULL DEFAULT (gen_random_uuid())::character varying, + ip_address text NOT NULL UNIQUE, + reason text, + added_by character varying, + expires_at timestamp without time zone, + created_at timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT ip_blacklist_pkey PRIMARY KEY (id), + CONSTRAINT ip_blacklist_added_by_fkey FOREIGN KEY (added_by) REFERENCES public.users(id) +); +CREATE TABLE public.job_applications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + job_id uuid NOT NULL, + user_id uuid NOT NULL, + resume_url text NOT NULL, + cover_letter text, + status text NOT NULL DEFAULT 'Under Review'::text, + submitted_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT job_applications_pkey PRIMARY KEY (id), + CONSTRAINT job_applications_job_id_fkey FOREIGN KEY (job_id) REFERENCES public.job_openings(id), + CONSTRAINT job_applications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.job_openings ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + description text, + department text, + location text, + status text DEFAULT 'open'::text, + is_internal boolean DEFAULT false, + posted_at timestamp with time zone DEFAULT now(), + CONSTRAINT job_openings_pkey PRIMARY KEY (id), + CONSTRAINT job_openings_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.knowledge_base ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + question text NOT NULL, + answer text NOT NULL, + category text, + tags ARRAY, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT knowledge_base_pkey PRIMARY KEY (id), + CONSTRAINT knowledge_base_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.level_roles ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + level_threshold integer NOT NULL UNIQUE, + role_name text NOT NULL, + icon text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT level_roles_pkey PRIMARY KEY (id) +); +CREATE TABLE public.listings ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + seller_id uuid NOT NULL, + title text NOT NULL, + description text, + price numeric NOT NULL, + category text, + status text NOT NULL DEFAULT 'active'::text, + images ARRAY, + featured boolean DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT listings_pkey PRIMARY KEY (id), + CONSTRAINT listings_seller_id_fkey FOREIGN KEY (seller_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.marketplace_listings ( + id bigint NOT NULL DEFAULT nextval('marketplace_listings_id_seq'::regclass), + asset_id bigint, + token_id text, + contract_address text, + chain_id integer, + seller_address text NOT NULL, + seller_id uuid, + listing_type text NOT NULL, + item_type text NOT NULL, + title text NOT NULL, + description text, + price numeric NOT NULL, + price_currency text NOT NULL DEFAULT 'ETH'::text, + quantity numeric DEFAULT 1, + starting_price numeric, + reserve_price numeric, + current_bid numeric, + highest_bidder_address text, + auction_end_time timestamp with time zone, + file_url text, + download_url text, + preview_url text, + license_type text, + status text DEFAULT 'active'::text, + expires_at timestamp with time zone, + signature text, + nonce text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT marketplace_listings_pkey PRIMARY KEY (id), + CONSTRAINT marketplace_listings_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES public.nft_assets(id), + CONSTRAINT marketplace_listings_seller_id_fkey FOREIGN KEY (seller_id) REFERENCES auth.users(id) +); +CREATE TABLE public.marketplace_offers ( + id bigint NOT NULL DEFAULT nextval('marketplace_offers_id_seq'::regclass), + listing_id bigint, + asset_id bigint, + collection_id bigint, + offerer_address text NOT NULL, + offerer_id uuid, + price numeric NOT NULL, + price_currency text NOT NULL DEFAULT 'ETH'::text, + quantity numeric DEFAULT 1, + status text DEFAULT 'active'::text, + expires_at timestamp with time zone NOT NULL, + signature text, + nonce text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT marketplace_offers_pkey PRIMARY KEY (id), + CONSTRAINT marketplace_offers_listing_id_fkey FOREIGN KEY (listing_id) REFERENCES public.marketplace_listings(id), + CONSTRAINT marketplace_offers_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES public.nft_assets(id), + CONSTRAINT marketplace_offers_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES public.nft_collections(id), + CONSTRAINT marketplace_offers_offerer_id_fkey FOREIGN KEY (offerer_id) REFERENCES auth.users(id) +); +CREATE TABLE public.mentors ( + user_id uuid NOT NULL, + bio text, + expertise ARRAY NOT NULL DEFAULT '{}'::text[], + available boolean NOT NULL DEFAULT true, + hourly_rate numeric, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT mentors_pkey PRIMARY KEY (user_id), + CONSTRAINT mentors_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.mentorship_requests ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + mentor_id uuid NOT NULL, + mentee_id uuid NOT NULL, + message text, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'accepted'::text, 'rejected'::text, 'cancelled'::text])), + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT mentorship_requests_pkey PRIMARY KEY (id), + CONSTRAINT mentorship_requests_mentor_id_fkey FOREIGN KEY (mentor_id) REFERENCES public.user_profiles(id), + CONSTRAINT mentorship_requests_mentee_id_fkey FOREIGN KEY (mentee_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.messages ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + conversation_id uuid NOT NULL, + sender_id uuid NOT NULL, + content text NOT NULL, + is_read boolean NOT NULL DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + subject text, + type text NOT NULL DEFAULT 'dm'::text, + CONSTRAINT messages_pkey PRIMARY KEY (id), + CONSTRAINT messages_conversation_id_fkey FOREIGN KEY (conversation_id) REFERENCES public.conversations(id), + CONSTRAINT messages_sender_id_fkey FOREIGN KEY (sender_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.mod_actions ( + id integer NOT NULL DEFAULT nextval('mod_actions_id_seq'::regclass), + guild_id text NOT NULL, + action text NOT NULL, + user_id text NOT NULL, + user_tag text, + moderator_id text NOT NULL, + moderator_tag text, + reason text, + duration_minutes integer, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT mod_actions_pkey PRIMARY KEY (id) +); +CREATE TABLE public.moderation_reports ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + reporter_id uuid, + target_type text NOT NULL CHECK (target_type = ANY (ARRAY['post'::text, 'comment'::text, 'user'::text, 'project'::text, 'other'::text])), + target_id uuid, + reason text NOT NULL, + details text, + status text NOT NULL DEFAULT 'open'::text CHECK (status = ANY (ARRAY['open'::text, 'resolved'::text, 'ignored'::text])), + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT moderation_reports_pkey PRIMARY KEY (id), + CONSTRAINT moderation_reports_reporter_id_fkey FOREIGN KEY (reporter_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.mrpiglr_events ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid, + title text NOT NULL, + description text, + start_time timestamp with time zone NOT NULL, + end_time timestamp with time zone, + event_type text, + image_url text, + stream_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT mrpiglr_events_pkey PRIMARY KEY (id), + CONSTRAINT mrpiglr_events_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.mrpiglr_site_badges ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + icon text, + color text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + category text, + tier integer, + required_value integer, + CONSTRAINT mrpiglr_site_badges_pkey PRIMARY KEY (id) +); +CREATE TABLE public.mrpiglr_waitlist ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + email text NOT NULL UNIQUE, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT mrpiglr_waitlist_pkey PRIMARY KEY (id) +); +CREATE TABLE public.music ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + title text NOT NULL, + artist text NOT NULL, + album text, + year text, + genre text, + duration text, + youtube_id text, + description text, + image_prompt text, + image_url text, + links jsonb, + display_order smallint, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT music_pkey PRIMARY KEY (id) +); +CREATE TABLE public.newsletter_subscribers ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + email text NOT NULL UNIQUE, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT newsletter_subscribers_pkey PRIMARY KEY (id) +); +CREATE TABLE public.nexus_applications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + opportunity_id uuid NOT NULL, + creator_id uuid NOT NULL, + status text NOT NULL DEFAULT 'submitted'::text CHECK (status = ANY (ARRAY['submitted'::text, 'reviewing'::text, 'accepted'::text, 'rejected'::text, 'hired'::text, 'archived'::text])), + cover_letter text, + proposed_rate numeric, + proposal text, + application_questions jsonb, + viewed_at timestamp with time zone, + responded_at timestamp with time zone, + response_message text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_applications_pkey PRIMARY KEY (id), + CONSTRAINT nexus_applications_opportunity_id_fkey FOREIGN KEY (opportunity_id) REFERENCES public.nexus_opportunities(id), + CONSTRAINT nexus_applications_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nexus_commission_ledger ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + payment_id uuid, + period_start date, + period_end date, + total_volume numeric NOT NULL, + total_commission numeric NOT NULL, + creator_payouts numeric NOT NULL, + aethex_revenue numeric NOT NULL, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'settled'::text, 'disputed'::text])), + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_commission_ledger_pkey PRIMARY KEY (id), + CONSTRAINT nexus_commission_ledger_payment_id_fkey FOREIGN KEY (payment_id) REFERENCES public.nexus_payments(id) +); +CREATE TABLE public.nexus_contracts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + opportunity_id uuid, + creator_id uuid NOT NULL, + client_id uuid NOT NULL, + title text NOT NULL, + description text, + contract_type text NOT NULL CHECK (contract_type = ANY (ARRAY['one-time'::text, 'retainer'::text, 'hourly'::text])), + total_amount numeric NOT NULL, + aethex_commission_percent numeric NOT NULL DEFAULT 20, + aethex_commission_amount numeric NOT NULL DEFAULT 0, + creator_payout_amount numeric NOT NULL DEFAULT 0, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'active'::text, 'completed'::text, 'disputed'::text, 'cancelled'::text])), + start_date timestamp with time zone, + end_date timestamp with time zone, + milestone_count integer DEFAULT 1, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + stripe_payment_intent_id text, + CONSTRAINT nexus_contracts_pkey PRIMARY KEY (id), + CONSTRAINT nexus_contracts_opportunity_id_fkey FOREIGN KEY (opportunity_id) REFERENCES public.nexus_opportunities(id), + CONSTRAINT nexus_contracts_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_contracts_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nexus_conversations ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + participant_1 uuid NOT NULL, + participant_2 uuid NOT NULL, + opportunity_id uuid, + contract_id uuid, + subject text, + last_message_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_conversations_pkey PRIMARY KEY (id), + CONSTRAINT nexus_conversations_participant_1_fkey FOREIGN KEY (participant_1) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_conversations_participant_2_fkey FOREIGN KEY (participant_2) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_conversations_opportunity_id_fkey FOREIGN KEY (opportunity_id) REFERENCES public.nexus_opportunities(id), + CONSTRAINT nexus_conversations_contract_id_fkey FOREIGN KEY (contract_id) REFERENCES public.nexus_contracts(id) +); +CREATE TABLE public.nexus_creator_profiles ( + user_id uuid NOT NULL, + headline text, + bio text, + profile_image_url text, + skills ARRAY NOT NULL DEFAULT '{}'::text[], + experience_level text NOT NULL DEFAULT 'intermediate'::text CHECK (experience_level = ANY (ARRAY['beginner'::text, 'intermediate'::text, 'advanced'::text, 'expert'::text])), + hourly_rate numeric, + portfolio_url text, + availability_status text NOT NULL DEFAULT 'available'::text CHECK (availability_status = ANY (ARRAY['available'::text, 'busy'::text, 'unavailable'::text])), + availability_hours_per_week integer, + verified boolean NOT NULL DEFAULT false, + total_earnings numeric NOT NULL DEFAULT 0, + rating numeric, + review_count integer NOT NULL DEFAULT 0, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + stripe_connect_account_id text, + stripe_account_verified boolean DEFAULT false, + CONSTRAINT nexus_creator_profiles_pkey PRIMARY KEY (user_id), + CONSTRAINT nexus_creator_profiles_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nexus_disputes ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + contract_id uuid NOT NULL, + reported_by uuid NOT NULL, + reason text NOT NULL, + description text, + evidence_urls ARRAY DEFAULT '{}'::text[], + status text NOT NULL DEFAULT 'open'::text CHECK (status = ANY (ARRAY['open'::text, 'reviewing'::text, 'resolved'::text, 'escalated'::text])), + resolution_notes text, + resolved_by uuid, + resolved_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_disputes_pkey PRIMARY KEY (id), + CONSTRAINT nexus_disputes_contract_id_fkey FOREIGN KEY (contract_id) REFERENCES public.nexus_contracts(id), + CONSTRAINT nexus_disputes_reported_by_fkey FOREIGN KEY (reported_by) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_disputes_resolved_by_fkey FOREIGN KEY (resolved_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nexus_messages ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + conversation_id uuid, + sender_id uuid NOT NULL, + recipient_id uuid NOT NULL, + opportunity_id uuid, + contract_id uuid, + message_text text NOT NULL, + is_read boolean NOT NULL DEFAULT false, + read_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_messages_pkey PRIMARY KEY (id), + CONSTRAINT nexus_messages_sender_id_fkey FOREIGN KEY (sender_id) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_messages_recipient_id_fkey FOREIGN KEY (recipient_id) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_messages_opportunity_id_fkey FOREIGN KEY (opportunity_id) REFERENCES public.nexus_opportunities(id), + CONSTRAINT nexus_messages_contract_id_fkey FOREIGN KEY (contract_id) REFERENCES public.nexus_contracts(id) +); +CREATE TABLE public.nexus_milestones ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + contract_id uuid NOT NULL, + milestone_number integer NOT NULL, + description text, + amount numeric NOT NULL, + due_date timestamp with time zone, + status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'submitted'::text, 'approved'::text, 'paid'::text, 'rejected'::text])), + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_milestones_pkey PRIMARY KEY (id), + CONSTRAINT nexus_milestones_contract_id_fkey FOREIGN KEY (contract_id) REFERENCES public.nexus_contracts(id) +); +CREATE TABLE public.nexus_opportunities ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + posted_by uuid NOT NULL, + title text NOT NULL, + description text NOT NULL, + category text NOT NULL, + required_skills ARRAY NOT NULL DEFAULT '{}'::text[], + budget_type text NOT NULL CHECK (budget_type = ANY (ARRAY['hourly'::text, 'fixed'::text, 'range'::text])), + budget_min numeric, + budget_max numeric, + timeline_type text NOT NULL DEFAULT 'flexible'::text CHECK (timeline_type = ANY (ARRAY['urgent'::text, 'short-term'::text, 'long-term'::text, 'ongoing'::text, 'flexible'::text])), + duration_weeks integer, + location_requirement text DEFAULT 'remote'::text CHECK (location_requirement = ANY (ARRAY['remote'::text, 'onsite'::text, 'hybrid'::text])), + required_experience text DEFAULT 'any'::text CHECK (required_experience = ANY (ARRAY['any'::text, 'beginner'::text, 'intermediate'::text, 'advanced'::text, 'expert'::text])), + company_name text, + status text NOT NULL DEFAULT 'open'::text CHECK (status = ANY (ARRAY['open'::text, 'in_progress'::text, 'filled'::text, 'closed'::text, 'cancelled'::text])), + application_count integer NOT NULL DEFAULT 0, + selected_creator_id uuid, + views integer NOT NULL DEFAULT 0, + is_featured boolean NOT NULL DEFAULT false, + published_at timestamp with time zone NOT NULL DEFAULT now(), + closed_at timestamp with time zone, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_opportunities_pkey PRIMARY KEY (id), + CONSTRAINT nexus_opportunities_posted_by_fkey FOREIGN KEY (posted_by) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_opportunities_selected_creator_id_fkey FOREIGN KEY (selected_creator_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nexus_payments ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + contract_id uuid NOT NULL, + milestone_id uuid, + amount numeric NOT NULL, + creator_payout numeric NOT NULL, + aethex_commission numeric NOT NULL, + payment_method text NOT NULL DEFAULT 'stripe'::text, + payment_status text NOT NULL DEFAULT 'pending'::text CHECK (payment_status = ANY (ARRAY['pending'::text, 'processing'::text, 'completed'::text, 'failed'::text, 'refunded'::text])), + payment_date timestamp with time zone, + payout_date timestamp with time zone, + stripe_payment_intent_id text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + stripe_charge_id text, + CONSTRAINT nexus_payments_pkey PRIMARY KEY (id), + CONSTRAINT nexus_payments_contract_id_fkey FOREIGN KEY (contract_id) REFERENCES public.nexus_contracts(id), + CONSTRAINT nexus_payments_milestone_id_fkey FOREIGN KEY (milestone_id) REFERENCES public.nexus_milestones(id) +); +CREATE TABLE public.nexus_portfolio_items ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + title text NOT NULL, + description text, + project_url text, + image_url text, + skills_used ARRAY NOT NULL DEFAULT '{}'::text[], + featured boolean NOT NULL DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_portfolio_items_pkey PRIMARY KEY (id), + CONSTRAINT nexus_portfolio_items_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nexus_reviews ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + application_id uuid NOT NULL, + opportunity_id uuid NOT NULL, + reviewer_id uuid NOT NULL, + creator_id uuid NOT NULL, + rating integer NOT NULL CHECK (rating >= 1 AND rating <= 5), + review_text text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_reviews_pkey PRIMARY KEY (id), + CONSTRAINT nexus_reviews_application_id_fkey FOREIGN KEY (application_id) REFERENCES public.nexus_applications(id), + CONSTRAINT nexus_reviews_opportunity_id_fkey FOREIGN KEY (opportunity_id) REFERENCES public.nexus_opportunities(id), + CONSTRAINT nexus_reviews_reviewer_id_fkey FOREIGN KEY (reviewer_id) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_reviews_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nexus_skill_endorsements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + creator_id uuid NOT NULL, + endorsed_by uuid NOT NULL, + skill text NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT nexus_skill_endorsements_pkey PRIMARY KEY (id), + CONSTRAINT nexus_skill_endorsements_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES public.user_profiles(id), + CONSTRAINT nexus_skill_endorsements_endorsed_by_fkey FOREIGN KEY (endorsed_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.nft_assets ( + id bigint NOT NULL DEFAULT nextval('nft_assets_id_seq'::regclass), + token_id text NOT NULL, + collection_id bigint, + contract_address text NOT NULL, + chain_id integer NOT NULL, + owner_address text NOT NULL, + creator_address text, + token_uri text, + name text, + description text, + image_url text, + animation_url text, + external_url text, + attributes jsonb DEFAULT '[]'::jsonb, + metadata jsonb DEFAULT '{}'::jsonb, + rarity_score numeric, + rarity_rank integer, + last_sale_price numeric, + last_sale_price_currency text, + last_sale_date timestamp with time zone, + cached_at timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT nft_assets_pkey PRIMARY KEY (id), + CONSTRAINT nft_assets_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES public.nft_collections(id) +); +CREATE TABLE public.nft_collections ( + id bigint NOT NULL DEFAULT nextval('nft_collections_id_seq'::regclass), + contract_address text NOT NULL, + chain_id integer NOT NULL, + name text NOT NULL, + symbol text, + description text, + image_url text, + banner_url text, + creator_address text NOT NULL, + owner_id uuid, + token_standard text, + total_supply numeric, + floor_price numeric DEFAULT 0, + floor_price_currency text DEFAULT 'ETH'::text, + volume_traded numeric DEFAULT 0, + total_sales integer DEFAULT 0, + royalty_percentage numeric DEFAULT 0, + royalty_address text, + is_verified boolean DEFAULT false, + metadata jsonb DEFAULT '{}'::jsonb, + social_links jsonb DEFAULT '{}'::jsonb, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT nft_collections_pkey PRIMARY KEY (id), + CONSTRAINT nft_collections_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) +); +CREATE TABLE public.nft_sales ( + id bigint NOT NULL DEFAULT nextval('nft_sales_id_seq'::regclass), + transaction_hash text NOT NULL, + block_number bigint, + chain_id integer NOT NULL, + event_timestamp timestamp with time zone NOT NULL, + asset_id bigint, + token_id text NOT NULL, + contract_address text NOT NULL, + collection_id bigint, + sale_type text, + auction_type text, + price numeric, + price_currency text DEFAULT 'ETH'::text, + price_usd numeric, + quantity numeric DEFAULT 1, + seller_address text, + buyer_address text, + platform_address text, + platform_fee numeric DEFAULT 0, + royalty_fee numeric DEFAULT 0, + gas_fee numeric DEFAULT 0, + marketplace text, + metadata jsonb DEFAULT '{}'::jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT nft_sales_pkey PRIMARY KEY (id), + CONSTRAINT nft_sales_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES public.nft_assets(id), + CONSTRAINT nft_sales_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES public.nft_collections(id) +); +CREATE TABLE public.nodes ( + id text NOT NULL DEFAULT (gen_random_uuid())::text, + x numeric NOT NULL, + y numeric NOT NULL, + z numeric DEFAULT 0, + title text NOT NULL, + content text NOT NULL, + category text, + details ARRAY, + type text, + status text CHECK (status = ANY (ARRAY['healthy'::text, 'warning'::text, 'error'::text, 'inactive'::text])), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT nodes_pkey PRIMARY KEY (id) +); +CREATE TABLE public.notification_preferences ( + user_id uuid NOT NULL, + prefs jsonb NOT NULL DEFAULT '{}'::jsonb, + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT notification_preferences_pkey PRIMARY KEY (user_id), + CONSTRAINT notification_preferences_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.notifications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + type text NOT NULL, + data jsonb, + is_read boolean DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT notifications_pkey PRIMARY KEY (id), + CONSTRAINT notifications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.now_playing ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + track_title text NOT NULL, + artist_name text NOT NULL, + album_art_url text, + track_url text, + is_active boolean DEFAULT true, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT now_playing_pkey PRIMARY KEY (id), + CONSTRAINT now_playing_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.oauth_authorization_codes ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + code text NOT NULL UNIQUE, + client_id text NOT NULL, + user_id uuid NOT NULL, + redirect_uri text NOT NULL, + code_challenge text, + code_challenge_method text, + scope text NOT NULL DEFAULT 'openid profile email'::text, + expires_at timestamp with time zone NOT NULL, + used boolean NOT NULL DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT oauth_authorization_codes_pkey PRIMARY KEY (id), + CONSTRAINT oauth_authorization_codes_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.oauth_clients(client_id) +); +CREATE TABLE public.oauth_clients ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + client_id text NOT NULL UNIQUE, + client_secret text, + name text NOT NULL, + description text, + redirect_uris jsonb NOT NULL DEFAULT '[]'::jsonb, + allowed_scopes ARRAY NOT NULL DEFAULT ARRAY['openid'::text, 'profile'::text, 'email'::text], + is_trusted boolean NOT NULL DEFAULT false, + is_active boolean NOT NULL DEFAULT true, + logo_url text, + website_url text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT oauth_clients_pkey PRIMARY KEY (id) +); +CREATE TABLE public.oauth_refresh_tokens ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + token text NOT NULL UNIQUE, + client_id text NOT NULL, + user_id uuid NOT NULL, + scope text NOT NULL DEFAULT 'openid profile email'::text, + expires_at timestamp with time zone NOT NULL, + revoked boolean NOT NULL DEFAULT false, + last_used_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT oauth_refresh_tokens_pkey PRIMARY KEY (id), + CONSTRAINT oauth_refresh_tokens_client_id_fkey FOREIGN KEY (client_id) REFERENCES public.oauth_clients(client_id) +); +CREATE TABLE public.orders ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + listing_id uuid NOT NULL, + buyer_id uuid NOT NULL, + seller_id uuid NOT NULL, + price_at_purchase numeric NOT NULL, + status text NOT NULL DEFAULT 'pending'::text, + stripe_account_id text, + stripe_payment_intent_id text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT orders_pkey PRIMARY KEY (id), + CONSTRAINT orders_listing_id_fkey FOREIGN KEY (listing_id) REFERENCES public.listings(id), + CONSTRAINT orders_buyer_id_fkey FOREIGN KEY (buyer_id) REFERENCES public.profiles(id), + CONSTRAINT orders_seller_id_fkey FOREIGN KEY (seller_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.pages ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + slug text NOT NULL UNIQUE, + title text NOT NULL, + content jsonb, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT pages_pkey PRIMARY KEY (id) +); +CREATE TABLE public.pair_sessions ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + initiator_id uuid NOT NULL, + initiator_username character varying NOT NULL, + partner_id uuid, + partner_username character varying, + session_type character varying NOT NULL, + status character varying DEFAULT 'waiting'::character varying, + started_at timestamp with time zone, + ended_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT pair_sessions_pkey PRIMARY KEY (id), + CONSTRAINT pair_sessions_initiator_id_fkey FOREIGN KEY (initiator_id) REFERENCES public.user_profiles(id), + CONSTRAINT pair_sessions_partner_id_fkey FOREIGN KEY (partner_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.passport_scores ( + id bigint NOT NULL DEFAULT nextval('passport_scores_id_seq'::regclass), + user_id uuid NOT NULL, + wallet_address text NOT NULL, + score numeric NOT NULL DEFAULT 0, + status text, + evidence jsonb DEFAULT '{}'::jsonb, + last_updated timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT passport_scores_pkey PRIMARY KEY (id), + CONSTRAINT passport_scores_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.payslips ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid, + site_id uuid, + pay_period_start date NOT NULL, + pay_period_end date NOT NULL, + amount numeric NOT NULL, + file_url text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT payslips_pkey PRIMARY KEY (id), + CONSTRAINT payslips_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT payslips_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.performance_reviews ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + reviewer_id uuid, + site_id uuid NOT NULL, + review_date date NOT NULL, + ratings jsonb, + comments text, + document_url text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT performance_reviews_pkey PRIMARY KEY (id), + CONSTRAINT performance_reviews_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT performance_reviews_reviewer_id_fkey FOREIGN KEY (reviewer_id) REFERENCES public.profiles(id), + CONSTRAINT performance_reviews_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.permissions ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT permissions_pkey PRIMARY KEY (id) +); +CREATE TABLE public.personal_site_config ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL UNIQUE, + site_status text NOT NULL DEFAULT 'live'::text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT personal_site_config_pkey PRIMARY KEY (id) +); +CREATE TABLE public.polls ( + id integer NOT NULL DEFAULT nextval('polls_id_seq'::regclass), + guild_id text NOT NULL, + channel_id text, + message_id text, + question text NOT NULL, + options jsonb NOT NULL, + votes jsonb DEFAULT '{}'::jsonb, + created_by text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT polls_pkey PRIMARY KEY (id) +); +CREATE TABLE public.portfolio_projects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid, + slug text NOT NULL UNIQUE, + title text NOT NULL, + subtitle text, + cover_image_url text, + description text, + content jsonb, + tags ARRAY, + project_date date, + live_url text, + github_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT portfolio_projects_pkey PRIMARY KEY (id), + CONSTRAINT portfolio_projects_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.post_likes ( + post_id uuid NOT NULL, + user_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT post_likes_pkey PRIMARY KEY (post_id, user_id), + CONSTRAINT post_likes_post_id_fkey FOREIGN KEY (post_id) REFERENCES public.posts(id), + CONSTRAINT post_likes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.posts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + content text NOT NULL, + media_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT posts_pkey PRIMARY KEY (id), + CONSTRAINT posts_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.products ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + name text NOT NULL, + price numeric, + category text, + description text, + image_prompt text, + image_url text, + tags ARRAY, + stock integer, + rating numeric, + display_order smallint, + created_at timestamp with time zone NOT NULL DEFAULT now(), + title text NOT NULL, + CONSTRAINT products_pkey PRIMARY KEY (id) +); +CREATE TABLE public.profiles ( + id uuid NOT NULL, + username text NOT NULL UNIQUE, + role text NOT NULL DEFAULT 'member'::text, + onboarded boolean NOT NULL DEFAULT false, + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + bio text, + skills ARRAY, + avatar_url text, + banner_url text, + social_links jsonb, + loyalty_points bigint NOT NULL DEFAULT 0, + email text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + user_type USER-DEFINED DEFAULT 'community_member'::user_type_enum, + experience_level USER-DEFINED DEFAULT 'beginner'::experience_level_enum, + full_name text, + location text, + website_url text, + github_url text, + twitter_url text, + linkedin_url text, + total_xp integer DEFAULT 0, + level integer DEFAULT 1, + featured_badge_ids ARRAY, + aethex_passport_id uuid NOT NULL DEFAULT gen_random_uuid() UNIQUE, + signature text, + status text DEFAULT 'offline'::text, + telemetry_api_key text, + active_title text, + suspended_at timestamp with time zone, + suspension_reason text, + roblox_user_id bigint UNIQUE, + roblox_access_token text, + roblox_refresh_token text, + roblox_token_expires_at timestamp with time zone, + experience jsonb, + education jsonb, + primary_role text, + specialization jsonb, + is_verified boolean DEFAULT false, + CONSTRAINT profiles_pkey PRIMARY KEY (id), + CONSTRAINT profiles_id_fkey FOREIGN KEY (id) REFERENCES auth.users(id) +); +CREATE TABLE public.project_members ( + project_id uuid NOT NULL, + user_id uuid NOT NULL, + role text NOT NULL DEFAULT 'contributor'::text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT project_members_pkey PRIMARY KEY (project_id, user_id), + CONSTRAINT project_members_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.projects(id), + CONSTRAINT project_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.project_tasks ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid NOT NULL, + title text NOT NULL, + description text, + status text NOT NULL DEFAULT 'todo'::text, + assignee_id uuid, + due_date date, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT project_tasks_pkey PRIMARY KEY (id), + CONSTRAINT project_tasks_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.projects(id), + CONSTRAINT project_tasks_assignee_id_fkey FOREIGN KEY (assignee_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.project_team_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid, + user_id uuid, + role text NOT NULL, + created_at timestamp with time zone DEFAULT now(), + site_id uuid, + CONSTRAINT project_team_members_pkey PRIMARY KEY (id), + CONSTRAINT project_team_members_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.projects(id), + CONSTRAINT project_team_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT fk_site_id FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.projects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + owner_id uuid, + title text NOT NULL, + description text, + status text DEFAULT 'In Progress'::text, + github_url text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + user_id uuid, + site_id uuid, + engine text, + priority text DEFAULT 'medium'::text, + progress integer DEFAULT 0, + live_url text, + technologies ARRAY, + CONSTRAINT projects_pkey PRIMARY KEY (id), + CONSTRAINT projects_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES public.profiles(id), + CONSTRAINT projects_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT projects_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.quests ( + id integer NOT NULL DEFAULT nextval('quests_id_seq'::regclass), + guild_id character varying NOT NULL, + name character varying NOT NULL, + description text, + quest_type character varying DEFAULT 'daily'::character varying, + trigger_type character varying NOT NULL, + target_value integer NOT NULL, + xp_reward integer DEFAULT 100, + active boolean DEFAULT true, + starts_at timestamp with time zone, + expires_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT quests_pkey PRIMARY KEY (id) +); +CREATE TABLE public.refresh_tokens ( + id character varying NOT NULL DEFAULT (gen_random_uuid())::character varying, + user_id character varying NOT NULL, + token text NOT NULL UNIQUE, + expires_at timestamp without time zone NOT NULL, + created_at timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT refresh_tokens_pkey PRIMARY KEY (id), + CONSTRAINT refresh_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) +); +CREATE TABLE public.reputation_events ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + aethex_passport_id uuid NOT NULL, + event_type text NOT NULL, + points integer NOT NULL, + site_id text, + metadata jsonb, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT reputation_events_pkey PRIMARY KEY (id), + CONSTRAINT reputation_events_aethex_passport_id_fkey FOREIGN KEY (aethex_passport_id) REFERENCES public.aethex_passports(id) +); +CREATE TABLE public.reputation_scores ( + aethex_passport_id uuid NOT NULL, + score integer NOT NULL DEFAULT 0, + updated_at timestamp with time zone, + CONSTRAINT reputation_scores_pkey PRIMARY KEY (aethex_passport_id), + CONSTRAINT reputation_scores_aethex_passport_id_fkey FOREIGN KEY (aethex_passport_id) REFERENCES public.aethex_passports(id) +); +CREATE TABLE public.resources ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + title character varying NOT NULL, + description text NOT NULL, + category character varying NOT NULL, + file_url text NOT NULL, + file_type character varying NOT NULL, + file_size_bytes bigint, + thumbnail_url text, + tags ARRAY DEFAULT '{}'::text[], + download_count integer NOT NULL DEFAULT 0, + published_by uuid, + published_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + is_featured boolean DEFAULT false, + CONSTRAINT resources_pkey PRIMARY KEY (id), + CONSTRAINT resources_published_by_fkey FOREIGN KEY (published_by) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.reviews ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + order_id uuid NOT NULL, + reviewer_id uuid NOT NULL, + reviewee_id uuid NOT NULL, + rating integer NOT NULL CHECK (rating >= 1 AND rating <= 5), + comment text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT reviews_pkey PRIMARY KEY (id), + CONSTRAINT reviews_order_id_fkey FOREIGN KEY (order_id) REFERENCES public.orders(id), + CONSTRAINT reviews_reviewer_id_fkey FOREIGN KEY (reviewer_id) REFERENCES public.profiles(id), + CONSTRAINT reviews_reviewee_id_fkey FOREIGN KEY (reviewee_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.reward_events ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + type text NOT NULL, + points_kind text NOT NULL DEFAULT 'xp'::text, + amount integer NOT NULL DEFAULT 0, + metadata jsonb, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT reward_events_pkey PRIMARY KEY (id), + CONSTRAINT reward_events_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.rewards ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + type text NOT NULL, + value jsonb, + title_id uuid, + site_id uuid, + cost integer NOT NULL DEFAULT 100, + stock integer, + rarity text DEFAULT 'Common'::text, + bg_color text DEFAULT '#4A5568'::text, + color text DEFAULT '#FFFFFF'::text, + CONSTRAINT rewards_pkey PRIMARY KEY (id), + CONSTRAINT rewards_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.roblox_links ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + roblox_user_id text NOT NULL UNIQUE, + roblox_username text NOT NULL, + linked_at timestamp without time zone DEFAULT now(), + last_verified timestamp without time zone, + CONSTRAINT roblox_links_pkey PRIMARY KEY (id), + CONSTRAINT roblox_links_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.role_panels ( + message_id text NOT NULL, + channel_id text, + guild_id text, + title text, + description text, + color text, + roles jsonb DEFAULT '[]'::jsonb, + created_by text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT role_panels_pkey PRIMARY KEY (message_id) +); +CREATE TABLE public.role_permissions ( + role_id uuid NOT NULL, + permission_id uuid NOT NULL, + CONSTRAINT role_permissions_pkey PRIMARY KEY (role_id, permission_id), + CONSTRAINT role_permissions_role_id_fkey FOREIGN KEY (role_id) REFERENCES public.roles(id), + CONSTRAINT role_permissions_permission_id_fkey FOREIGN KEY (permission_id) REFERENCES public.permissions(id) +); +CREATE TABLE public.roles ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL UNIQUE, + description text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT roles_pkey PRIMARY KEY (id) +); +CREATE TABLE public.saved_views ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL, + description text, + user_id text, + filters jsonb DEFAULT '{}'::jsonb, + layout_type text NOT NULL, + camera_state jsonb NOT NULL, + hidden_node_ids ARRAY DEFAULT '{}'::text[], + hidden_edge_ids ARRAY DEFAULT '{}'::text[], + node_color_property text, + node_size_property text, + edge_style_property text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT saved_views_pkey PRIMARY KEY (id) +); +CREATE TABLE public.scheduled_messages ( + id text NOT NULL, + guild_id text, + channel_id text, + type text, + content text, + embed_data jsonb, + send_time timestamp with time zone, + created_by text, + status text DEFAULT 'pending'::text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT scheduled_messages_pkey PRIMARY KEY (id) +); +CREATE TABLE public.scrub_logs ( + id character varying NOT NULL DEFAULT (gen_random_uuid())::character varying, + user_id character varying, + original_length integer NOT NULL, + scrubbed_length integer NOT NULL, + detection_count integer NOT NULL DEFAULT 0, + detection_types ARRAY, + status text NOT NULL, + ip_address text, + timestamp timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT scrub_logs_pkey PRIMARY KEY (id), + CONSTRAINT scrub_logs_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) +); +CREATE TABLE public.server_config ( + guild_id text NOT NULL, + welcome_channel text, + goodbye_channel text, + modlog_channel text, + level_up_channel text, + auto_role text, + verified_role text, + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT server_config_pkey PRIMARY KEY (guild_id) +); +CREATE TABLE public.service_inquiries ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + service_id uuid NOT NULL, + service_title text NOT NULL, + name text NOT NULL, + email text NOT NULL, + message text, + status text NOT NULL DEFAULT 'pending'::text, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT service_inquiries_pkey PRIMARY KEY (id), + CONSTRAINT fk_service FOREIGN KEY (service_id) REFERENCES public.consultancy_services(id) +); +CREATE TABLE public.sessions ( + id character varying NOT NULL DEFAULT (gen_random_uuid())::character varying, + user_id character varying NOT NULL, + username text NOT NULL, + token text NOT NULL, + expires_at timestamp without time zone NOT NULL, + created_at timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT sessions_pkey PRIMARY KEY (id), + CONSTRAINT sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) +); +CREATE TABLE public.shop_items ( + id integer NOT NULL DEFAULT nextval('shop_items_id_seq'::regclass), + guild_id character varying NOT NULL, + name character varying NOT NULL, + description text, + price integer NOT NULL, + item_type character varying NOT NULL, + item_data jsonb DEFAULT '{}'::jsonb, + stock integer, + enabled boolean DEFAULT true, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT shop_items_pkey PRIMARY KEY (id) +); +CREATE TABLE public.shorts ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + video_url text NOT NULL, + description text, + likes_count integer NOT NULL DEFAULT 0, + comments_count integer NOT NULL DEFAULT 0, + shares_count integer NOT NULL DEFAULT 0, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT shorts_pkey PRIMARY KEY (id), + CONSTRAINT shorts_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.showcase_contributors ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid NOT NULL, + name text NOT NULL, + title text, + avatar text, + CONSTRAINT showcase_contributors_pkey PRIMARY KEY (id), + CONSTRAINT showcase_contributors_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.showcase_projects(id) +); +CREATE TABLE public.showcase_project_links ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + project_id uuid NOT NULL, + label text NOT NULL, + href text NOT NULL, + CONSTRAINT showcase_project_links_pkey PRIMARY KEY (id), + CONSTRAINT showcase_project_links_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.showcase_projects(id) +); +CREATE TABLE public.showcase_projects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + title text NOT NULL, + org_unit text CHECK (org_unit = ANY (ARRAY['Studio'::text, 'Labs'::text, 'Platform'::text, 'Community'::text])), + role text, + timeframe text, + description text, + tags ARRAY NOT NULL DEFAULT '{}'::text[], + image text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT showcase_projects_pkey PRIMARY KEY (id) +); +CREATE TABLE public.site_config ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL UNIQUE, + site_name text, + site_description text, + logo_url text, + favicon_url text, + primary_color text, + secondary_color text, + updated_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + maintenance_ends_at timestamp with time zone, + system_status text NOT NULL DEFAULT 'online'::text, + system_status_message text, + maintenance_mode boolean DEFAULT false, + status_updates jsonb DEFAULT '[]'::jsonb, + CONSTRAINT site_config_pkey PRIMARY KEY (id), + CONSTRAINT fk_site_id FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.site_context ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + site_id uuid NOT NULL, + role text NOT NULL DEFAULT 'member'::text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT site_context_pkey PRIMARY KEY (id), + CONSTRAINT site_context_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.site_metrics ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + metric_name text NOT NULL, + metric_value text NOT NULL, + display_order integer, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT site_metrics_pkey PRIMARY KEY (id), + CONSTRAINT fk_site_id FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.site_settings ( + key text NOT NULL, + value jsonb NOT NULL DEFAULT '{}'::jsonb, + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT site_settings_pkey PRIMARY KEY (key) +); +CREATE TABLE public.social_links ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + name text NOT NULL, + url text NOT NULL, + icon text NOT NULL, + display_order smallint, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT social_links_pkey PRIMARY KEY (id) +); +CREATE TABLE public.sponsors ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid NOT NULL, + name text NOT NULL, + logo_url text, + website_url text, + display_order integer, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT sponsors_pkey PRIMARY KEY (id), + CONSTRAINT fk_site FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.sprints ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name character varying NOT NULL, + description text, + start_date date NOT NULL, + end_date date NOT NULL, + total_points integer DEFAULT 0, + completed_points integer DEFAULT 0, + status character varying DEFAULT 'active'::character varying, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT sprints_pkey PRIMARY KEY (id) +); +CREATE TABLE public.staff_contractors ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid UNIQUE, + email text NOT NULL UNIQUE, + full_name text NOT NULL, + position text, + company text, + phone text, + avatar_url text, + contract_type text DEFAULT 'contractor'::text CHECK (contract_type = ANY (ARRAY['contractor'::text, 'consultant'::text, 'partner'::text])), + is_active boolean DEFAULT true, + start_date date, + end_date date, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + location text, + CONSTRAINT staff_contractors_pkey PRIMARY KEY (id), + CONSTRAINT staff_contractors_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.staff_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid UNIQUE, + email text NOT NULL UNIQUE, + full_name text NOT NULL, + position text, + department text, + phone text, + avatar_url text, + role text DEFAULT 'employee'::text CHECK (role = ANY (ARRAY['owner'::text, 'admin'::text, 'founder'::text, 'staff'::text, 'employee'::text])), + is_active boolean DEFAULT true, + hired_date date, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + location text, + CONSTRAINT staff_members_pkey PRIMARY KEY (id), + CONSTRAINT staff_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.stripe_accounts ( + id uuid NOT NULL, + stripe_account_id text NOT NULL UNIQUE, + charges_enabled boolean NOT NULL DEFAULT false, + payouts_enabled boolean NOT NULL DEFAULT false, + details_submitted boolean NOT NULL DEFAULT false, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT stripe_accounts_pkey PRIMARY KEY (id), + CONSTRAINT stripe_accounts_id_fkey FOREIGN KEY (id) REFERENCES public.profiles(id) +); +CREATE TABLE public.studio_projects ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + title text NOT NULL, + description text, + likes integer DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT studio_projects_pkey PRIMARY KEY (id) +); +CREATE TABLE public.survey_responses ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + survey_id uuid NOT NULL, + user_id uuid NOT NULL, + responses jsonb, + submitted_at timestamp with time zone DEFAULT now(), + CONSTRAINT survey_responses_pkey PRIMARY KEY (id), + CONSTRAINT survey_responses_survey_id_fkey FOREIGN KEY (survey_id) REFERENCES public.feedback_surveys(id), + CONSTRAINT survey_responses_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.system_settings ( + key text NOT NULL, + value jsonb, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT system_settings_pkey PRIMARY KEY (key) +); +CREATE TABLE public.team_activity_log ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + username character varying NOT NULL, + activity_type character varying NOT NULL, + activity_metadata jsonb, + points integer DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT team_activity_log_pkey PRIMARY KEY (id), + CONSTRAINT team_activity_log_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.team_members ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + profile_id uuid UNIQUE, + name text NOT NULL, + role text NOT NULL, + bio text, + avatar_url text, + social_links jsonb, + order_index integer DEFAULT 0, + created_at timestamp with time zone NOT NULL DEFAULT timezone('utc'::text, now()), + CONSTRAINT team_members_pkey PRIMARY KEY (id), + CONSTRAINT team_members_profile_id_fkey FOREIGN KEY (profile_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.team_memberships ( + team_id uuid NOT NULL, + user_id uuid NOT NULL, + role text NOT NULL DEFAULT 'member'::text, + status text NOT NULL DEFAULT 'active'::text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT team_memberships_pkey PRIMARY KEY (team_id, user_id), + CONSTRAINT team_memberships_team_id_fkey FOREIGN KEY (team_id) REFERENCES public.teams(id), + CONSTRAINT team_memberships_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.team_presence ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + discord_user_id character varying NOT NULL, + discord_username character varying NOT NULL, + status text, + is_online boolean DEFAULT true, + last_seen timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT team_presence_pkey PRIMARY KEY (id), + CONSTRAINT team_presence_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.teams ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + owner_id uuid NOT NULL, + name text NOT NULL, + slug text UNIQUE, + description text, + visibility text NOT NULL DEFAULT 'private'::text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + updated_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT teams_pkey PRIMARY KEY (id), + CONSTRAINT teams_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.tickets ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + site_id uuid, + project_id uuid, + created_by uuid, + assigned_to uuid, + title text NOT NULL, + description text, + status text DEFAULT 'Open'::text, + priority text DEFAULT 'Medium'::text, + type text, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT tickets_pkey PRIMARY KEY (id), + CONSTRAINT tickets_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id), + CONSTRAINT tickets_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.projects(id), + CONSTRAINT tickets_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.profiles(id), + CONSTRAINT tickets_assigned_to_fkey FOREIGN KEY (assigned_to) REFERENCES public.profiles(id) +); +CREATE TABLE public.time_off_requests ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid, + site_id uuid, + start_date date NOT NULL, + end_date date NOT NULL, + reason text, + status text DEFAULT 'Pending'::text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT time_off_requests_pkey PRIMARY KEY (id), + CONSTRAINT time_off_requests_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT time_off_requests_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.time_tracking ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid, + site_id uuid, + clock_in timestamp with time zone NOT NULL, + clock_out timestamp with time zone, + notes text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT time_tracking_pkey PRIMARY KEY (id), + CONSTRAINT time_tracking_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT time_tracking_site_id_fkey FOREIGN KEY (site_id) REFERENCES public.aethex_sites(id) +); +CREATE TABLE public.timesheet_entries ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + work_date date NOT NULL, + total_hours numeric NOT NULL, + billable_hours numeric DEFAULT 0, + status character varying DEFAULT 'draft'::character varying, + approved_by uuid, + approved_at timestamp with time zone, + exported_to_nexus boolean DEFAULT false, + nexus_sync_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT timesheet_entries_pkey PRIMARY KEY (id), + CONSTRAINT timesheet_entries_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id), + CONSTRAINT timesheet_entries_approved_by_fkey FOREIGN KEY (approved_by) REFERENCES auth.users(id) +); +CREATE TABLE public.token_balances ( + id bigint NOT NULL DEFAULT nextval('token_balances_id_seq'::regclass), + user_id uuid NOT NULL, + wallet_address text NOT NULL, + chain_id integer NOT NULL, + token_address text, + token_symbol text NOT NULL, + token_name text, + token_decimals integer DEFAULT 18, + balance numeric NOT NULL DEFAULT 0, + balance_usd numeric DEFAULT 0, + price_usd numeric DEFAULT 0, + last_synced_at timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT token_balances_pkey PRIMARY KEY (id), + CONSTRAINT token_balances_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.type_racer_games ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + username character varying NOT NULL, + challenge_text text NOT NULL, + wpm integer NOT NULL, + accuracy numeric NOT NULL, + time_seconds integer NOT NULL, + is_practice boolean DEFAULT true, + race_id uuid, + placement integer, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT type_racer_games_pkey PRIMARY KEY (id), + CONSTRAINT type_racer_games_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.user_achievements ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid, + achievement_id uuid, + site_id text, + created_at timestamp with time zone DEFAULT now(), + unlocked_at timestamp with time zone DEFAULT now(), + earned_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_achievements_pkey PRIMARY KEY (id), + CONSTRAINT user_achievements_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT user_achievements_achievement_id_fkey FOREIGN KEY (achievement_id) REFERENCES public.achievements(id) +); +CREATE TABLE public.user_activities ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid, + activity_type text, + message text, + metadata jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_activities_pkey PRIMARY KEY (id), + CONSTRAINT user_activities_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.user_aethex_badges ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + badge_id uuid NOT NULL, + unlocked_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT user_aethex_badges_pkey PRIMARY KEY (id), + CONSTRAINT user_aethex_badges_badge_id_fkey FOREIGN KEY (badge_id) REFERENCES public.aethex_badges(id), + CONSTRAINT user_aethex_badges_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id) +); +CREATE TABLE public.user_connections ( + user_id uuid NOT NULL, + connection_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT user_connections_pkey PRIMARY KEY (user_id, connection_id), + CONSTRAINT user_connections_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id), + CONSTRAINT user_connections_connection_id_fkey FOREIGN KEY (connection_id) REFERENCES auth.users(id) +); +CREATE TABLE public.user_email_links ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + email text NOT NULL UNIQUE, + is_primary boolean DEFAULT false, + verified_at timestamp with time zone DEFAULT now(), + linked_at timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_email_links_pkey PRIMARY KEY (id), + CONSTRAINT user_email_links_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.user_experience_link ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + experience_id uuid NOT NULL, + asset_id uuid NOT NULL, + asset_type text NOT NULL, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_experience_link_pkey PRIMARY KEY (id), + CONSTRAINT experience_assets_experience_id_fkey FOREIGN KEY (experience_id) REFERENCES public.experiences(id), + CONSTRAINT experience_assets_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES public.assets(id) +); +CREATE TABLE public.user_favorites ( + id bigint NOT NULL DEFAULT nextval('user_favorites_id_seq'::regclass), + user_id uuid NOT NULL, + asset_id bigint, + collection_id bigint, + listing_id bigint, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_favorites_pkey PRIMARY KEY (id), + CONSTRAINT user_favorites_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id), + CONSTRAINT user_favorites_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES public.nft_assets(id), + CONSTRAINT user_favorites_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES public.nft_collections(id), + CONSTRAINT user_favorites_listing_id_fkey FOREIGN KEY (listing_id) REFERENCES public.marketplace_listings(id) +); +CREATE TABLE public.user_follows ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + follower_id uuid NOT NULL, + following_id uuid NOT NULL, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT user_follows_pkey PRIMARY KEY (id), + CONSTRAINT user_follows_follower_id_fkey FOREIGN KEY (follower_id) REFERENCES public.user_profiles(id), + CONSTRAINT user_follows_following_id_fkey FOREIGN KEY (following_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.user_interests ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_id uuid, + interest text NOT NULL, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_interests_pkey PRIMARY KEY (id), + CONSTRAINT user_interests_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.user_mrpiglr_site_badges ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + badge_id uuid NOT NULL, + unlocked_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT user_mrpiglr_site_badges_pkey PRIMARY KEY (id), + CONSTRAINT user_mrpiglr_site_badges_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT user_mrpiglr_site_badges_badge_id_fkey FOREIGN KEY (badge_id) REFERENCES public.mrpiglr_site_badges(id) +); +CREATE TABLE public.user_profiles ( + id uuid NOT NULL, + username text UNIQUE, + full_name text, + avatar_url text, + user_type USER-DEFINED NOT NULL, + experience_level USER-DEFINED DEFAULT 'beginner'::experience_level_enum, + bio text, + location text, + website_url text, + github_url text, + twitter_url text, + linkedin_url text, + total_xp integer DEFAULT 0, + level integer DEFAULT 1, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + current_streak integer DEFAULT 0, + longest_streak integer DEFAULT 0, + last_streak_at date, + loyalty_points integer DEFAULT 0, + reputation_score integer DEFAULT 0, + wallet_address character varying DEFAULT NULL::character varying UNIQUE, + show_in_creator_directory boolean NOT NULL DEFAULT false, + arms ARRAY DEFAULT '{}'::text[], + roles ARRAY DEFAULT '{}'::text[], + last_active_at timestamp with time zone DEFAULT now(), + streak_days integer DEFAULT 0, + roblox_user_id text UNIQUE, + roblox_username text, + unity_player_id text UNIQUE, + unreal_player_id text UNIQUE, + godot_player_id text UNIQUE, + merged_to_user_id uuid, + aethex_domain text, + discord_id text UNIQUE, + discord_username text, + is_architect boolean DEFAULT false, + xp integer DEFAULT 0, + daily_streak integer DEFAULT 0, + last_daily timestamp with time zone, + last_xp_message timestamp with time zone, + badges jsonb DEFAULT '[]'::jsonb, + CONSTRAINT user_profiles_pkey PRIMARY KEY (id), + CONSTRAINT user_profiles_id_fkey FOREIGN KEY (id) REFERENCES auth.users(id), + CONSTRAINT user_profiles_merged_to_user_id_fkey FOREIGN KEY (merged_to_user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.user_rewards ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + reward_id uuid NOT NULL, + claimed_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT user_rewards_pkey PRIMARY KEY (id), + CONSTRAINT user_rewards_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT user_rewards_reward_id_fkey FOREIGN KEY (reward_id) REFERENCES public.rewards(id) +); +CREATE TABLE public.user_roles ( + user_id uuid NOT NULL, + role_id uuid NOT NULL, + CONSTRAINT user_roles_pkey PRIMARY KEY (user_id, role_id), + CONSTRAINT user_roles_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT user_roles_role_id_fkey FOREIGN KEY (role_id) REFERENCES public.roles(id) +); +CREATE TABLE public.user_stats ( + id integer NOT NULL DEFAULT nextval('user_stats_id_seq'::regclass), + user_id uuid, + guild_id character varying NOT NULL, + messages_sent integer DEFAULT 0, + reactions_given integer DEFAULT 0, + reactions_received integer DEFAULT 0, + voice_minutes integer DEFAULT 0, + commands_used integer DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_stats_pkey PRIMARY KEY (id) +); +CREATE TABLE public.user_titles ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid, + title_id uuid, + unlocked_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_titles_pkey PRIMARY KEY (id), + CONSTRAINT user_titles_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT user_titles_title_id_fkey FOREIGN KEY (title_id) REFERENCES public.rewards(id) +); +CREATE TABLE public.user_wallets ( + id bigint NOT NULL DEFAULT nextval('user_wallets_id_seq'::regclass), + user_id uuid NOT NULL, + wallet_address text NOT NULL UNIQUE, + chain_id integer NOT NULL, + chain_name text, + is_primary boolean DEFAULT false, + verified_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT user_wallets_pkey PRIMARY KEY (id), + CONSTRAINT user_wallets_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) +); +CREATE TABLE public.users ( + id character varying NOT NULL DEFAULT (gen_random_uuid())::character varying, + username text NOT NULL UNIQUE, + password text NOT NULL, + is_active boolean NOT NULL DEFAULT true, + is_admin boolean NOT NULL DEFAULT false, + created_at timestamp without time zone NOT NULL DEFAULT now(), + CONSTRAINT users_pkey PRIMARY KEY (id) +); +CREATE TABLE public.voice_states ( + discord_user_id character varying NOT NULL, + discord_username character varying NOT NULL, + channel_id character varying NOT NULL, + guild_id character varying NOT NULL, + joined_at timestamp with time zone DEFAULT now(), + last_updated timestamp with time zone DEFAULT now(), + CONSTRAINT voice_states_pkey PRIMARY KEY (discord_user_id) +); +CREATE TABLE public.volunteer_applications ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + opportunity_id uuid NOT NULL, + message text, + status text NOT NULL DEFAULT 'pending'::text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT volunteer_applications_pkey PRIMARY KEY (id), + CONSTRAINT volunteer_applications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.profiles(id), + CONSTRAINT volunteer_applications_opportunity_id_fkey FOREIGN KEY (opportunity_id) REFERENCES public.volunteer_opportunities(id) +); +CREATE TABLE public.volunteer_opportunities ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + title text NOT NULL, + description text NOT NULL, + responsibilities ARRAY, + time_commitment text, + skills_required ARRAY, + is_active boolean NOT NULL DEFAULT true, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT volunteer_opportunities_pkey PRIMARY KEY (id) +); +CREATE TABLE public.volunteer_testimonials ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + name text NOT NULL, + role text NOT NULL, + testimonial text NOT NULL, + avatar_url text, + created_at timestamp with time zone NOT NULL DEFAULT now(), + CONSTRAINT volunteer_testimonials_pkey PRIMARY KEY (id) +); +CREATE TABLE public.waitlist ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + email text NOT NULL UNIQUE, + created_at timestamp with time zone NOT NULL DEFAULT now(), + segment text, + site_id uuid, + CONSTRAINT waitlist_pkey PRIMARY KEY (id) +); +CREATE TABLE public.warnings ( + id integer NOT NULL DEFAULT nextval('warnings_id_seq'::regclass), + guild_id text NOT NULL, + user_id text NOT NULL, + user_tag text, + moderator_id text NOT NULL, + moderator_tag text, + reason text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT warnings_pkey PRIMARY KEY (id) +); +CREATE TABLE public.web3_nonces ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + wallet_address text NOT NULL UNIQUE CHECK (wallet_address ~ '^0x[a-fA-F0-9]{40}$'::text), + nonce text NOT NULL, + used_at timestamp without time zone, + expires_at timestamp without time zone NOT NULL, + created_at timestamp without time zone DEFAULT now(), + CONSTRAINT web3_nonces_pkey PRIMARY KEY (id) +); +CREATE TABLE public.web3_wallets ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + wallet_address text NOT NULL UNIQUE CHECK (wallet_address ~ '^0x[a-fA-F0-9]{40}$'::text), + chain_id integer DEFAULT 1, + linked_at timestamp without time zone DEFAULT now(), + last_verified timestamp without time zone, + CONSTRAINT web3_wallets_pkey PRIMARY KEY (id), + CONSTRAINT web3_wallets_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.user_profiles(id) +); +CREATE TABLE public.work_sessions ( + id uuid NOT NULL DEFAULT gen_random_uuid(), + user_id uuid NOT NULL, + project_id uuid, + task_id uuid, + clock_in timestamp with time zone NOT NULL DEFAULT now(), + clock_out timestamp with time zone, + duration_minutes integer DEFAULT (EXTRACT(epoch FROM (clock_out - clock_in)) / (60)::numeric), + source character varying DEFAULT 'web'::character varying, + notes text, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT work_sessions_pkey PRIMARY KEY (id), + CONSTRAINT work_sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id), + CONSTRAINT work_sessions_project_id_fkey FOREIGN KEY (project_id) REFERENCES public.gameforge_projects(id), + CONSTRAINT work_sessions_task_id_fkey FOREIGN KEY (task_id) REFERENCES public.gameforge_tasks(id) +); +CREATE TABLE public.xp_config ( + id integer NOT NULL DEFAULT nextval('xp_config_id_seq'::regclass), + guild_id character varying NOT NULL UNIQUE, + xp_per_message integer DEFAULT 15, + xp_cooldown integer DEFAULT 60, + voice_xp_per_minute integer DEFAULT 5, + reaction_xp integer DEFAULT 5, + difficulty character varying DEFAULT 'normal'::character varying, + bonus_channels jsonb DEFAULT '[]'::jsonb, + role_multipliers jsonb DEFAULT '{}'::jsonb, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT xp_config_pkey PRIMARY KEY (id) +); \ No newline at end of file diff --git a/client/public/opengraph.jpg b/client/public/opengraph.jpg index 1c532d2..dc30e0f 100644 Binary files a/client/public/opengraph.jpg and b/client/public/opengraph.jpg differ