Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
0f18173
Updated volunteer_details and user_skills DDL; removed deprecated tables
Joshitha-Uppalapati Dec 5, 2025
c1448c0
Normalize user_skills and update volunteer_details schema
Joshitha-Uppalapati Dec 15, 2025
fa087a9
Change user_id type from uuid to VARCHAR(255)
Joshitha-Uppalapati Dec 15, 2025
2b76a76
Add volunteer_applications DDL with acceptance trigger
Joshitha-Uppalapati Dec 17, 2025
f97b9d3
Update volunteer tables: VARCHAR user_id, govt_id_path2, cleanup fields
Joshitha-Uppalapati Dec 17, 2025
8287223
Fix acceptance trigger to avoid duplicate volunteer_details insert
Joshitha-Uppalapati Dec 17, 2025
1097086
Add test case script for volunteer onboarding trigger
Joshitha-Uppalapati Dec 18, 2025
1399c67
volunteer_applications table and triggers
Joshitha-Uppalapati Dec 20, 2025
f111196
volunteer_details table schema
Joshitha-Uppalapati Dec 20, 2025
034852a
user_skills table schema
Joshitha-Uppalapati Dec 20, 2025
5d95302
Refactor volunteer_applications table and add triggers
PallaviChitrada10 Dec 24, 2025
00d178c
Update volunteer_details table structure and indexes
PallaviChitrada10 Dec 24, 2025
ef45865
Modify user_skills table structure and add triggers
PallaviChitrada10 Dec 24, 2025
0287625
Add SQL test cases for volunteer onboarding process
PallaviChitrada10 Dec 24, 2025
ff3934a
Refactor SQL test cases for volunteer onboarding
PallaviChitrada10 Dec 24, 2025
92a5672
Refactor updated_at_handler for volunteer applications
PallaviChitrada10 Dec 25, 2025
0289cf0
Resolve conflicts and finalize volunteer onboarding schema, triggers,…
Joshitha-Uppalapati Dec 20, 2025
dfa7bb0
Delete script-library/tests/volunteer_onboarding_trigger_test.sql
PallaviChitrada10 Dec 25, 2025
0fae3a8
Fix availability schema and add emergency flag
Joshitha-Uppalapati Mar 16, 2026
89db8da
Resolve merge conflict with remote
Joshitha-Uppalapati Mar 16, 2026
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
7 changes: 4 additions & 3 deletions ddl/Tables/ddl_user_availability.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
CREATE TABLE IF NOT EXISTS virginia_dev_saayam_rdbms.user_availability (
user_availability_id SERIAL PRIMARY KEY,
user_id VARCHAR(255) NOT NULL,
day_of_week VARCHAR(10) CHECK (day_of_week IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')),
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
day_of_week VARCHAR(10) NOT NULL CHECK (day_of_week IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')),
CHECK (end_time > start_time),
start_time TIME NOT NULL,
end_time TIME NOT NULL,
last_update_date TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES virginia_dev_saayam_rdbms.users (user_id)
);
Expand Down
22 changes: 10 additions & 12 deletions ddl/Tables/ddl_user_skills.sql
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
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,
CREATE TABLE virginia_dev_saayam_rdbms.user_skills (
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)
);
cat_id INT NOT NULL,

created_at TIMESTAMP WITHOUT TIME ZONE,
updated_at TIMESTAMP WITHOUT TIME ZONE,

CONSTRAINT user_skills_pkey PRIMARY KEY (user_id, cat_id)
);

