Update reporter contact on report update

This is as a complicated one because it involves merging contact
information in tricky cases.

I assume that phone should override email, primarily because setting up
phones is more tightly regulated. This may be a terrible assumption.

Issue: #13
This commit is contained in:
Eli Ribble 2026-05-21 18:44:28 +00:00
parent dcce7cda1c
commit 6175e1a811
No known key found for this signature in database
5 changed files with 139 additions and 30 deletions

View file

@ -53,6 +53,24 @@ func ContactEmptyForOrganization(ctx context.Context, txn db.Ex, org_id int64) (
}
return &row, nil
}
func ContactFromEmail(ctx context.Context, txn db.Ex, email string) (*model.Contact, error) {
statement := table.Contact.SELECT(
table.Contact.AllColumns,
).FROM(
table.Contact.INNER_JOIN(
table.ContactEmail,
table.ContactEmail.ContactID.EQ(table.Contact.ID),
),
).WHERE(table.ContactEmail.Address.EQ(postgres.String(email)))
row, err := db.ExecuteOne[model.Contact](ctx, statement)
if err != nil {
if errors.Is(err, db.ErrNoRows) {
return nil, nil
}
return nil, fmt.Errorf("query contact from email '%s': %w", email, err)
}
return &row, nil
}
func ContactFromID(ctx context.Context, txn db.Ex, id int64) (model.Contact, error) {
statement := table.Contact.SELECT(
table.Contact.AllColumns,
@ -74,7 +92,24 @@ func ContactsFromIDs(ctx context.Context, txn db.Ex, contact_ids []int64) ([]mod
WHERE(table.Contact.ID.IN(sql_ids...))
return db.ExecuteManyTx[model.Contact](ctx, txn, statement)
}
func ContactFromPhone(ctx context.Context, txn db.Ex, e164 string) (*model.Contact, error) {
statement := table.Contact.SELECT(
table.Contact.AllColumns,
).FROM(
table.Contact.INNER_JOIN(
table.ContactPhone,
table.ContactPhone.ContactID.EQ(table.Contact.ID),
),
).WHERE(table.ContactPhone.E164.EQ(postgres.String(e164)))
row, err := db.ExecuteOne[model.Contact](ctx, statement)
if err != nil {
if errors.Is(err, db.ErrNoRows) {
return nil, nil
}
return nil, fmt.Errorf("query contact from phone '%s': %w", e164, err)
}
return &row, nil
}
func ContactUpdateName(ctx context.Context, txn db.Ex, id int64, name string) error {
statement := table.Contact.UPDATE().
SET(

View file

@ -51,3 +51,11 @@ func ContactEmailByContactIDs(ctx context.Context, txn db.Ex, contact_ids []int6
}
return result, nil
}
func ContactEmailUpdateContactID(ctx context.Context, txn db.Ex, address string, contact_id int64) error {
statement := table.ContactEmail.UPDATE().
SET(
table.ContactEmail.ContactID.SET(postgres.Int(contact_id)),
).
WHERE(table.ContactEmail.Address.EQ(postgres.String(address)))
return db.ExecuteNoneTx(ctx, txn, statement)
}

View file

@ -13,7 +13,7 @@ import (
)
func ContactPhoneInsert(ctx context.Context, txn db.Ex, m model.ContactPhone) (model.ContactPhone, error) {
statement := table.ContactPhone.INSERT(table.ContactPhone.MutableColumns).
statement := table.ContactPhone.INSERT(table.ContactPhone.AllColumns).
MODEL(m).
RETURNING(table.ContactPhone.AllColumns)
return db.ExecuteOneTx[model.ContactPhone](ctx, txn, statement)

View file

@ -126,3 +126,11 @@ func ReportsFromReporterPhone(ctx context.Context, txn db.Ex, destination string
)
return db.ExecuteManyTx[model.Report](ctx, txn, statement)
}
func ReportUpdateReporterContactID(ctx context.Context, txn db.Ex, id int64, contact_id int64) error {
statement := table.Report.UPDATE().
SET(
table.Report.ReporterContactID.SET(postgres.Int(contact_id)),
).
WHERE(table.Report.ID.EQ(postgres.Int(id)))
return db.ExecuteNoneTx(ctx, txn, statement)
}