nidus-sync/db/migrations/00112_unify_publicreport.sql

360 lines
9.4 KiB
SQL

-- +goose Up
CREATE TABLE publicreport.report (
-- Address fields
address_raw TEXT NOT NULL,
address_number TEXT NOT NULL,
address_street TEXT NOT NULL,
address_locality TEXT NOT NULL,
address_region TEXT NOT NULL,
address_postal_code TEXT NOT NULL,
address_country TEXT NOT NULL,
address_id INTEGER REFERENCES address(id),
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
-- Location fields
location GEOMETRY(Point, 4326),
h3cell h3index,
id SERIAL,
latlng_accuracy_type publicreport.accuracytype NOT NULL,
latlng_accuracy_value REAL NOT NULL,
map_zoom REAL NOT NULL,
-- Organization
organization_id INTEGER NOT NULL REFERENCES organization(id),
public_id TEXT NOT NULL UNIQUE,
-- Reporter information
reporter_name TEXT NOT NULL,
reporter_email TEXT NOT NULL,
reporter_phone TEXT NOT NULL,
reporter_contact_consent BOOLEAN,
-- Report type discriminator
report_type TEXT NOT NULL CHECK (report_type IN ('nuisance', 'water')),
-- Review fields
reviewed TIMESTAMP WITHOUT TIME ZONE,
reviewer_id INTEGER REFERENCES user_(id),
status publicreport.reportstatustype NOT NULL,
PRIMARY KEY(id)
);
-- Insert nuisance reports into the report table
INSERT INTO publicreport.report (
--id,
public_id,
created,
status,
reporter_name,
reporter_email,
reporter_phone,
reporter_contact_consent,
address_raw,
address_number,
address_street,
address_locality,
address_region,
address_postal_code,
address_country,
address_id,
location,
h3cell,
map_zoom,
latlng_accuracy_type,
latlng_accuracy_value,
reviewed,
reviewer_id,
organization_id,
report_type
)
SELECT
--id,
public_id,
created,
status,
COALESCE(reporter_name, ''),
COALESCE(reporter_email, ''),
COALESCE(reporter_phone, ''),
reporter_contact_consent,
address_raw,
address_number,
address_street,
address_locality,
address_region,
address_postal_code,
address_country,
address_id,
location,
h3cell,
map_zoom,
latlng_accuracy_type,
latlng_accuracy_value,
reviewed,
reviewer_id,
organization_id,
'nuisance' as report_type
FROM publicreport.nuisance;
-- Insert water reports into the report table
INSERT INTO publicreport.report (
--id,
public_id,
created,
status,
reporter_name,
reporter_email,
reporter_phone,
reporter_contact_consent,
address_raw,
address_number,
address_street,
address_locality,
address_region,
address_postal_code,
address_country,
address_id,
location,
h3cell,
map_zoom,
latlng_accuracy_type,
latlng_accuracy_value,
reviewed,
reviewer_id,
organization_id,
report_type
)
SELECT
--id,
public_id,
created,
status,
COALESCE(reporter_name, ''),
COALESCE(reporter_email, ''),
COALESCE(reporter_phone, ''),
reporter_contact_consent,
address_raw,
address_number,
address_street,
address_locality,
address_region,
address_postal_code,
address_country,
address_id,
location,
h3cell,
map_zoom,
-- Water table doesn't have these fields, so use defaults
'none'::publicreport.accuracytype as latlng_accuracy_type,
0.0 as latlng_accuracy_value,
reviewed,
reviewer_id,
organization_id,
'water' as report_type
FROM publicreport.water;
-- Rename existing tables
ALTER TABLE publicreport.nuisance RENAME TO nuisance_old;
ALTER TABLE publicreport.water RENAME TO water_old;
-- Create new nuisance table with only specific fields
CREATE TABLE publicreport.nuisance (
additional_info TEXT NOT NULL,
duration publicreport.nuisancedurationtype NOT NULL,
is_location_backyard BOOLEAN NOT NULL,
is_location_frontyard BOOLEAN NOT NULL,
is_location_garden BOOLEAN NOT NULL,
is_location_other BOOLEAN NOT NULL,
is_location_pool BOOLEAN NOT NULL,
report_id INTEGER REFERENCES publicreport.report(id),
source_container BOOLEAN NOT NULL,
source_description TEXT NOT NULL,
source_stagnant BOOLEAN NOT NULL,
source_gutter BOOLEAN NOT NULL,
tod_early BOOLEAN NOT NULL,
tod_day BOOLEAN NOT NULL,
tod_evening BOOLEAN NOT NULL,
tod_night BOOLEAN NOT NULL,
PRIMARY KEY(report_id)
);
-- Create new water table with only specific fields
CREATE TABLE publicreport.water (
access_comments TEXT NOT NULL,
access_gate BOOLEAN NOT NULL,
access_fence BOOLEAN NOT NULL,
access_locked BOOLEAN NOT NULL,
access_dog BOOLEAN NOT NULL,
access_other BOOLEAN NOT NULL,
comments TEXT NOT NULL,
is_reporter_confidential BOOLEAN NOT NULL,
is_reporter_owner BOOLEAN NOT NULL,
has_adult BOOLEAN NOT NULL,
has_backyard_permission BOOLEAN NOT NULL,
has_larvae BOOLEAN NOT NULL,
has_pupae BOOLEAN NOT NULL,
owner_email TEXT NOT NULL,
owner_name TEXT NOT NULL,
owner_phone TEXT NOT NULL,
report_id INTEGER REFERENCES publicreport.report(id),
PRIMARY KEY(report_id)
);
-- Migrate nuisance-specific data
INSERT INTO publicreport.nuisance (
report_id,
additional_info,
duration,
source_container,
source_description,
source_stagnant,
source_gutter,
is_location_backyard,
is_location_frontyard,
is_location_garden,
is_location_other,
is_location_pool,
tod_early,
tod_day,
tod_evening,
tod_night
)
SELECT
r.id,
n.additional_info,
n.duration,
n.source_container,
n.source_description,
n.source_stagnant,
n.source_gutter,
n.is_location_backyard,
n.is_location_frontyard,
n.is_location_garden,
n.is_location_other,
n.is_location_pool,
n.tod_early,
n.tod_day,
n.tod_evening,
n.tod_night
FROM publicreport.nuisance_old n
JOIN publicreport.report r ON r.public_id = n.public_id AND r.report_type = 'nuisance';
-- Migrate water-specific data
INSERT INTO publicreport.water (
report_id,
access_comments,
access_gate,
access_fence,
access_locked,
access_dog,
access_other,
comments,
has_adult,
has_larvae,
has_pupae,
owner_email,
owner_name,
owner_phone,
has_backyard_permission,
is_reporter_confidential,
is_reporter_owner
)
SELECT
r.id,
w.access_comments,
w.access_gate,
w.access_fence,
w.access_locked,
w.access_dog,
w.access_other,
w.comments,
w.has_adult,
w.has_larvae,
w.has_pupae,
w.owner_email,
w.owner_name,
w.owner_phone,
w.has_backyard_permission,
w.is_reporter_confidential,
w.is_reporter_owner
FROM publicreport.water_old w
JOIN publicreport.report r ON r.public_id = w.public_id AND r.report_type = 'water';
-- Create new unified report_image junction table
CREATE TABLE publicreport.report_image (
image_id INTEGER NOT NULL REFERENCES publicreport.image(id),
report_id INTEGER NOT NULL REFERENCES publicreport.report(id),
PRIMARY KEY (image_id, report_id)
);
-- Update nuisance_image table
ALTER TABLE publicreport.nuisance_image RENAME TO nuisance_image_old;
INSERT INTO publicreport.report_image (image_id, report_id)
SELECT ni.image_id, r.id as report_id
FROM publicreport.nuisance_image_old ni
JOIN publicreport.nuisance_old n ON n.id = ni.nuisance_id
JOIN publicreport.report r ON r.public_id = n.public_id AND r.report_type = 'nuisance';
-- Update water_image table
ALTER TABLE publicreport.water_image RENAME TO water_image_old;
INSERT INTO publicreport.report_image (image_id, report_id)
SELECT wi.image_id, r.id as report_id
FROM publicreport.water_image_old wi
JOIN publicreport.water_old w ON w.id = wi.water_id
JOIN publicreport.report r ON r.public_id = w.public_id AND r.report_type = 'water';
-- Create new unified notify_report_email
CREATE TABLE publicreport.notify_email (
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
deleted TIMESTAMP WITHOUT TIME ZONE,
email_address TEXT NOT NULL REFERENCES comms.email_contact(address),
report_id INTEGER NOT NULL REFERENCES publicreport.report(id),
PRIMARY KEY (report_id, email_address)
);
-- Update notify_email_nuisance table
ALTER TABLE publicreport.notify_email_nuisance RENAME TO notify_email_nuisance_old;
INSERT INTO publicreport.notify_email (created, deleted, report_id, email_address)
SELECT nen.created, nen.deleted, r.id as report_id, nen.email_address
FROM publicreport.notify_email_nuisance_old nen
JOIN publicreport.nuisance_old n ON n.id = nen.nuisance_id
JOIN publicreport.report r ON r.public_id = n.public_id AND r.report_type = 'nuisance';
-- Update notify_email_water table
ALTER TABLE publicreport.notify_email_water RENAME TO notify_email_water_old;
INSERT INTO publicreport.notify_email (created, deleted, report_id, email_address)
SELECT new.created, new.deleted, r.id as report_id, new.email_address
FROM publicreport.notify_email_water_old new
JOIN publicreport.water_old w ON w.id = new.water_id
JOIN publicreport.report r ON r.public_id = w.public_id AND r.report_type = 'water';
-- Update notify_phone_nuisance table
ALTER TABLE publicreport.notify_phone_nuisance RENAME TO notify_phone_nuisance_old;
CREATE TABLE publicreport.notify_phone (
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
deleted TIMESTAMP WITHOUT TIME ZONE,
phone_e164 TEXT NOT NULL REFERENCES comms.phone(e164),
report_id INTEGER NOT NULL REFERENCES publicreport.report(id),
PRIMARY KEY (report_id, phone_e164)
);
INSERT INTO publicreport.notify_phone (created, deleted, report_id, phone_e164)
SELECT npn.created, npn.deleted, r.id as report_id, npn.phone_e164
FROM publicreport.notify_phone_nuisance_old npn
JOIN publicreport.nuisance_old n ON n.id = npn.nuisance_id
JOIN publicreport.report r ON r.public_id = n.public_id AND r.report_type = 'nuisance';
-- Update notify_phone_water table
ALTER TABLE publicreport.notify_phone_water RENAME TO notify_phone_water_old;
INSERT INTO publicreport.notify_phone (created, deleted, report_id, phone_e164)
SELECT npw.created, npw.deleted, r.id as report_id, npw.phone_e164
FROM publicreport.notify_phone_water_old npw
JOIN publicreport.water_old w ON w.id = npw.water_id
JOIN publicreport.report r ON r.public_id = w.public_id AND r.report_type = 'water';