All checks were successful
build-and-release / build (developers) (push) Successful in 1m42s
build-and-release / build (companies) (push) Successful in 1m48s
build-and-release / build (catering-services) (push) Successful in 1m55s
build-and-release / build (cron) (push) Successful in 2m4s
build-and-release / build (customers) (push) Successful in 2m26s
build-and-release / build (employees) (push) Successful in 1m24s
build-and-release / build (fitness-trainers) (push) Successful in 1m37s
build-and-release / build (gateway) (push) Successful in 1m38s
build-and-release / build (graphic-designers) (push) Successful in 1m54s
build-and-release / build (jobs) (push) Successful in 1m48s
build-and-release / build (leads) (push) Successful in 1m40s
build-and-release / build (job-seekers) (push) Successful in 2m52s
build-and-release / build (photographers) (push) Successful in 1m50s
build-and-release / build (payments) (push) Successful in 2m16s
build-and-release / build (makeup-artists) (push) Successful in 2m48s
build-and-release / build (tutors) (push) Successful in 2m16s
build-and-release / build (social-media-managers) (push) Successful in 2m42s
build-and-release / build (ugc-content-creators) (push) Successful in 2m36s
build-and-release / build (video-editors) (push) Successful in 2m19s
build-and-release / build (users) (push) Successful in 5m10s
Adds a DB-trigger-generated reference_number (NXT-{TYPE}-{YY}-{000001}) to
verifications, support_tickets, payments, job_applications, lead_requests,
and users, replacing raw UUIDs shown to customers/admins. Also fixes
verification-status endpoint to return uploaded documents (previously
omitted, so documents never appeared after submission), and adds a
reference-number lookup endpoint for the AI support assistant.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
171 lines
8 KiB
PL/PgSQL
171 lines
8 KiB
PL/PgSQL
-- Human-readable, sequential, unique reference numbers for user-facing entities.
|
|
-- Format: NXT-{TYPE}-{YY}-{000001}. Generated via BEFORE INSERT trigger so every
|
|
-- existing and future insert path (there are many, scattered across apps) picks
|
|
-- one up automatically without needing per-call-site application changes.
|
|
|
|
-- ============ verifications ============
|
|
CREATE SEQUENCE IF NOT EXISTS verification_number_seq;
|
|
ALTER TABLE verifications ADD COLUMN IF NOT EXISTS reference_number VARCHAR;
|
|
|
|
CREATE OR REPLACE FUNCTION set_verification_reference_number() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF NEW.reference_number IS NULL THEN
|
|
NEW.reference_number := 'NXT-VER-' || to_char(NOW(), 'YY') || '-' || lpad(nextval('verification_number_seq')::text, 6, '0');
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_verifications_reference_number ON verifications;
|
|
CREATE TRIGGER trg_verifications_reference_number
|
|
BEFORE INSERT ON verifications
|
|
FOR EACH ROW EXECUTE FUNCTION set_verification_reference_number();
|
|
|
|
-- ============ support_tickets ============
|
|
CREATE SEQUENCE IF NOT EXISTS ticket_number_seq;
|
|
ALTER TABLE support_tickets ADD COLUMN IF NOT EXISTS reference_number VARCHAR;
|
|
|
|
CREATE OR REPLACE FUNCTION set_ticket_reference_number() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF NEW.reference_number IS NULL THEN
|
|
NEW.reference_number := 'NXT-TCK-' || to_char(NOW(), 'YY') || '-' || lpad(nextval('ticket_number_seq')::text, 6, '0');
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_support_tickets_reference_number ON support_tickets;
|
|
CREATE TRIGGER trg_support_tickets_reference_number
|
|
BEFORE INSERT ON support_tickets
|
|
FOR EACH ROW EXECUTE FUNCTION set_ticket_reference_number();
|
|
|
|
-- ============ payments ============
|
|
CREATE SEQUENCE IF NOT EXISTS payment_number_seq;
|
|
ALTER TABLE payments ADD COLUMN IF NOT EXISTS reference_number VARCHAR;
|
|
|
|
CREATE OR REPLACE FUNCTION set_payment_reference_number() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF NEW.reference_number IS NULL THEN
|
|
NEW.reference_number := 'NXT-PAY-' || to_char(NOW(), 'YY') || '-' || lpad(nextval('payment_number_seq')::text, 6, '0');
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_payments_reference_number ON payments;
|
|
CREATE TRIGGER trg_payments_reference_number
|
|
BEFORE INSERT ON payments
|
|
FOR EACH ROW EXECUTE FUNCTION set_payment_reference_number();
|
|
|
|
-- ============ job_applications ============
|
|
CREATE SEQUENCE IF NOT EXISTS job_application_number_seq;
|
|
ALTER TABLE job_applications ADD COLUMN IF NOT EXISTS reference_number VARCHAR;
|
|
|
|
CREATE OR REPLACE FUNCTION set_job_application_reference_number() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF NEW.reference_number IS NULL THEN
|
|
NEW.reference_number := 'NXT-JOB-' || to_char(NOW(), 'YY') || '-' || lpad(nextval('job_application_number_seq')::text, 6, '0');
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_job_applications_reference_number ON job_applications;
|
|
CREATE TRIGGER trg_job_applications_reference_number
|
|
BEFORE INSERT ON job_applications
|
|
FOR EACH ROW EXECUTE FUNCTION set_job_application_reference_number();
|
|
|
|
-- ============ lead_requests ============
|
|
CREATE SEQUENCE IF NOT EXISTS lead_request_number_seq;
|
|
ALTER TABLE lead_requests ADD COLUMN IF NOT EXISTS reference_number VARCHAR;
|
|
|
|
CREATE OR REPLACE FUNCTION set_lead_request_reference_number() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF NEW.reference_number IS NULL THEN
|
|
NEW.reference_number := 'NXT-LED-' || to_char(NOW(), 'YY') || '-' || lpad(nextval('lead_request_number_seq')::text, 6, '0');
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_lead_requests_reference_number ON lead_requests;
|
|
CREATE TRIGGER trg_lead_requests_reference_number
|
|
BEFORE INSERT ON lead_requests
|
|
FOR EACH ROW EXECUTE FUNCTION set_lead_request_reference_number();
|
|
|
|
-- ============ users ============
|
|
CREATE SEQUENCE IF NOT EXISTS user_number_seq;
|
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS reference_number VARCHAR;
|
|
|
|
CREATE OR REPLACE FUNCTION set_user_reference_number() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF NEW.reference_number IS NULL THEN
|
|
NEW.reference_number := 'NXT-USR-' || to_char(NOW(), 'YY') || '-' || lpad(nextval('user_number_seq')::text, 6, '0');
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_users_reference_number ON users;
|
|
CREATE TRIGGER trg_users_reference_number
|
|
BEFORE INSERT ON users
|
|
FOR EACH ROW EXECUTE FUNCTION set_user_reference_number();
|
|
|
|
-- ============ backfill existing rows, oldest first ============
|
|
DO $$
|
|
DECLARE r RECORD;
|
|
BEGIN
|
|
FOR r IN SELECT id, created_at FROM verifications WHERE reference_number IS NULL ORDER BY created_at, id LOOP
|
|
UPDATE verifications SET reference_number = 'NXT-VER-' || to_char(r.created_at, 'YY') || '-' || lpad(nextval('verification_number_seq')::text, 6, '0') WHERE id = r.id;
|
|
END LOOP;
|
|
|
|
FOR r IN SELECT id, created_at FROM support_tickets WHERE reference_number IS NULL ORDER BY created_at, id LOOP
|
|
UPDATE support_tickets SET reference_number = 'NXT-TCK-' || to_char(r.created_at, 'YY') || '-' || lpad(nextval('ticket_number_seq')::text, 6, '0') WHERE id = r.id;
|
|
END LOOP;
|
|
|
|
FOR r IN SELECT id, created_at FROM payments WHERE reference_number IS NULL ORDER BY created_at, id LOOP
|
|
UPDATE payments SET reference_number = 'NXT-PAY-' || to_char(r.created_at, 'YY') || '-' || lpad(nextval('payment_number_seq')::text, 6, '0') WHERE id = r.id;
|
|
END LOOP;
|
|
|
|
FOR r IN SELECT id, created_at FROM job_applications WHERE reference_number IS NULL ORDER BY created_at, id LOOP
|
|
UPDATE job_applications SET reference_number = 'NXT-JOB-' || to_char(r.created_at, 'YY') || '-' || lpad(nextval('job_application_number_seq')::text, 6, '0') WHERE id = r.id;
|
|
END LOOP;
|
|
|
|
FOR r IN SELECT id, created_at FROM lead_requests WHERE reference_number IS NULL ORDER BY created_at, id LOOP
|
|
UPDATE lead_requests SET reference_number = 'NXT-LED-' || to_char(r.created_at, 'YY') || '-' || lpad(nextval('lead_request_number_seq')::text, 6, '0') WHERE id = r.id;
|
|
END LOOP;
|
|
|
|
FOR r IN SELECT id, created_at FROM users WHERE reference_number IS NULL ORDER BY created_at, id LOOP
|
|
UPDATE users SET reference_number = 'NXT-USR-' || to_char(r.created_at, 'YY') || '-' || lpad(nextval('user_number_seq')::text, 6, '0') WHERE id = r.id;
|
|
END LOOP;
|
|
END $$;
|
|
|
|
-- ============ enforce NOT NULL + UNIQUE now that every row has one ============
|
|
ALTER TABLE verifications ALTER COLUMN reference_number SET NOT NULL;
|
|
ALTER TABLE support_tickets ALTER COLUMN reference_number SET NOT NULL;
|
|
ALTER TABLE payments ALTER COLUMN reference_number SET NOT NULL;
|
|
ALTER TABLE job_applications ALTER COLUMN reference_number SET NOT NULL;
|
|
ALTER TABLE lead_requests ALTER COLUMN reference_number SET NOT NULL;
|
|
ALTER TABLE users ALTER COLUMN reference_number SET NOT NULL;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'verifications_reference_number_key') THEN
|
|
ALTER TABLE verifications ADD CONSTRAINT verifications_reference_number_key UNIQUE (reference_number);
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'support_tickets_reference_number_key') THEN
|
|
ALTER TABLE support_tickets ADD CONSTRAINT support_tickets_reference_number_key UNIQUE (reference_number);
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'payments_reference_number_key') THEN
|
|
ALTER TABLE payments ADD CONSTRAINT payments_reference_number_key UNIQUE (reference_number);
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'job_applications_reference_number_key') THEN
|
|
ALTER TABLE job_applications ADD CONSTRAINT job_applications_reference_number_key UNIQUE (reference_number);
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'lead_requests_reference_number_key') THEN
|
|
ALTER TABLE lead_requests ADD CONSTRAINT lead_requests_reference_number_key UNIQUE (reference_number);
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'users_reference_number_key') THEN
|
|
ALTER TABLE users ADD CONSTRAINT users_reference_number_key UNIQUE (reference_number);
|
|
END IF;
|
|
END $$;
|