1 change: 1 addition & 0 deletions ddl/Tables/ddl_users.sql
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ CREATE TABLE IF NOT EXISTS virginia_dev_saayam_rdbms.users (
last_location point,
last_update_date TIMESTAMP,
time_zone VARCHAR(255) NULL,
is_emergency_available BOOLEAN DEFAULT FALSE,
profile_picture_path VARCHAR(255) NULL,
gender VARCHAR(255) NULL,
language_1 VARCHAR(255) NULL,
Expand Down
101 changes: 101 additions & 0 deletions ddl/Tables/ddl_volunteer_applications.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
DROP TABLE IF EXISTS virginia_dev_saayam_rdbms.volunteer_applications CASCADE;

CREATE TABLE virginia_dev_saayam_rdbms.volunteer_applications (
user_id VARCHAR(255) PRIMARY KEY,

terms_and_conditions BOOLEAN,
terms_and_conditions_accepted_at TIMESTAMP WITHOUT TIME ZONE,

skill_codes JSON,
availability JSONB,

application_status TEXT,
is_completed BOOLEAN,
current_page TEXT,

govt_id_storage_path TEXT,
path_updated_at TIMESTAMP WITHOUT TIME ZONE,

created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now()
);

CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.set_application_updated_at()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$;

DROP TRIGGER IF EXISTS trg_set_application_updated_at
ON virginia_dev_saayam_rdbms.volunteer_applications;

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

CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.handle_application_acceptance()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF OLD.application_status = 'submitted'
AND NEW.application_status = 'accepted'
THEN
INSERT INTO virginia_dev_saayam_rdbms.volunteer_details (
user_id,
terms_and_conditions,
terms_and_conditions_update_date,
govt_id_path1,
availability_days,
availability_times,
created_at,
updated_at
)
VALUES (
NEW.user_id,
NEW.terms_and_conditions,
NEW.terms_and_conditions_accepted_at,
NEW.govt_id_storage_path,
NEW.availability -> 'days',
NEW.availability -> 'time',
NEW.updated_at,
NEW.updated_at
);

IF NEW.skill_codes IS NOT NULL THEN
INSERT INTO virginia_dev_saayam_rdbms.user_skills (
user_id,
cat_id,
created_at,
updated_at
)
SELECT
NEW.user_id,
value::INT,
NEW.updated_at,
NEW.updated_at
FROM json_array_elements_text(NEW.skill_codes);
END IF;

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

RETURN NULL;
END;
$$;

DROP TRIGGER IF EXISTS trg_handle_application_acceptance
ON virginia_dev_saayam_rdbms.volunteer_applications;

CREATE TRIGGER trg_handle_application_acceptance
AFTER UPDATE OF application_status
ON virginia_dev_saayam_rdbms.volunteer_applications
FOR EACH ROW
EXECUTE FUNCTION virginia_dev_saayam_rdbms.handle_application_acceptance();
50 changes: 13 additions & 37 deletions ddl/Tables/ddl_volunteer_details.sql
Original file line number Diff line number Diff line change
@@ -1,43 +1,19 @@
-- 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;

-- -- Rename the column from pii to skills
-- ALTER TABLE IF EXISTS virginia_dev_saayam_rdbms.volunteer_details RENAME COLUMN pii TO skills;
CREATE TABLE virginia_dev_saayam_rdbms.volunteer_details (
user_id VARCHAR(255) PRIMARY KEY,

-- used to store unstructured data
terms_and_conditions BOOLEAN,
terms_and_conditions_update_date TIMESTAMP WITHOUT TIME ZONE,

-- To ensure each volunteer is unique by user_id as we don’t plan to allow multiple volunteer rows per use
govt_id_path1 TEXT,
govt_id_path2 TEXT,
path1_updated_at TIMESTAMP WITHOUT TIME ZONE,
path2_updated_at TIMESTAMP WITHOUT TIME ZONE,

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;
$$;
availability_days JSON,
availability_times JSON,

created_at TIMESTAMP WITHOUT TIME ZONE,
updated_at TIMESTAMP WITHOUT TIME ZONE
);
63 changes: 63 additions & 0 deletions script-library/tests/volunteer_onboarding.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
-- WRITE YOUR OWN TEST CASES AS WE HAVE THE FOREIGN KEY IMPLEMENTED
INSERT INTO public.help_categories (cat_id, cat_name) VALUES
('1', 'Education & Tutoring'),
('2', 'Medical Assistance'),
('3', 'Logistics & Transport'),
('2.1', 'Child Care'),
('5', 'Administrative Support');

INSERT INTO public.users (full_name) VALUES
('Alice Johnson'),
('Bob Smith');

-- Insert a test application
INSERT INTO public.volunteer_applications (user_id, application_status)
VALUES ('SID-00-000-000-001', 'STARTED');

-- Update a field (like current_page) and check if updated_at changes
UPDATE public.volunteer_applications
SET current_page = 2
WHERE user_id = 'SID-00-000-000-001';

-- Update the govt_id_path specifically
-- Check if path_updated_at refreshes while others remain distinct
UPDATE public.volunteer_applications
SET govt_id_path = 'https://storage.com/alice_id.jpg'
WHERE user_id = 'SID-00-000-000-001';

SELECT user_id, updated_at, path_updated_at FROM virginia_dev_saayam_rdbms.volunteer_applications;

-- Test Volunteer Acceptance (Migration Trigger)
UPDATE public.volunteer_applications
SET application_status = 'IN_REVIEW',
skill_codes = '["2", "5"]',
availability = '{"days": ["Monday", "Wednesday"], "time": ["2025-12-24 23:17:20.929643"]}'::JSONB,
terms_and_conditions = TRUE
WHERE user_id = 'SID-00-000-000-001';

-- This executes your 'handle_volunteer_application' function
UPDATE public.volunteer_applications
SET application_status = 'ACCEPTED'
WHERE user_id = 'SID-00-000-000-001';

SELECT * FROM public.volunteer_details WHERE user_id = 'SID-00-000-000-001';
SELECT * FROM public.user_skills WHERE user_id = 'SID-00-000-000-001';
SELECT * FROM public.volunteer_applications WHERE user_id = 'SID-00-000-000-001';

-- Use EXPLAIN to confirm the index idx_user_skills_cat_id is being used
EXPLAIN ANALYZE
SELECT user_id
FROM public.user_skills
WHERE cat_id = '5';

-- Search for volunteers available on Monday
SELECT user_id
FROM virginia_dev_saayam_rdbms.volunteer_details
WHERE availability_days ? 'Monday';

SELECT user_id
FROM public.volunteer_details
WHERE availability_times ? '2025-12-24 23:17:20.929643';