Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions ddl/Tables/ddl_meeting_participants.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
CREATE TABLE virginia_dev_saayam_rdbms.meeting_participants(
meeting_id VARCHAR(255) NOT NULL,
participant_id VARCHAR(255) NOT NULL,

--Unique identifer for table
CONSTRAINT meeting_participant_pk
PRIMARY KEY (meeting_id, participant_id),

-- Foreign key constraint for meeting_id
CONSTRAINT meeting_participant_meetingid_fk
FOREIGN KEY (meeting_id)
REFERENCES meetings(meeting_id),

-- Foreign key constraint for participant_id
CONSTRAINT meeting_participant_participant_fk
FOREIGN KEY (participant_id)
REFERENCES users(user_id)

);

-- INDEXING

-- Index to pull participants for a particular meeting
CREATE INDEX IF NOT EXISTS mp_meeting_id_idx
ON meeting_participants(meeting_id);

29 changes: 29 additions & 0 deletions ddl/Tables/ddl_meetings.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
-- Meetings table
-- Timezone is WITHOUT TIMEZONE (UTC default)

SET TIME ZONE 'UTC';

CREATE TABLE virginia_dev_saayam_rdbms.meetings (
meeting_id VARCHAR(255) NOT NULL,
meeting_date DATE NOT NULL,
start_time TIME WITHOUT TIME ZONE NOT NULL,
end_time TIME WITHOUT TIME ZONE NOT NULL,
cohost_id VARCHAR(255) NOT NULL,

-- Primary key constraint
CONSTRAINT meetings_pk
PRIMARY KEY(meeting_id, cohost_id),

--Unique idenitifer for table
CONSTRAINT meetings_meeting_id_unique
UNIQUE(meeting_id),

-- Foreign key constraint
CONSTRAINT meetings_fk
FOREIGN KEY (cohost_id)
REFERENCES users(user_id),

-- Time check constraint
CONSTRAINT meetings_time_chk
CHECK (end_time>start_time)
);
30 changes: 17 additions & 13 deletions ddl/Tables/ddl_user_skills.sql
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
CREATE TYPE skill_levels AS ENUM('BEGINNER', 'INTERMEDIATE', 'ADVANCED', 'EXPERT');
DROP TABLE IF EXISTS virginia_dev_saayam_rdbms.user_skills CASCADE;

-- Table: user_skills
CREATE TABLE IF NOT EXISTS virginia_dev_saayam_rdbms.user_skills (
user_skills_id SERIAL PRIMARY KEY,
user_id VARCHAR(255) NOT NULL,
skill_id INT NOT NULL,
skill_level skill_levels,
last_used_date TIMESTAMP,
created_date TIMESTAMP,
last_update_date TIMESTAMP,
FOREIGN KEY (skill_id) REFERENCES virginia_dev_saayam_rdbms.skill_list (skill_list_id),
FOREIGN KEY (user_id) REFERENCES virginia_dev_saayam_rdbms.users (user_id)
);
CREATE TABLE virginia_dev_saayam_rdbms.user_skills (
user_id VARCHAR(255),
cat_id VARCHAR(50) NOT NULL,
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
last_updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
PRIMARY KEY (user_id, cat_id),
FOREIGN KEY (user_id) REFERENCES virginia_dev_saayam_rdbms.users(user_id),
FOREIGN KEY (cat_id) REFERENCES virginia_dev_saayam_rdbms.help_categories(cat_id)
);

CREATE TRIGGER trg_user_skills_updated_at
BEFORE UPDATE ON virginia_dev_saayam_rdbms.user_skills
FOR EACH ROW
EXECUTE FUNCTION set_updated_at();

CREATE INDEX idx_user_skills_cat_id ON virginia_dev_saayam_rdbms.user_skills (cat_id);
108 changes: 108 additions & 0 deletions ddl/Tables/ddl_volunteer_applications.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
-- ENUM for application status
CREATE TYPE virginia_dev_saayam_rdbms.app_status_type AS ENUM ('STARTED', 'IN_REVIEW', 'ACCEPTED', 'REJECTED');

