diff --git a/.gitignore b/.gitignore index d1627e1..4740530 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **/c.out **/c.html bookings +database.yml diff --git a/database-template.yml b/database-template.yml new file mode 100644 index 0000000..8ba6378 --- /dev/null +++ b/database-template.yml @@ -0,0 +1,14 @@ +development: + dialect: postgres + database: bookings + user: + password: + host: 127.0.0.1 + pool: 5 + +test: + url: {{envOr "TEST_DATABASE_URL" "postgres://postgres:postgres@127.0.0.1:5432/myapp_test"}} + +production: + url: {{envOr "DATABASE_URL" "postgres://postgres:postgres@127.0.0.1:5432/myapp_production"}} + diff --git a/migrations/20240706133130_create_user_table.down.fizz b/migrations/20240706133130_create_user_table.down.fizz new file mode 100644 index 0000000..69c603a --- /dev/null +++ b/migrations/20240706133130_create_user_table.down.fizz @@ -0,0 +1 @@ +sql("DROP TABLE users") diff --git a/migrations/20240706133130_create_user_table.up.fizz b/migrations/20240706133130_create_user_table.up.fizz new file mode 100644 index 0000000..898f73c --- /dev/null +++ b/migrations/20240706133130_create_user_table.up.fizz @@ -0,0 +1,8 @@ +create_table("users") { + t.Column("id", "integer", {primary: true}) + t.Column("first_name", "string", {"default": ""}) + t.Column("last_name", "string", {"default": ""}) + t.Column("email", "string", {}) + t.Column("password", "string", {"size": 60}) + t.Column("access_level", "integer", {"default": 1}) +} diff --git a/migrations/20240706135509_create_reservations_table.down.fizz b/migrations/20240706135509_create_reservations_table.down.fizz new file mode 100644 index 0000000..6d8a7e8 --- /dev/null +++ b/migrations/20240706135509_create_reservations_table.down.fizz @@ -0,0 +1 @@ +drop_table("reservations") diff --git a/migrations/20240706135509_create_reservations_table.up.fizz b/migrations/20240706135509_create_reservations_table.up.fizz new file mode 100644 index 0000000..ce4f6af --- /dev/null +++ b/migrations/20240706135509_create_reservations_table.up.fizz @@ -0,0 +1,11 @@ +create_table("reservations") { + t.Column("id", "integer", {primary: true}) + t.Column("first_name", "string", {"default": ""}) + t.Column("last_name", "string", {"default": ""}) + t.Column("email", "string", {}) + t.Column("phone", "string", {"default": ""}) + t.Column("start_date", "date", {}) + t.Column("end_date", "date", {}) + t.Column("room_id", "integer", {}) +} + diff --git a/migrations/20240706135731_create_rooms_table.down.fizz b/migrations/20240706135731_create_rooms_table.down.fizz new file mode 100644 index 0000000..688a764 --- /dev/null +++ b/migrations/20240706135731_create_rooms_table.down.fizz @@ -0,0 +1 @@ +drop_table("rooms") diff --git a/migrations/20240706135731_create_rooms_table.up.fizz b/migrations/20240706135731_create_rooms_table.up.fizz new file mode 100644 index 0000000..0b14148 --- /dev/null +++ b/migrations/20240706135731_create_rooms_table.up.fizz @@ -0,0 +1,5 @@ +create_table("rooms") { + t.Column("id", "integer", {primary: true}) + t.Column("room_name", "string", {}) +} + diff --git a/migrations/20240706140027_create_restrictions_table.down.fizz b/migrations/20240706140027_create_restrictions_table.down.fizz new file mode 100644 index 0000000..8dc715e --- /dev/null +++ b/migrations/20240706140027_create_restrictions_table.down.fizz @@ -0,0 +1 @@ +drop_table("restrictions") diff --git a/migrations/20240706140027_create_restrictions_table.up.fizz b/migrations/20240706140027_create_restrictions_table.up.fizz new file mode 100644 index 0000000..d3fdf35 --- /dev/null +++ b/migrations/20240706140027_create_restrictions_table.up.fizz @@ -0,0 +1,5 @@ +create_table("restrictions") { + t.Column("id", "integer", {primary: true}) + t.Column("restriction_name", "string", {}) +} + diff --git a/migrations/20240706140145_create_room_restrictions_table.down.fizz b/migrations/20240706140145_create_room_restrictions_table.down.fizz new file mode 100644 index 0000000..5a0883b --- /dev/null +++ b/migrations/20240706140145_create_room_restrictions_table.down.fizz @@ -0,0 +1,2 @@ +drop_table("room_restrictions") + diff --git a/migrations/20240706140145_create_room_restrictions_table.up.fizz b/migrations/20240706140145_create_room_restrictions_table.up.fizz new file mode 100644 index 0000000..a541a15 --- /dev/null +++ b/migrations/20240706140145_create_room_restrictions_table.up.fizz @@ -0,0 +1,9 @@ +create_table("room_restrictions") { + t.Column("id", "integer", {primary: true}) + t.Column("start_date", "date", {}) + t.Column("end_date", "date", {}) + t.Column("room_id", "integer", {}) + t.Column("reservation_id", "integer", {}) + t.Column("restriction_id", "integer", {}) +} + diff --git a/migrations/20240706140417_create_fkfor_reservations_table.down.fizz b/migrations/20240706140417_create_fkfor_reservations_table.down.fizz new file mode 100644 index 0000000..25b9e2b --- /dev/null +++ b/migrations/20240706140417_create_fkfor_reservations_table.down.fizz @@ -0,0 +1 @@ +drop_foreign_key("reservations", "reservations_rooms_id_fk") diff --git a/migrations/20240706140417_create_fkfor_reservations_table.up.fizz b/migrations/20240706140417_create_fkfor_reservations_table.up.fizz new file mode 100644 index 0000000..db2a72d --- /dev/null +++ b/migrations/20240706140417_create_fkfor_reservations_table.up.fizz @@ -0,0 +1,4 @@ +add_foreign_key("reservations", "room_id", {"rooms": ["id"]}, { + "on_delete": "cascade", + "on_update": "cascade", +}) diff --git a/migrations/20240706140947_create_fkfor_room_restrictions_table.down.fizz b/migrations/20240706140947_create_fkfor_room_restrictions_table.down.fizz new file mode 100644 index 0000000..c8ebf43 --- /dev/null +++ b/migrations/20240706140947_create_fkfor_room_restrictions_table.down.fizz @@ -0,0 +1,3 @@ +drop_foreign_key("room_restrictions", "room_restrictions_rooms_id_fk") +drop_foreign_key("room_restrictions", "room_restrictions_restrictions_id_fk") + diff --git a/migrations/20240706140947_create_fkfor_room_restrictions_table.up.fizz b/migrations/20240706140947_create_fkfor_room_restrictions_table.up.fizz new file mode 100644 index 0000000..6580cee --- /dev/null +++ b/migrations/20240706140947_create_fkfor_room_restrictions_table.up.fizz @@ -0,0 +1,9 @@ +add_foreign_key("room_restrictions", "room_id", {"rooms": ["id"]}, { + "on_delete": "cascade", + "on_update": "cascade", +}) + +add_foreign_key("room_restrictions", "restriction_id", {"restrictions": ["id"]}, { + "on_delete": "cascade", + "on_update": "cascade", +}) diff --git a/migrations/20240706142050_create_unique_index_for_users_table.down.fizz b/migrations/20240706142050_create_unique_index_for_users_table.down.fizz new file mode 100644 index 0000000..a37fb50 --- /dev/null +++ b/migrations/20240706142050_create_unique_index_for_users_table.down.fizz @@ -0,0 +1,2 @@ +drop_index("users", "users_email_idx") + diff --git a/migrations/20240706142050_create_unique_index_for_users_table.up.fizz b/migrations/20240706142050_create_unique_index_for_users_table.up.fizz new file mode 100644 index 0000000..57c0751 --- /dev/null +++ b/migrations/20240706142050_create_unique_index_for_users_table.up.fizz @@ -0,0 +1 @@ +add_index("users", "email", {"unique": true}) diff --git a/migrations/20240706142334_create_indices_on_room_restrictions.down.fizz b/migrations/20240706142334_create_indices_on_room_restrictions.down.fizz new file mode 100644 index 0000000..811e6b5 --- /dev/null +++ b/migrations/20240706142334_create_indices_on_room_restrictions.down.fizz @@ -0,0 +1,4 @@ +drop_index("room_restrictions", "room_restrictions_reservation_id_idx") +drop_index("room_restrictions", "room_restrictions_room_id_idx") +drop_index("room_restrictions", "room_restrictions_start_date_end_date_idx") + diff --git a/migrations/20240706142334_create_indices_on_room_restrictions.up.fizz b/migrations/20240706142334_create_indices_on_room_restrictions.up.fizz new file mode 100644 index 0000000..55d5ece --- /dev/null +++ b/migrations/20240706142334_create_indices_on_room_restrictions.up.fizz @@ -0,0 +1,3 @@ +add_index("room_restrictions", ["start_date", "end_date"], {}) +add_index("room_restrictions", "room_id", {}) +add_index("room_restrictions", "reservation_id", {}) diff --git a/migrations/20240706144027_add_fkand_indices_to_reservation_table.down.fizz b/migrations/20240706144027_add_fkand_indices_to_reservation_table.down.fizz new file mode 100644 index 0000000..40c01d7 --- /dev/null +++ b/migrations/20240706144027_add_fkand_indices_to_reservation_table.down.fizz @@ -0,0 +1,4 @@ +drop_foreign_key("room_restrictions", "room_restrictions_reservations_id_fk") +drop_index("room_restrictions", "reservations_email_idx") +drop_index("room_restrictions", "reservations_last_name_idx") + diff --git a/migrations/20240706144027_add_fkand_indices_to_reservation_table.up.fizz b/migrations/20240706144027_add_fkand_indices_to_reservation_table.up.fizz new file mode 100644 index 0000000..3bc37ea --- /dev/null +++ b/migrations/20240706144027_add_fkand_indices_to_reservation_table.up.fizz @@ -0,0 +1,9 @@ +add_foreign_key("room_restrictions", "reservation_id", {"reservations": ["id"]}, { + "on_delete": "cascade", + "on_update": "cascade", +}) + +add_index("reservations", "email", {}) +add_index("reservations", "last_name", {}) + + diff --git a/migrations/schema.sql b/migrations/schema.sql new file mode 100644 index 0000000..367b070 --- /dev/null +++ b/migrations/schema.sql @@ -0,0 +1,395 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 16.3 (Ubuntu 16.3-0ubuntu0.24.04.1) +-- Dumped by pg_dump version 16.3 (Ubuntu 16.3-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; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: reservations; Type: TABLE; Schema: public; Owner: jing +-- + +CREATE TABLE public.reservations ( + id integer NOT NULL, + first_name character varying(255) DEFAULT ''::character varying NOT NULL, + last_name character varying(255) DEFAULT ''::character varying NOT NULL, + email character varying(255) NOT NULL, + phone character varying(255) DEFAULT ''::character varying NOT NULL, + start_date date NOT NULL, + end_date date NOT NULL, + room_id integer NOT NULL, + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL +); + + +ALTER TABLE public.reservations OWNER TO jing; + +-- +-- Name: reservations_id_seq; Type: SEQUENCE; Schema: public; Owner: jing +-- + +CREATE SEQUENCE public.reservations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER SEQUENCE public.reservations_id_seq OWNER TO jing; + +-- +-- Name: reservations_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: jing +-- + +ALTER SEQUENCE public.reservations_id_seq OWNED BY public.reservations.id; + + +-- +-- Name: restrictions; Type: TABLE; Schema: public; Owner: jing +-- + +CREATE TABLE public.restrictions ( + id integer NOT NULL, + restriction_name character varying(255) NOT NULL, + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL +); + + +ALTER TABLE public.restrictions OWNER TO jing; + +-- +-- Name: restrictions_id_seq; Type: SEQUENCE; Schema: public; Owner: jing +-- + +CREATE SEQUENCE public.restrictions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER SEQUENCE public.restrictions_id_seq OWNER TO jing; + +-- +-- Name: restrictions_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: jing +-- + +ALTER SEQUENCE public.restrictions_id_seq OWNED BY public.restrictions.id; + + +-- +-- Name: room_restrictions; Type: TABLE; Schema: public; Owner: jing +-- + +CREATE TABLE public.room_restrictions ( + id integer NOT NULL, + start_date date NOT NULL, + end_date date NOT NULL, + room_id integer NOT NULL, + reservation_id integer NOT NULL, + restriction_id integer NOT NULL, + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL +); + + +ALTER TABLE public.room_restrictions OWNER TO jing; + +-- +-- Name: room_restrictions_id_seq; Type: SEQUENCE; Schema: public; Owner: jing +-- + +CREATE SEQUENCE public.room_restrictions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER SEQUENCE public.room_restrictions_id_seq OWNER TO jing; + +-- +-- Name: room_restrictions_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: jing +-- + +ALTER SEQUENCE public.room_restrictions_id_seq OWNED BY public.room_restrictions.id; + + +-- +-- Name: rooms; Type: TABLE; Schema: public; Owner: jing +-- + +CREATE TABLE public.rooms ( + id integer NOT NULL, + room_name character varying(255) NOT NULL, + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL +); + + +ALTER TABLE public.rooms OWNER TO jing; + +-- +-- Name: rooms_id_seq; Type: SEQUENCE; Schema: public; Owner: jing +-- + +CREATE SEQUENCE public.rooms_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER SEQUENCE public.rooms_id_seq OWNER TO jing; + +-- +-- Name: rooms_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: jing +-- + +ALTER SEQUENCE public.rooms_id_seq OWNED BY public.rooms.id; + + +-- +-- Name: schema_migration; Type: TABLE; Schema: public; Owner: jing +-- + +CREATE TABLE public.schema_migration ( + version character varying(14) NOT NULL +); + + +ALTER TABLE public.schema_migration OWNER TO jing; + +-- +-- Name: users; Type: TABLE; Schema: public; Owner: jing +-- + +CREATE TABLE public.users ( + id integer NOT NULL, + first_name character varying(255) DEFAULT ''::character varying NOT NULL, + last_name character varying(255) DEFAULT ''::character varying NOT NULL, + email character varying(255) NOT NULL, + password character varying(60) NOT NULL, + access_level integer DEFAULT 1 NOT NULL, + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL +); + + +ALTER TABLE public.users OWNER TO jing; + +-- +-- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: jing +-- + +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 jing; + +-- +-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: jing +-- + +ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id; + + +-- +-- Name: reservations id; Type: DEFAULT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.reservations ALTER COLUMN id SET DEFAULT nextval('public.reservations_id_seq'::regclass); + + +-- +-- Name: restrictions id; Type: DEFAULT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.restrictions ALTER COLUMN id SET DEFAULT nextval('public.restrictions_id_seq'::regclass); + + +-- +-- Name: room_restrictions id; Type: DEFAULT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.room_restrictions ALTER COLUMN id SET DEFAULT nextval('public.room_restrictions_id_seq'::regclass); + + +-- +-- Name: rooms id; Type: DEFAULT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.rooms ALTER COLUMN id SET DEFAULT nextval('public.rooms_id_seq'::regclass); + + +-- +-- Name: users id; Type: DEFAULT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass); + + +-- +-- Name: reservations reservations_pkey; Type: CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.reservations + ADD CONSTRAINT reservations_pkey PRIMARY KEY (id); + + +-- +-- Name: restrictions restrictions_pkey; Type: CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.restrictions + ADD CONSTRAINT restrictions_pkey PRIMARY KEY (id); + + +-- +-- Name: room_restrictions room_restrictions_pkey; Type: CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.room_restrictions + ADD CONSTRAINT room_restrictions_pkey PRIMARY KEY (id); + + +-- +-- Name: rooms rooms_pkey; Type: CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.rooms + ADD CONSTRAINT rooms_pkey PRIMARY KEY (id); + + +-- +-- Name: schema_migration schema_migration_pkey; Type: CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.schema_migration + ADD CONSTRAINT schema_migration_pkey PRIMARY KEY (version); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: reservations_email_idx; Type: INDEX; Schema: public; Owner: jing +-- + +CREATE INDEX reservations_email_idx ON public.reservations USING btree (email); + + +-- +-- Name: reservations_last_name_idx; Type: INDEX; Schema: public; Owner: jing +-- + +CREATE INDEX reservations_last_name_idx ON public.reservations USING btree (last_name); + + +-- +-- Name: room_restrictions_reservation_id_idx; Type: INDEX; Schema: public; Owner: jing +-- + +CREATE INDEX room_restrictions_reservation_id_idx ON public.room_restrictions USING btree (reservation_id); + + +-- +-- Name: room_restrictions_room_id_idx; Type: INDEX; Schema: public; Owner: jing +-- + +CREATE INDEX room_restrictions_room_id_idx ON public.room_restrictions USING btree (room_id); + + +-- +-- Name: room_restrictions_start_date_end_date_idx; Type: INDEX; Schema: public; Owner: jing +-- + +CREATE INDEX room_restrictions_start_date_end_date_idx ON public.room_restrictions USING btree (start_date, end_date); + + +-- +-- Name: schema_migration_version_idx; Type: INDEX; Schema: public; Owner: jing +-- + +CREATE UNIQUE INDEX schema_migration_version_idx ON public.schema_migration USING btree (version); + + +-- +-- Name: users_email_idx; Type: INDEX; Schema: public; Owner: jing +-- + +CREATE UNIQUE INDEX users_email_idx ON public.users USING btree (email); + + +-- +-- Name: reservations reservations_rooms_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.reservations + ADD CONSTRAINT reservations_rooms_id_fk FOREIGN KEY (room_id) REFERENCES public.rooms(id) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- Name: room_restrictions room_restrictions_reservations_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.room_restrictions + ADD CONSTRAINT room_restrictions_reservations_id_fk FOREIGN KEY (reservation_id) REFERENCES public.reservations(id) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- Name: room_restrictions room_restrictions_restrictions_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.room_restrictions + ADD CONSTRAINT room_restrictions_restrictions_id_fk FOREIGN KEY (restriction_id) REFERENCES public.restrictions(id) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- Name: room_restrictions room_restrictions_rooms_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: jing +-- + +ALTER TABLE ONLY public.room_restrictions + ADD CONSTRAINT room_restrictions_rooms_id_fk FOREIGN KEY (room_id) REFERENCES public.rooms(id) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- PostgreSQL database dump complete +-- +