diff --git a/platform/address.go b/platform/address.go index a3916392..85a0f685 100644 --- a/platform/address.go +++ b/platform/address.go @@ -1,7 +1,47 @@ package platform import ( + "context" + "fmt" + + "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" + "github.com/Gleipnir-Technology/nidus-sync/db/models" "github.com/Gleipnir-Technology/nidus-sync/platform/types" + "github.com/stephenafamo/scan" ) type Address = types.Address + +func AddressFromComplianceReportRequestID(ctx context.Context, public_id string) (*types.Address, error) { + row, err := bob.One(ctx, db.PGInstance.BobDB, psql.Select( + sm.Columns( + models.Addresses.Columns.Country, + models.Addresses.Columns.Gid, + models.Addresses.Columns.ID, + models.Addresses.Columns.Locality, + models.Addresses.Columns.LocationLatitude.As("location.latitude"), + models.Addresses.Columns.LocationLongitude.As("location.longitude"), + models.Addresses.Columns.Number, + models.Addresses.Columns.PostalCode, + models.Addresses.Columns.Region, + models.Addresses.Columns.Street, + models.Addresses.Columns.Unit, + ), + //sm.From(models.Addresses.NameAs()), + 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.InnerJoin(models.Addresses.NameAs()).On( + models.Sites.Columns.AddressID.EQ(models.Addresses.Columns.ID)), + sm.Where(models.ComplianceReportRequests.Columns.PublicID.EQ(psql.Arg(public_id))), + ), scan.StructMapper[*types.Address]()) + if err != nil { + return nil, fmt.Errorf("query address from compliance report request: %w", err) + } + return row, nil +} diff --git a/resource/publicreport_compliance.go b/resource/publicreport_compliance.go index 3504dd88..52802c18 100644 --- a/resource/publicreport_compliance.go +++ b/resource/publicreport_compliance.go @@ -61,38 +61,14 @@ func (res *complianceR) Create(ctx context.Context, r *http.Request, n publicrep if n.District.IsUnset() && n.MailerID.IsUnset() { return nil, nhttp.NewBadRequest("You must provide a district_id or mailer_id") } - 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) + err := platform.EnsureClient(ctx, n.ClientID, user_agent) if err != nil { return nil, nhttp.NewError("Failed to ensure client: %w", err) } setter_report := models.PublicreportReportSetter{ - //AddressID: omitnull.From(latlng.Cell.String()), - AddressGid: omit.From(""), + //AddressID: omitnull.From(...), + //AddressGid: omit.From(...), AddressRaw: omit.From(""), ClientUUID: omitnull.From(n.ClientID), Created: omit.From(time.Now()), @@ -100,10 +76,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](district_id), - PublicID: omit.From(public_id), + Location: omitnull.FromPtr[string](nil), + MapZoom: omit.From(float32(0.0)), + //OrganizationID: omit.From[int32](), + //PublicID: omit.From(), ReporterEmail: omit.From(""), ReporterName: omit.From(""), ReporterPhone: omit.From(""), @@ -121,7 +97,37 @@ 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, district_id) + var org_id int32 + 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) + } + org_id = int32(*district_id_ptr) + public_id, err := platform.GenerateReportID() + if err != nil { + return nil, nhttp.NewError("generate public ID: %w", err) + } + setter_report.PublicID = omit.From(public_id) + } + if n.MailerID.IsValue() { + public_id := n.MailerID.MustGet() + setter_report.PublicID = omit.From(public_id) + + org_id, err = platform.OrganizationIDForComplianceReportRequest(ctx, public_id) + if err != nil { + return nil, nhttp.NewBadRequest("no such mailer") + } + address, err := platform.AddressFromComplianceReportRequestID(ctx, public_id) + if err != nil { + return nil, nhttp.NewError("get address gid: %w", err) + } + setter_report.AddressID = omitnull.FromPtr(address.ID) + setter_report.AddressGid = omit.From(address.GID) + } + report, err := platform.PublicReportComplianceCreate(ctx, setter_report, setter_compliance, org_id) if err != nil { return nil, nhttp.NewError("create compliance report: %w", err) }