From b5923137a7cb5c420f6db1e678eebceff9f56ab7 Mon Sep 17 00:00:00 2001 From: Eli Ribble Date: Wed, 22 Apr 2026 19:54:06 +0000 Subject: [PATCH] Set organization (district) for compliance reports from mailer --- platform/compliance.go | 22 ++++++++++++++++ platform/publicreport/compliance.go | 3 ++- resource/publicreport_compliance.go | 40 +++++++++++++++++++++-------- 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/platform/compliance.go b/platform/compliance.go index b158b3dd..c4eb2e8c 100644 --- a/platform/compliance.go +++ b/platform/compliance.go @@ -6,6 +6,7 @@ import ( "strconv" "time" + "github.com/Gleipnir-Technology/bob" "github.com/Gleipnir-Technology/bob/dialect/psql" "github.com/Gleipnir-Technology/bob/dialect/psql/sm" "github.com/Gleipnir-Technology/nidus-sync/db" @@ -16,6 +17,7 @@ import ( "github.com/aarondl/opt/omit" "github.com/aarondl/opt/omitnull" //"github.com/rs/zerolog/log" + "github.com/stephenafamo/scan" ) func ComplianceRequestMailerCreate(ctx context.Context, user User, site_id int32) (int32, error) { @@ -133,3 +135,23 @@ func ComplianceReportRequestFromPublicID(ctx context.Context, public_id string) } return types.ComplianceReportRequestFromModel(row), nil } +func OrganizationIDForComplianceReportRequest(ctx context.Context, public_id string) (int32, error) { + type _Row struct { + ID int32 `db:"organization_id"` + } + row, err := bob.One(ctx, db.PGInstance.BobDB, psql.Select( + sm.Columns( + models.Sites.Columns.OrganizationID, + ), + sm.From(models.ComplianceReportRequests.NameAs()), + sm.InnerJoin(models.Leads.NameAs()).On( + models.ComplianceReportRequests.Columns.LeadID.EQ(models.Leads.Columns.ID)), + sm.InnerJoin(models.Sites.NameAs()).On( + models.Leads.Columns.SiteID.EQ(models.Sites.Columns.ID)), + sm.Where(models.ComplianceReportRequests.Columns.PublicID.EQ(psql.Arg(public_id))), + ), scan.StructMapper[_Row]()) + if err != nil { + return 0, fmt.Errorf("query compliance report request") + } + return row.ID, nil +} diff --git a/platform/publicreport/compliance.go b/platform/publicreport/compliance.go index c4a60c80..8df8069f 100644 --- a/platform/publicreport/compliance.go +++ b/platform/publicreport/compliance.go @@ -29,7 +29,8 @@ func compliance(ctx context.Context, public_id string, report *types.PublicRepor models.PublicreportCompliances.Columns.ReportPhoneCanText, models.PublicreportCompliances.Columns.WantsScheduled, ), - sm.From(psql.Quote("publicreport", "compliance")).As("publicreport.compliance"), + //sm.From(psql.Quote("publicreport", "compliance")).As("publicreport.compliance"), + sm.From(models.PublicreportCompliances.NameAs()), sm.Where(models.PublicreportCompliances.Columns.ReportID.EQ( psql.Arg(report.ID), )), diff --git a/resource/publicreport_compliance.go b/resource/publicreport_compliance.go index 4e976b93..882a66a5 100644 --- a/resource/publicreport_compliance.go +++ b/resource/publicreport_compliance.go @@ -58,12 +58,32 @@ func (res *complianceR) ByID(ctx context.Context, r *http.Request, query QueryPa return res.complianceHydrate(report) } func (res *complianceR) Create(ctx context.Context, r *http.Request, n publicreportComplianceForm) (*types.PublicReportCompliance, *nhttp.ErrorWithStatus) { - if n.District.IsUnset() { - return nil, nhttp.NewBadRequest("You must provide a district_id") + if n.District.IsUnset() && n.MailerID.IsUnset() { + return nil, nhttp.NewBadRequest("You must provide a district_id or mailer_id") } - district_id, err := res.router.IDFromURI("district.ByIDGet", n.District.MustGet()) - if err != nil || district_id == nil { - return nil, nhttp.NewBadRequest("parse district ID: %w", err) + var district_id int32 + var err error + var public_id string + if n.District.IsValue() { + district_str := n.District.MustGet() + var district_id_ptr *int + district_id_ptr, err = res.router.IDFromURI("district.ByIDGet", district_str) + if err != nil || district_id_ptr == nil { + return nil, nhttp.NewBadRequest("parse district ID: %w", err) + } + district_id = int32(*district_id_ptr) + public_id, err = platform.GenerateReportID() + if err != nil { + return nil, nhttp.NewError("generate public ID: %w", err) + } + } + if n.MailerID.IsValue() { + public_id = n.MailerID.MustGet() + org_id, err := platform.OrganizationIDForComplianceReportRequest(ctx, public_id) + if err != nil { + return nil, nhttp.NewBadRequest("no such mailer") + } + district_id = org_id } user_agent := r.Header.Get("User-Agent") err = platform.EnsureClient(ctx, n.ClientID, user_agent) @@ -80,10 +100,10 @@ func (res *complianceR) Create(ctx context.Context, r *http.Request, n publicrep LatlngAccuracyType: omit.From(enums.PublicreportAccuracytypeBrowser), LatlngAccuracyValue: omit.From(float32(0.0)), //Location: omitnull.From(fmt.Sprintf("ST_GeometryFromText(Point(%s %s))", longitude, latitude)), - Location: omitnull.FromPtr[string](nil), - MapZoom: omit.From(float32(0.0)), - //OrganizationID: omit.From[int32](int32(*district_id)), - PublicID: n.MailerID, + Location: omitnull.FromPtr[string](nil), + MapZoom: omit.From(float32(0.0)), + OrganizationID: omit.From[int32](district_id), + PublicID: omit.From(public_id), ReporterEmail: omit.From(""), ReporterName: omit.From(""), ReporterPhone: omit.From(""), @@ -101,7 +121,7 @@ func (res *complianceR) Create(ctx context.Context, r *http.Request, n publicrep //ReportID omit.Val[int32] WantsScheduled: omitnull.FromPtr[bool](nil), } - report, err := platform.PublicReportComplianceCreate(ctx, setter_report, setter_compliance, int32(*district_id)) + report, err := platform.PublicReportComplianceCreate(ctx, setter_report, setter_compliance, district_id) if err != nil { return nil, nhttp.NewError("create compliance report: %w", err) }