This makes sense because there will naturally be cases where multiple districts have the same phone number mapped to different contacts.
90 lines
2.7 KiB
Go
90 lines
2.7 KiB
Go
package platform
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"source.gleipnir.technology/Gleipnir/nidus-sync/db"
|
|
modelcomms "source.gleipnir.technology/Gleipnir/nidus-sync/db/gen/nidus-sync/comms/model"
|
|
querycomms "source.gleipnir.technology/Gleipnir/nidus-sync/db/query/comms"
|
|
"source.gleipnir.technology/Gleipnir/nidus-sync/platform/types"
|
|
)
|
|
|
|
func ContactsForOrganization(ctx context.Context, org_id int32) (results []types.Contact, err error) {
|
|
txn := db.PGInstance.PGXPool
|
|
rows, err := querycomms.ContactsFromOrganizationID(ctx, txn, int64(org_id))
|
|
if err != nil {
|
|
return results, fmt.Errorf("contacts from organization id: %w", err)
|
|
}
|
|
contact_ids := make([]int64, len(rows))
|
|
for i, row := range rows {
|
|
contact_ids[i] = int64(row.ID)
|
|
}
|
|
contact_emails_by_contact_id, err := querycomms.ContactEmailByContactIDs(ctx, txn, contact_ids)
|
|
if err != nil {
|
|
return results, fmt.Errorf("by contact ids: %w", err)
|
|
}
|
|
contact_phones_by_contact_id, err := querycomms.ContactPhoneByContactIDs(ctx, txn, contact_ids)
|
|
if err != nil {
|
|
return results, fmt.Errorf("by contact ids: %w", err)
|
|
}
|
|
e164s := make([]string, 0)
|
|
for _, v := range contact_phones_by_contact_id {
|
|
for _, p := range v {
|
|
e164s = append(e164s, p.E164)
|
|
}
|
|
}
|
|
phones, err := querycomms.PhonesFromE164s(ctx, txn, e164s)
|
|
if err != nil {
|
|
return results, fmt.Errorf("phones from e164: %w", err)
|
|
}
|
|
phones_by_e164 := make(map[string]modelcomms.Phone, len(phones))
|
|
for _, p := range phones {
|
|
phones_by_e164[p.E164] = p
|
|
}
|
|
results = make([]types.Contact, 0)
|
|
for _, row := range rows {
|
|
// Exclude the magic Nidus contact
|
|
if row.ID == 1 {
|
|
continue
|
|
}
|
|
contact_emails := contact_emails_by_contact_id[int64(row.ID)]
|
|
emails := make([]string, len(contact_emails))
|
|
for i, e := range contact_emails {
|
|
emails[i] = e.Address
|
|
}
|
|
contact_phones := contact_phones_by_contact_id[int64(row.ID)]
|
|
phones := make([]types.Phone, len(contact_phones))
|
|
for i, p := range contact_phones {
|
|
phone := phones_by_e164[p.E164]
|
|
phones[i] = types.Phone{
|
|
E164: phone.E164,
|
|
CanSMS: phone.CanSms,
|
|
}
|
|
}
|
|
if row.Name != "" || len(contact_phones) > 0 || len(contact_emails) > 0 {
|
|
results = append(results, types.Contact{
|
|
Emails: emails,
|
|
ID: row.ID,
|
|
Name: row.Name,
|
|
Phones: phones,
|
|
})
|
|
}
|
|
}
|
|
return results, nil
|
|
}
|
|
func ContactEmptyForOrganization(ctx context.Context, txn db.Ex, org_id int32) (modelcomms.Contact, error) {
|
|
contact, err := querycomms.ContactEmptyForOrganization(ctx, txn, int64(org_id))
|
|
if err != nil {
|
|
return modelcomms.Contact{}, fmt.Errorf("querycomms: %w", err)
|
|
}
|
|
if contact != nil {
|
|
return *contact, nil
|
|
}
|
|
return querycomms.ContactInsert(ctx, txn, modelcomms.Contact{
|
|
Created: time.Now(),
|
|
Name: "",
|
|
OrganizationID: org_id,
|
|
})
|
|
}
|