-- Downloaded from: https://github.com/Chris-Merced/Classic-Messenger-App-Backend/blob/830ae3a7451ff23d2d41943f7a727008e525e190/schema.sql -- -- PostgreSQL database dump -- -- Dumped from database version 16.9 (Ubuntu 16.9-0ubuntu0.24.04.1) -- Dumped by pg_dump version 16.9 (Ubuntu 16.9-0ubuntu0.24.04.1) SET statement_timeout = 0; SET lock_timeout = 0; SET idle_in_transaction_session_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; SELECT pg_catalog.set_config('search_path', '', false); SET check_function_bodies = false; SET xmloption = content; SET client_min_messages = warning; SET row_security = off; -- -- Name: _heroku; Type: SCHEMA; Schema: -; Owner: chris -- CREATE SCHEMA _heroku; ALTER SCHEMA _heroku OWNER TO chris; -- -- Name: pg_stat_statements; Type: EXTENSION; Schema: -; Owner: - -- CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public; -- -- Name: EXTENSION pg_stat_statements; Type: COMMENT; Schema: -; Owner: -- COMMENT ON EXTENSION pg_stat_statements IS 'track planning and execution statistics of all SQL statements executed'; -- -- Name: create_ext(); Type: FUNCTION; Schema: _heroku; Owner: chris -- CREATE FUNCTION _heroku.create_ext() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ DECLARE schemaname TEXT; databaseowner TEXT; r RECORD; BEGIN IF tg_tag = 'CREATE EXTENSION' and current_user != 'rds_superuser' THEN FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP CONTINUE WHEN r.command_tag != 'CREATE EXTENSION' OR r.object_type != 'extension'; schemaname = ( SELECT n.nspname FROM pg_catalog.pg_extension AS e INNER JOIN pg_catalog.pg_namespace AS n ON e.extnamespace = n.oid WHERE e.oid = r.objid ); databaseowner = ( SELECT pg_catalog.pg_get_userbyid(d.datdba) FROM pg_catalog.pg_database d WHERE d.datname = current_database() ); --RAISE NOTICE 'Record for event trigger %, objid: %,tag: %, current_user: %, schema: %, database_owenr: %', r.object_identity, r.objid, tg_tag, current_user, schemaname, databaseowner; IF r.object_identity = 'address_standardizer_data_us' THEN PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT, UPDATE, INSERT, DELETE', databaseowner, 'us_gaz'); PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT, UPDATE, INSERT, DELETE', databaseowner, 'us_lex'); PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT, UPDATE, INSERT, DELETE', databaseowner, 'us_rules'); ELSIF r.object_identity = 'amcheck' THEN EXECUTE format('GRANT EXECUTE ON FUNCTION %I.bt_index_check TO %I;', schemaname, databaseowner); EXECUTE format('GRANT EXECUTE ON FUNCTION %I.bt_index_parent_check TO %I;', schemaname, databaseowner); ELSIF r.object_identity = 'dict_int' THEN EXECUTE format('ALTER TEXT SEARCH DICTIONARY %I.intdict OWNER TO %I;', schemaname, databaseowner); ELSIF r.object_identity = 'pg_partman' THEN PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT, UPDATE, INSERT, DELETE', databaseowner, 'part_config'); PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT, UPDATE, INSERT, DELETE', databaseowner, 'part_config_sub'); PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT, UPDATE, INSERT, DELETE', databaseowner, 'custom_time_partitions'); ELSIF r.object_identity = 'pg_stat_statements' THEN EXECUTE format('GRANT EXECUTE ON FUNCTION %I.pg_stat_statements_reset TO %I;', schemaname, databaseowner); ELSIF r.object_identity = 'postgis' THEN PERFORM _heroku.postgis_after_create(); ELSIF r.object_identity = 'postgis_raster' THEN PERFORM _heroku.postgis_after_create(); PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT', databaseowner, 'raster_columns'); PERFORM _heroku.grant_table_if_exists(schemaname, 'SELECT', databaseowner, 'raster_overviews'); ELSIF r.object_identity = 'postgis_topology' THEN PERFORM _heroku.postgis_after_create(); EXECUTE format('GRANT USAGE ON SCHEMA topology TO %I;', databaseowner); EXECUTE format('GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA topology TO %I;', databaseowner); PERFORM _heroku.grant_table_if_exists('topology', 'SELECT, UPDATE, INSERT, DELETE', databaseowner); EXECUTE format('GRANT USAGE, SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA topology TO %I;', databaseowner); ELSIF r.object_identity = 'postgis_tiger_geocoder' THEN PERFORM _heroku.postgis_after_create(); EXECUTE format('GRANT USAGE ON SCHEMA tiger TO %I;', databaseowner); EXECUTE format('GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA tiger TO %I;', databaseowner); PERFORM _heroku.grant_table_if_exists('tiger', 'SELECT, UPDATE, INSERT, DELETE', databaseowner); EXECUTE format('GRANT USAGE ON SCHEMA tiger_data TO %I;', databaseowner); EXECUTE format('GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA tiger_data TO %I;', databaseowner); PERFORM _heroku.grant_table_if_exists('tiger_data', 'SELECT, UPDATE, INSERT, DELETE', databaseowner); END IF; END LOOP; END IF; END; $$; ALTER FUNCTION _heroku.create_ext() OWNER TO chris; -- -- Name: drop_ext(); Type: FUNCTION; Schema: _heroku; Owner: chris -- CREATE FUNCTION _heroku.drop_ext() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ DECLARE schemaname TEXT; databaseowner TEXT; r RECORD; BEGIN IF tg_tag = 'DROP EXTENSION' and current_user != 'rds_superuser' THEN FOR r IN SELECT * FROM pg_event_trigger_dropped_objects() LOOP CONTINUE WHEN r.object_type != 'extension'; databaseowner = ( SELECT pg_catalog.pg_get_userbyid(d.datdba) FROM pg_catalog.pg_database d WHERE d.datname = current_database() ); --RAISE NOTICE 'Record for event trigger %, objid: %,tag: %, current_user: %, database_owner: %, schemaname: %', r.object_identity, r.objid, tg_tag, current_user, databaseowner, r.schema_name; IF r.object_identity = 'postgis_topology' THEN EXECUTE format('DROP SCHEMA IF EXISTS topology'); END IF; END LOOP; END IF; END; $$; ALTER FUNCTION _heroku.drop_ext() OWNER TO chris; -- -- Name: extension_before_drop(); Type: FUNCTION; Schema: _heroku; Owner: chris -- CREATE FUNCTION _heroku.extension_before_drop() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ DECLARE query TEXT; BEGIN query = (SELECT current_query()); -- RAISE NOTICE 'executing extension_before_drop: tg_event: %, tg_tag: %, current_user: %, session_user: %, query: %', tg_event, tg_tag, current_user, session_user, query; IF tg_tag = 'DROP EXTENSION' and not pg_has_role(session_user, 'rds_superuser', 'MEMBER') THEN -- DROP EXTENSION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ] IF (regexp_match(query, 'DROP\s+EXTENSION\s+(IF\s+EXISTS)?.*(plpgsql)', 'i') IS NOT NULL) THEN RAISE EXCEPTION 'The plpgsql extension is required for database management and cannot be dropped.'; END IF; END IF; END; $$; ALTER FUNCTION _heroku.extension_before_drop() OWNER TO chris; -- -- Name: grant_table_if_exists(text, text, text, text); Type: FUNCTION; Schema: _heroku; Owner: chris -- CREATE FUNCTION _heroku.grant_table_if_exists(alias_schemaname text, grants text, databaseowner text, alias_tablename text DEFAULT NULL::text) RETURNS void LANGUAGE plpgsql SECURITY DEFINER AS $$ BEGIN IF alias_tablename IS NULL THEN EXECUTE format('GRANT %s ON ALL TABLES IN SCHEMA %I TO %I;', grants, alias_schemaname, databaseowner); ELSE IF EXISTS (SELECT 1 FROM pg_tables WHERE pg_tables.schemaname = alias_schemaname AND pg_tables.tablename = alias_tablename) THEN EXECUTE format('GRANT %s ON TABLE %I.%I TO %I;', grants, alias_schemaname, alias_tablename, databaseowner); END IF; END IF; END; $$; ALTER FUNCTION _heroku.grant_table_if_exists(alias_schemaname text, grants text, databaseowner text, alias_tablename text) OWNER TO chris; -- -- Name: postgis_after_create(); Type: FUNCTION; Schema: _heroku; Owner: chris -- CREATE FUNCTION _heroku.postgis_after_create() RETURNS void LANGUAGE plpgsql SECURITY DEFINER AS $$ DECLARE schemaname TEXT; databaseowner TEXT; BEGIN schemaname = ( SELECT n.nspname FROM pg_catalog.pg_extension AS e INNER JOIN pg_catalog.pg_namespace AS n ON e.extnamespace = n.oid WHERE e.extname = 'postgis' ); databaseowner = ( SELECT pg_catalog.pg_get_userbyid(d.datdba) FROM pg_catalog.pg_database d WHERE d.datname = current_database() ); EXECUTE format('GRANT EXECUTE ON FUNCTION %I.st_tileenvelope TO %I;', schemaname, databaseowner); EXECUTE format('GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE %I.spatial_ref_sys TO %I;', schemaname, databaseowner); END; $$; ALTER FUNCTION _heroku.postgis_after_create() OWNER TO chris; -- -- Name: validate_extension(); Type: FUNCTION; Schema: _heroku; Owner: chris -- CREATE FUNCTION _heroku.validate_extension() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ DECLARE schemaname TEXT; r RECORD; BEGIN IF tg_tag = 'CREATE EXTENSION' and current_user != 'rds_superuser' THEN FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP CONTINUE WHEN r.command_tag != 'CREATE EXTENSION' OR r.object_type != 'extension'; schemaname = ( SELECT n.nspname FROM pg_catalog.pg_extension AS e INNER JOIN pg_catalog.pg_namespace AS n ON e.extnamespace = n.oid WHERE e.oid = r.objid ); IF schemaname = '_heroku' THEN RAISE EXCEPTION 'Creating extensions in the _heroku schema is not allowed'; END IF; END LOOP; END IF; END; $$; ALTER FUNCTION _heroku.validate_extension() OWNER TO chris; SET default_tablespace = ''; SET default_table_access_method = heap; -- -- Name: blocked; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.blocked ( user_id integer NOT NULL, blocked_id integer NOT NULL ); ALTER TABLE public.blocked OWNER TO chris; -- -- Name: conversation_participants; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.conversation_participants ( id integer NOT NULL, conversation_id integer, user_id integer, added_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.conversation_participants OWNER TO chris; -- -- Name: conversation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: chris -- CREATE SEQUENCE public.conversation_participants_id_seq AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER SEQUENCE public.conversation_participants_id_seq OWNER TO chris; -- -- Name: conversation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: chris -- ALTER SEQUENCE public.conversation_participants_id_seq OWNED BY public.conversation_participants.id; -- -- Name: conversations; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.conversations ( id integer NOT NULL, name character varying(100), is_group boolean DEFAULT false, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE public.conversations OWNER TO chris; -- -- Name: conversations_id_seq; Type: SEQUENCE; Schema: public; Owner: chris -- CREATE SEQUENCE public.conversations_id_seq AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER SEQUENCE public.conversations_id_seq OWNER TO chris; -- -- Name: conversations_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: chris -- ALTER SEQUENCE public.conversations_id_seq OWNED BY public.conversations.id; -- -- Name: friend_requests; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.friend_requests ( user_id integer NOT NULL, request_id integer NOT NULL, status character varying(10), CONSTRAINT friend_requests_status_check CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'accepted'::character varying, 'rejected'::character varying])::text[]))) ); ALTER TABLE public.friend_requests OWNER TO chris; -- -- Name: friends; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.friends ( user_id integer NOT NULL, friend_id integer NOT NULL, CONSTRAINT friends_check CHECK ((user_id < friend_id)) ); ALTER TABLE public.friends OWNER TO chris; -- -- Name: messages; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.messages ( id integer NOT NULL, conversation_id integer, sender_id integer, content text NOT NULL, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, is_read boolean DEFAULT false ); ALTER TABLE public.messages OWNER TO chris; -- -- Name: messages_id_seq; Type: SEQUENCE; Schema: public; Owner: chris -- CREATE SEQUENCE public.messages_id_seq AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER SEQUENCE public.messages_id_seq OWNER TO chris; -- -- Name: messages_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: chris -- ALTER SEQUENCE public.messages_id_seq OWNED BY public.messages.id; -- -- Name: sessions; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.sessions ( session_id character varying(255) NOT NULL, user_id integer, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, expires_at timestamp without time zone ); ALTER TABLE public.sessions OWNER TO chris; -- -- Name: users; Type: TABLE; Schema: public; Owner: chris -- CREATE TABLE public.users ( id integer NOT NULL, username character varying(50) NOT NULL, password character varying(255) NOT NULL, email character varying(100), is_admin boolean DEFAULT false, created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, is_public boolean DEFAULT true, profile_picture character varying(500) DEFAULT NULL::character varying, about_me character varying(500) ); ALTER TABLE public.users OWNER TO chris; -- -- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: chris -- CREATE SEQUENCE public.users_id_seq AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER SEQUENCE public.users_id_seq OWNER TO chris; -- -- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: chris -- ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id; -- -- Name: conversation_participants id; Type: DEFAULT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.conversation_participants ALTER COLUMN id SET DEFAULT nextval('public.conversation_participants_id_seq'::regclass); -- -- Name: conversations id; Type: DEFAULT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.conversations ALTER COLUMN id SET DEFAULT nextval('public.conversations_id_seq'::regclass); -- -- Name: messages id; Type: DEFAULT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.messages ALTER COLUMN id SET DEFAULT nextval('public.messages_id_seq'::regclass); -- -- Name: users id; Type: DEFAULT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass); -- -- Name: blocked blocked_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.blocked ADD CONSTRAINT blocked_pkey PRIMARY KEY (user_id, blocked_id); -- -- Name: conversation_participants conversation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.conversation_participants ADD CONSTRAINT conversation_participants_pkey PRIMARY KEY (id); -- -- Name: conversations conversations_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.conversations ADD CONSTRAINT conversations_pkey PRIMARY KEY (id); -- -- Name: friend_requests friend_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.friend_requests ADD CONSTRAINT friend_requests_pkey PRIMARY KEY (user_id, request_id); -- -- Name: friends friends_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.friends ADD CONSTRAINT friends_pkey PRIMARY KEY (user_id, friend_id); -- -- Name: messages messages_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.messages ADD CONSTRAINT messages_pkey PRIMARY KEY (id); -- -- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.sessions ADD CONSTRAINT sessions_pkey PRIMARY KEY (session_id); -- -- Name: users users_email_key; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.users ADD CONSTRAINT users_email_key UNIQUE (email); -- -- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.users ADD CONSTRAINT users_pkey PRIMARY KEY (id); -- -- Name: users users_username_key; Type: CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.users ADD CONSTRAINT users_username_key UNIQUE (username); -- -- Name: blocked blocked_blocked_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.blocked ADD CONSTRAINT blocked_blocked_id_fkey FOREIGN KEY (blocked_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: blocked blocked_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.blocked ADD CONSTRAINT blocked_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: conversation_participants conversation_participants_conversation_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.conversation_participants ADD CONSTRAINT conversation_participants_conversation_id_fkey FOREIGN KEY (conversation_id) REFERENCES public.conversations(id) ON DELETE CASCADE; -- -- Name: conversation_participants conversation_participants_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.conversation_participants ADD CONSTRAINT conversation_participants_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: friend_requests friend_requests_request_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.friend_requests ADD CONSTRAINT friend_requests_request_id_fkey FOREIGN KEY (request_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: friend_requests friend_requests_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.friend_requests ADD CONSTRAINT friend_requests_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: friends friends_friend_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.friends ADD CONSTRAINT friends_friend_id_fkey FOREIGN KEY (friend_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: friends friends_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.friends ADD CONSTRAINT friends_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: messages messages_conversation_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.messages ADD CONSTRAINT messages_conversation_id_fkey FOREIGN KEY (conversation_id) REFERENCES public.conversations(id) ON DELETE CASCADE; -- -- Name: messages messages_sender_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.messages ADD CONSTRAINT messages_sender_id_fkey FOREIGN KEY (sender_id) REFERENCES public.users(id) ON DELETE SET NULL; -- -- Name: sessions sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: chris -- ALTER TABLE ONLY public.sessions ADD CONSTRAINT sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE; -- -- Name: SCHEMA public; Type: ACL; Schema: -; Owner: pg_database_owner -- REVOKE USAGE ON SCHEMA public FROM PUBLIC; -- -- Name: extension_before_drop; Type: EVENT TRIGGER; Schema: -; Owner: chris -- CREATE EVENT TRIGGER extension_before_drop ON ddl_command_start EXECUTE FUNCTION _heroku.extension_before_drop(); ALTER EVENT TRIGGER extension_before_drop OWNER TO chris; -- -- Name: log_create_ext; Type: EVENT TRIGGER; Schema: -; Owner: chris -- CREATE EVENT TRIGGER log_create_ext ON ddl_command_end EXECUTE FUNCTION _heroku.create_ext(); ALTER EVENT TRIGGER log_create_ext OWNER TO chris; -- -- Name: log_drop_ext; Type: EVENT TRIGGER; Schema: -; Owner: chris -- CREATE EVENT TRIGGER log_drop_ext ON sql_drop EXECUTE FUNCTION _heroku.drop_ext(); ALTER EVENT TRIGGER log_drop_ext OWNER TO chris; -- -- Name: validate_extension; Type: EVENT TRIGGER; Schema: -; Owner: chris -- CREATE EVENT TRIGGER validate_extension ON ddl_command_end EXECUTE FUNCTION _heroku.validate_extension(); ALTER EVENT TRIGGER validate_extension OWNER TO chris; -- -- PostgreSQL database dump complete --