nidus-sync/db/migrations/00151_comms_contact.sql

120 lines
2.9 KiB
MySQL
Raw Normal View History

-- +goose Up
CREATE TABLE comms.contact (
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
id SERIAL NOT NULL,
name TEXT NOT NULL,
organization_id INTEGER NOT NULL REFERENCES organization(id),
PRIMARY KEY(id)
);
CREATE TABLE comms.contact_email (
address TEXT NOT NULL,
confirmed BOOLEAN NOT NULL,
contact_id INTEGER NOT NULL REFERENCES comms.contact(id),
id SERIAL NOT NULL,
is_subscribed BOOLEAN NOT NULL,
PRIMARY KEY(address)
);
CREATE TABLE comms.contact_phone (
can_sms BOOLEAN NOT NULL,
confirmed_message_id INTEGER REFERENCES comms.text_log(id),
contact_id INTEGER NOT NULL REFERENCES comms.contact(id),
e164 TEXT NOT NULL,
is_subscribed BOOLEAN NOT NULL,
stop_message_id INTEGER REFERENCES comms.text_log(id),
PRIMARY KEY(e164)
);
ALTER TABLE publicreport.report
ADD COLUMN reporter_contact_id INTEGER REFERENCES comms.contact(id);
-- insert a placeholder contact for the system
INSERT INTO comms.contact (
created,
name,
organization_id
) SELECT
CURRENT_TIMESTAMP,
'Nidus',
id
FROM organization WHERE is_catchall = TRUE;
-- insert contacts where we have names, dropping duplicates
INSERT INTO comms.contact (
created,
name,
organization_id
) SELECT DISTINCT ON (reporter_name, organization_id)
created,
reporter_name,
organization_id
FROM publicreport.report
WHERE reporter_name != ''
ORDER BY reporter_name, organization_id, created ASC;
UPDATE publicreport.report
SET reporter_contact_id = comms.contact.id
FROM comms.contact
WHERE comms.contact.name = report.reporter_name
AND reporter_name != '';
-- insert contacts where we don't have names
INSERT INTO comms.contact (
created,
name,
organization_id
) SELECT
created,
reporter_name,
organization_id
FROM publicreport.report
WHERE report.reporter_name = '';
UPDATE publicreport.report
SET reporter_contact_id = comms.contact.id
FROM comms.contact
WHERE comms.contact.created = report.created;
-- At this point every publicreport.report should have an associated contact ID.
-- We'll make sure of this via constraint before moving the email and phone data into
-- the contacts
ALTER TABLE publicreport.report
ALTER COLUMN reporter_contact_id SET NOT NULL;
-- Now copy over all of the contact information we have into the new contact rows
INSERT INTO comms.contact_email (
address,
confirmed,
contact_id,
is_subscribed
) SELECT
reporter_email,
COALESCE(reporter_contact_consent, false),
reporter_contact_id,
FALSE
FROM publicreport.report WHERE report.reporter_email != ''
ON CONFLICT DO NOTHING;
INSERT INTO comms.contact_phone (
can_sms,
confirmed_message_id,
contact_id,
e164,
is_subscribed,
stop_message_id
) SELECT
reporter_phone_can_sms,
NULL,
reporter_contact_id,
reporter_phone,
FALSE,
NULL
FROM publicreport.report WHERE publicreport.report.reporter_phone != ''
ON CONFLICT DO NOTHING;
-- +goose Down
ALTER TABLE publicreport.report
DROP COLUMN reporter_contact_id;
DROP TABLE comms.contact_phone;
DROP TABLE comms.contact_email;
DROP TABLE comms.contact;