-- Create the volunteer_applications table
CREATE TABLE virginia_dev_saayam_rdbms.volunteer_applications (
user_id VARCHAR(255) PRIMARY KEY,
terms_and_conditions BOOLEAN DEFAULT FALSE,
terms_accepted_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
govt_id_path TEXT,
path_updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
skill_codes JSON,
availability JSONB,
current_page INT DEFAULT 1, -- Changed from TEXT to INT for numerical tracking
application_status virginia_dev_saayam_rdbms.app_status_type DEFAULT 'STARTED',
is_completed BOOLEAN DEFAULT FALSE, --extra precaution
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
last_updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
FOREIGN KEY (user_id) REFERENCES virginia_dev_saayam_rdbms.users(user_id)
);

CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.updated_at_handler()
RETURNS TRIGGER AS $$
BEGIN
-- check if the last_updated_at was explicitly changed in the UPDATE statement.
-- if it WASN'T changed by the API, we force it to the current UTC.
IF (NEW.last_updated_at IS NOT DISTINCT FROM OLD.last_updated_at) THEN
NEW.last_updated_at = (now() AT TIME ZONE 'UTC');
END IF;

-- handle application table
IF (TG_TABLE_NAME = 'volunteer_applications') THEN
-- Update path timestamp if path changed
IF (NEW.govt_id_path IS DISTINCT FROM OLD.govt_id_path) THEN
NEW.path_updated_at = (now() AT TIME ZONE 'UTC');
END IF;

-- Update terms timestamp if accepted
IF (NEW.terms_and_conditions IS TRUE AND (OLD.terms_and_conditions IS FALSE OR OLD.terms_and_conditions IS NULL)) THEN
NEW.terms_accepted_at = (now() AT TIME ZONE 'UTC');
END IF;

-- handle details table
ELSIF (TG_TABLE_NAME = 'volunteer_details') THEN
-- update path1 timestamp if changed
IF (NEW.govt_id_path1 IS DISTINCT FROM OLD.govt_id_path1) THEN
NEW.path1_updated_at = (now() AT TIME ZONE 'UTC');
END IF;

-- update path2 timestamp if changed
IF (NEW.govt_id_path2 IS DISTINCT FROM OLD.govt_id_path2) THEN
NEW.path2_updated_at = (now() AT TIME ZONE 'UTC');
END IF;

-- update terms timestamp if accepted
IF (NEW.terms_and_conditions IS TRUE AND (OLD.terms_and_conditions IS FALSE OR OLD.terms_and_conditions IS NULL)) THEN
NEW.terms_accepted_at = (now() AT TIME ZONE 'UTC');
END IF;
END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.handle_volunteer_application()
RETURNS TRIGGER AS $$
BEGIN
IF (NEW.application_status = 'ACCEPTED' AND OLD.application_status != 'ACCEPTED') THEN

-- Migrate to volunteer_details
INSERT INTO virginia_dev_saayam_rdbms.volunteer_details (
user_id, terms_and_conditions, terms_accepted_at,
govt_id_path1, path1_updated_at, path2_updated_at, availability_days, availability_times,
created_at, last_updated_at
) VALUES (
NEW.user_id, NEW.terms_and_conditions, NEW.terms_accepted_at,
NEW.govt_id_path, NEW.path_updated_at, NULL, (NEW.availability -> 'days')::JSONB, (NEW.availability -> 'time')::JSONB,
NEW.last_updated_at, NEW.last_updated_at
);

-- Migrate to user_skills (unrolling the JSON array)
IF (NEW.skill_codes IS NOT NULL) THEN
INSERT INTO virginia_dev_saayam_rdbms.user_skills (
user_id, cat_id, created_at, last_updated_at
)
SELECT
NEW.user_id,
skill_id,
NEW.last_updated_at,
NEW.last_updated_at
FROM json_array_elements_text(NEW.skill_codes) AS skill_id;
END IF;

DELETE FROM virginia_dev_saayam_rdbms.volunteer_applications WHERE user_id = NEW.user_id;
END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_volunteer_app_updated_at
BEFORE UPDATE ON virginia_dev_saayam_rdbms.volunteer_applications
FOR EACH ROW EXECUTE FUNCTION virginia_dev_saayam_rdbms.updated_at_handler();

CREATE TRIGGER trg_handle_volunteer_application
AFTER UPDATE ON virginia_dev_saayam_rdbms.volunteer_applications
FOR EACH ROW EXECUTE FUNCTION virginia_dev_saayam_rdbms.handle_volunteer_application();

