From f8ba1cbb0fcbb9c70e724ef336c0787856506d76 Mon Sep 17 00:00:00 2001 From: sirpiglr <49359077-sirpiglr@users.noreply.replit.com> Date: Mon, 15 Dec 2025 22:49:21 +0000 Subject: [PATCH] Add detailed schema information for the entire database Add the complete SQL schema definition, including 316 tables, to the repository for comprehensive database structure reference. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 279f1558-c0e3-40e4-8217-be7e9f4c6eca Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 4581eb35-bd44-463a-b452-7a68159bc958 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/b984cb14-1d19-4944-922b-bc79e821ed35/279f1558-c0e3-40e4-8217-be7e9f4c6eca/HbU8yEz Replit-Helium-Checkpoint-Created: true --- ...text-only-and-is-not-mea_1765838402288.txt | 4291 +++++++++++++++++ client/public/opengraph.jpg | Bin 57355 -> 52102 bytes 2 files changed, 4291 insertions(+) create mode 100644 attached_assets/Pasted--WARNING-This-schema-is-for-context-only-and-is-not-mea_1765838402288.txt 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 1c532d2c071d344031a395cb13882df6fa45b61d..dc30e0f6c1fb8634a9e497d9b44e9f54175b8d4c 100644 GIT binary patch literal 52102 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 E1GOwGd;kCd literal 57355 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%0AvDu@mk{;51EO|8pa+>5h%>9m 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