120 lines
2.9 KiB
MySQL
120 lines
2.9 KiB
MySQL
|
|
-- +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;
|