ALTER TABLE virginia_dev_saayam_rdbms.volunteer_applications ENABLE TRIGGER trg_volunteer_app_updated_at;
63 changes: 24 additions & 39 deletions ddl/Tables/ddl_volunteer_details.sql
Original file line number Diff line number Diff line change
@@ -1,43 +1,28 @@
-- Table: volunteer_details (Volunteer-specific details)
DROP TABLE IF EXISTS virginia_dev_saayam_rdbms.volunteer_details CASCADE;
CREATE TABLE IF NOT EXISTS virginia_dev_saayam_rdbms.volunteer_details (
user_id VARCHAR(255) PRIMARY KEY,
terms_and_conditions BOOL NULL,
terms_and_conditions_update_date TIMESTAMP NULL,
govt_id_path VARCHAR(255) NULL, -- stored in S3, this attribute stores the S3 link
govt_id_update_date TIMESTAMP NULL,
skills JSONB NULL, -- to store unstructured data
notification BOOL NULL,
iscomplete BOOL NULL,
completed_date TIMESTAMP NULL,
location geography(Point,4326),
CONSTRAINT volunteer_details_user_fk
FOREIGN KEY (user_id)
REFERENCES virginia_dev_saayam_rdbms.users (user_id)
ON DELETE CASCADE
);

-- --IF you have already table exists and trying to change the column name and type from Pii varchar(255) to skills jsonb
-- -- Change the column type from varchar to json
-- ALTER TABLE IF EXISTS virginia_dev_saayam_rdbms.volunteer_details ALTER COLUMN pii TYPE jsonb USING pii::jsonb;
-- DROP TABLE IF EXISTS virginia_dev_saayam_rdbms.volunteer_details CASCADE;

-- -- Rename the column from pii to skills
-- ALTER TABLE IF EXISTS virginia_dev_saayam_rdbms.volunteer_details RENAME COLUMN pii TO skills;

-- used to store unstructured data
CREATE TABLE virginia_dev_saayam_rdbms.volunteer_details (
user_id VARCHAR(255) PRIMARY KEY,
terms_and_conditions BOOLEAN,
terms_accepted_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
govt_id_path1 TEXT,
govt_id_path2 TEXT,
path1_updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
path2_updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
availability_days JSONB,
availability_times JSONB,
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
last_updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC'),
FOREIGN KEY (user_id) REFERENCES virginia_dev_saayam_rdbms.users(user_id)
);

-- To ensure each volunteer is unique by user_id as we don’t plan to allow multiple volunteer rows per use
CREATE TRIGGER trg_volunteer_details_updated_at
BEFORE UPDATE ON virginia_dev_saayam_rdbms.volunteer_details
FOR EACH ROW EXECUTE FUNCTION virginia_dev_saayam_rdbms.updated_at_handler();

DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'volunteer_details_user_uk'
AND conrelid = 'virginia_dev_saayam_rdbms.volunteer_details'::regclass
) THEN
ALTER TABLE virginia_dev_saayam_rdbms.volunteer_details
ADD CONSTRAINT volunteer_details_user_uk UNIQUE (user_id);
END IF;
END;
$$;
-- Index for searching specific days (e.g., 'Monday')
CREATE INDEX idx_volunteer_availability_days
ON virginia_dev_saayam_rdbms.volunteer_details USING GIN (availability_days);

-- Index for searching specific time slots
CREATE INDEX idx_volunteer_availability_times
ON virginia_dev_saayam_rdbms.volunteer_details USING GIN (availability_times);
16 changes: 8 additions & 8 deletions dml/Populating Data Files/help_categories.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cat_id,cat_name,cat_desc
cat_id,cat_name,cat_desc
0.0.0.0.0,GENERAL_CATEGORY,GENERAL_CATEGORY_DESC
1,FOOD_AND_ESSENTIALS,FOOD_AND_ESSENTIALS_DESC
1.1,FOOD_ASSISTANCE,FOOD_ASSISTANCE_DESC
Expand All @@ -16,9 +16,14 @@
2.4,TAILORING,TAILORING_DESC
3,HOUSING_ASSISTANCE,HOUSING_ASSISTANCE_DESC
3.1,LEASE_SUPPORT,LEASE_SUPPORT_DESC
3.10,SELL_THINGS,SELL_THINGS_DESC
3.2,TENANT_RENT_SUPPORT,TENANT_RENT_SUPPORT_DESC
3.3,REPAIR_MAINTENANCE_SUPPORT,REPAIR_MAINTENANCE_SUPPORT_DESC
3.3.1,PLUMBING,PLUMBING_DESC
3.3.10,MASONRY_OR_CONCRETE,MASONRY_OR_CONCRETE_DESC
3.3.11,METALWORK_OR_WELDING,METALWORK_OR_WELDING_DESC
3.3.12,POOL_AND_SPA_MAINTENANCE,POOL_AND_SPA_MAINTENANCE_DESC
3.3.13,OTHER_RAPAIR_MAINTENANCE_SUPPORT,OTHER_RAPAIR_MAINTENANCE_SUPPORT_DESC
3.3.2,HANDYMAN,HANDYMAN_DESC
3.3.3,ELECTRICIAN,ELECTRICIAN_DESC
3.3.4,CARPENTRY,CARPENTRY_DESC
Expand All @@ -27,17 +32,12 @@
3.3.7,ROOFING,ROOFING_DESC
3.3.8,LOCKSMITH,LOCKSMITH_DESC
3.3.9,PAINTING,PAINTING_DESC
3.3.10,MASONRY_OR_CONCRETE,MASONRY_OR_CONCRETE_DESC
3.3.11,METALWORK_OR_WELDING,METALWORK_OR_WELDING_DESC
3.3.12,POOL_AND_SPA_MAINTENANCE,POOL_AND_SPA_MAINTENANCE_DESC
3.3.13,OTHER_RAPAIR_MAINTENANCE_SUPPORT,OTHER_RAPAIR_MAINTENANCE_SUPPORT_DESC
3.4,UTILITIES_SETUP_SUPPORT,UTILITIES_SETUP_SUPPORT_DESC
3.5,LOOKING_FOR_RENTAL,LOOKING_FOR_RENTAL_DESC
3.6,FIND_ROOMATE,FIND_ROOMATE_DESC
3.7,MOVE_IN_HELP,MOVE_IN_HELP_DESC
3.8,BOOKING_PACKERS_MOVERS_SUPPORT,BOOKING_PACKERS_MOVERS_SUPPORT_DESC
3.9,BUY_THINGS,BUY_THINGS_DESC
3.10,SELL_THINGS,SELL_THINGS_DESC
4,EDUCATION_CAREER_SUPPORT,EDUCATION_CAREER_SUPPORT_DESC
4.1,COLLEGE_APPLICATION_HELP,COLLEGE_APPLICATION_HELP_DESC
4.2,SOP_ESSAY_REVIEW,SOP_ESSAY_REVIEW_DESC
Expand All @@ -55,6 +55,8 @@
5,HEALTHCARE_AND_WELLNESS,HEALTHCARE_AND_WELLNESS_DESC
5.1,MEDICAL_CONSULTATION,MEDICAL_CONSULTATION_DESC
5.1.1,GENERAL_CONSULTATION,GENERAL_CONSULTATION_DESC
5.1.10,PEDIATRICS_OR_CHILD_HEALTH,PEDIATRICS_OR_CHILD_HEALTH_DESC
5.1.11,OTHER_MEDICAL_CONCERN,OTHER_MEDICAL_CONCERN_DESC
5.1.2,ENT(EAR_NOSE_AND_THROAT),ENT(EAR_NOSE_AND_THROAT)_DESC
5.1.3,DENTAL_OR_ORAL_HEALTH,DENTAL_OR_ORAL_HEALTH_DESC
5.1.4,EYE_OR_VISION_CARE,EYE_OR_VISION_CARE_DESC
Expand All @@ -63,8 +65,6 @@
5.1.7,SKIN_OR_DERMATOLOGY,SKIN_OR_DERMATOLOGY_DESC
5.1.8,WOMENS_OR_REPRODUCTIVE_HEALTH,WOMENS_OR_REPRODUCTIVE_HEALTH_DESC
5.1.9,VACCINATIONS_AND_PREVENTIVE_SCREENINGS,VACCINATIONS_AND_PREVENTIVE_SCREENINGS_DESC
5.1.10,PEDIATRICS_OR_CHILD_HEALTH,PEDIATRICS_OR_CHILD_HEALTH_DESC
5.1.11,OTHER_MEDICAL_CONCERN,OTHER_MEDICAL_CONCERN_DESC
5.2,MEDICINE_DELIVERY,MEDICINE_DELIVERY_DESC
5.3,MENTAL_WELLBEING_SUPPORT,MENTAL_WELLBEING_SUPPORT_DESC
5.4,MEDICATION_REMINDERS,MEDICATION_REMINDERS_DESC
Expand Down
Loading