diff --git a/db/dberrors/compliance_report_request_mailer.bob.go b/db/dberrors/compliance_report_request_mailer.bob.go
new file mode 100644
index 00000000..da2d4242
--- /dev/null
+++ b/db/dberrors/compliance_report_request_mailer.bob.go
@@ -0,0 +1,17 @@
+// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
+// This file is meant to be re-generated in place and/or deleted at any time.
+
+package dberrors
+
+var ComplianceReportRequestMailerErrors = &complianceReportRequestMailerErrors{
+ ErrUniqueComplianceReportRequestMaiComplianceReportRequestId_Key: &UniqueConstraintError{
+ schema: "",
+ table: "compliance_report_request_mailer",
+ columns: []string{"compliance_report_request_id", "mailer_id"},
+ s: "compliance_report_request_mai_compliance_report_request_id__key",
+ },
+}
+
+type complianceReportRequestMailerErrors struct {
+ ErrUniqueComplianceReportRequestMaiComplianceReportRequestId_Key *UniqueConstraintError
+}
diff --git a/db/dbinfo/address.bob.go b/db/dbinfo/address.bob.go
index 28c32c5c..5ea9d9c7 100644
--- a/db/dbinfo/address.bob.go
+++ b/db/dbinfo/address.bob.go
@@ -161,6 +161,23 @@ var Addresses = Table[
Where: "",
Include: []string{},
},
+ IdxAddressGeom: index{
+ Type: "gist",
+ Name: "idx_address_geom",
+ Columns: []indexColumn{
+ {
+ Name: "geom",
+ Desc: null.FromCond(false, true),
+ IsExpression: false,
+ },
+ },
+ Unique: false,
+ Comment: "",
+ NullsFirst: []bool{false},
+ NullsDistinct: false,
+ Where: "",
+ Include: []string{},
+ },
},
PrimaryKey: &constraint{
Name: "address_pkey",
@@ -201,11 +218,12 @@ func (c addressColumns) AsSlice() []column {
type addressIndexes struct {
AddressPkey index
AddressCountryLocalityUnitNumberStreetKey index
+ IdxAddressGeom index
}
func (i addressIndexes) AsSlice() []index {
return []index{
- i.AddressPkey, i.AddressCountryLocalityUnitNumberStreetKey,
+ i.AddressPkey, i.AddressCountryLocalityUnitNumberStreetKey, i.IdxAddressGeom,
}
}
diff --git a/db/dbinfo/comms.mailer.bob.go b/db/dbinfo/comms.mailer.bob.go
index a9c6cc56..17a62f27 100644
--- a/db/dbinfo/comms.mailer.bob.go
+++ b/db/dbinfo/comms.mailer.bob.go
@@ -15,6 +15,15 @@ var CommsMailers = Table[
Schema: "comms",
Name: "mailer",
Columns: commsMailerColumns{
+ AddressID: column{
+ Name: "address_id",
+ DBType: "integer",
+ Default: "",
+ Comment: "",
+ Nullable: false,
+ Generated: false,
+ AutoIncr: false,
+ },
Created: column{
Name: "created",
DBType: "timestamp without time zone",
@@ -33,9 +42,18 @@ var CommsMailers = Table[
Generated: false,
AutoIncr: false,
},
- Type: column{
- Name: "type_",
- DBType: "comms.mailertype",
+ Recipient: column{
+ Name: "recipient",
+ DBType: "text",
+ Default: "",
+ Comment: "",
+ Nullable: false,
+ Generated: false,
+ AutoIncr: false,
+ },
+ UUID: column{
+ Name: "uuid",
+ DBType: "uuid",
Default: "",
Comment: "",
Nullable: false,
@@ -67,19 +85,32 @@ var CommsMailers = Table[
Columns: []string{"id"},
Comment: "",
},
+ ForeignKeys: commsMailerForeignKeys{
+ CommsMailerMailerAddressIDFkey: foreignKey{
+ constraint: constraint{
+ Name: "comms.mailer.mailer_address_id_fkey",
+ Columns: []string{"address_id"},
+ Comment: "",
+ },
+ ForeignTable: "address",
+ ForeignColumns: []string{"id"},
+ },
+ },
Comment: "",
}
type commsMailerColumns struct {
- Created column
- ID column
- Type column
+ AddressID column
+ Created column
+ ID column
+ Recipient column
+ UUID column
}
func (c commsMailerColumns) AsSlice() []column {
return []column{
- c.Created, c.ID, c.Type,
+ c.AddressID, c.Created, c.ID, c.Recipient, c.UUID,
}
}
@@ -93,10 +124,14 @@ func (i commsMailerIndexes) AsSlice() []index {
}
}
-type commsMailerForeignKeys struct{}
+type commsMailerForeignKeys struct {
+ CommsMailerMailerAddressIDFkey foreignKey
+}
func (f commsMailerForeignKeys) AsSlice() []foreignKey {
- return []foreignKey{}
+ return []foreignKey{
+ f.CommsMailerMailerAddressIDFkey,
+ }
}
type commsMailerUniques struct{}
diff --git a/db/dbinfo/compliance_report_request_mailer.bob.go b/db/dbinfo/compliance_report_request_mailer.bob.go
new file mode 100644
index 00000000..61147a6b
--- /dev/null
+++ b/db/dbinfo/compliance_report_request_mailer.bob.go
@@ -0,0 +1,139 @@
+// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
+// This file is meant to be re-generated in place and/or deleted at any time.
+
+package dbinfo
+
+import "github.com/aarondl/opt/null"
+
+var ComplianceReportRequestMailers = Table[
+ complianceReportRequestMailerColumns,
+ complianceReportRequestMailerIndexes,
+ complianceReportRequestMailerForeignKeys,
+ complianceReportRequestMailerUniques,
+ complianceReportRequestMailerChecks,
+]{
+ Schema: "",
+ Name: "compliance_report_request_mailer",
+ Columns: complianceReportRequestMailerColumns{
+ ComplianceReportRequestID: column{
+ Name: "compliance_report_request_id",
+ DBType: "integer",
+ Default: "",
+ Comment: "",
+ Nullable: false,
+ Generated: false,
+ AutoIncr: false,
+ },
+ MailerID: column{
+ Name: "mailer_id",
+ DBType: "integer",
+ Default: "",
+ Comment: "",
+ Nullable: false,
+ Generated: false,
+ AutoIncr: false,
+ },
+ },
+ Indexes: complianceReportRequestMailerIndexes{
+ ComplianceReportRequestMaiComplianceReportRequestIDKey: index{
+ Type: "btree",
+ Name: "compliance_report_request_mai_compliance_report_request_id__key",
+ Columns: []indexColumn{
+ {
+ Name: "compliance_report_request_id",
+ Desc: null.FromCond(false, true),
+ IsExpression: false,
+ },
+ {
+ Name: "mailer_id",
+ Desc: null.FromCond(false, true),
+ IsExpression: false,
+ },
+ },
+ Unique: true,
+ Comment: "",
+ NullsFirst: []bool{false, false},
+ NullsDistinct: false,
+ Where: "",
+ Include: []string{},
+ },
+ },
+
+ ForeignKeys: complianceReportRequestMailerForeignKeys{
+ ComplianceReportRequestMailerComplianceReportRequestMaiComplianceReportRequestIDFkey: foreignKey{
+ constraint: constraint{
+ Name: "compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkey",
+ Columns: []string{"compliance_report_request_id"},
+ Comment: "",
+ },
+ ForeignTable: "compliance_report_request",
+ ForeignColumns: []string{"id"},
+ },
+ ComplianceReportRequestMailerComplianceReportRequestMailerMailerIDFkey: foreignKey{
+ constraint: constraint{
+ Name: "compliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey",
+ Columns: []string{"mailer_id"},
+ Comment: "",
+ },
+ ForeignTable: "comms.mailer",
+ ForeignColumns: []string{"id"},
+ },
+ },
+ Uniques: complianceReportRequestMailerUniques{
+ ComplianceReportRequestMaiComplianceReportRequestIDKey: constraint{
+ Name: "compliance_report_request_mai_compliance_report_request_id__key",
+ Columns: []string{"compliance_report_request_id", "mailer_id"},
+ Comment: "",
+ },
+ },
+
+ Comment: "",
+}
+
+type complianceReportRequestMailerColumns struct {
+ ComplianceReportRequestID column
+ MailerID column
+}
+
+func (c complianceReportRequestMailerColumns) AsSlice() []column {
+ return []column{
+ c.ComplianceReportRequestID, c.MailerID,
+ }
+}
+
+type complianceReportRequestMailerIndexes struct {
+ ComplianceReportRequestMaiComplianceReportRequestIDKey index
+}
+
+func (i complianceReportRequestMailerIndexes) AsSlice() []index {
+ return []index{
+ i.ComplianceReportRequestMaiComplianceReportRequestIDKey,
+ }
+}
+
+type complianceReportRequestMailerForeignKeys struct {
+ ComplianceReportRequestMailerComplianceReportRequestMaiComplianceReportRequestIDFkey foreignKey
+ ComplianceReportRequestMailerComplianceReportRequestMailerMailerIDFkey foreignKey
+}
+
+func (f complianceReportRequestMailerForeignKeys) AsSlice() []foreignKey {
+ return []foreignKey{
+ f.ComplianceReportRequestMailerComplianceReportRequestMaiComplianceReportRequestIDFkey, f.ComplianceReportRequestMailerComplianceReportRequestMailerMailerIDFkey,
+ }
+}
+
+type complianceReportRequestMailerUniques struct {
+ ComplianceReportRequestMaiComplianceReportRequestIDKey constraint
+}
+
+func (u complianceReportRequestMailerUniques) AsSlice() []constraint {
+ return []constraint{
+ u.ComplianceReportRequestMaiComplianceReportRequestIDKey,
+ }
+}
+
+type complianceReportRequestMailerChecks struct{}
+
+func (c complianceReportRequestMailerChecks) AsSlice() []check {
+ return []check{}
+}
diff --git a/db/dbinfo/parcel.bob.go b/db/dbinfo/parcel.bob.go
index 865941f9..c366f112 100644
--- a/db/dbinfo/parcel.bob.go
+++ b/db/dbinfo/parcel.bob.go
@@ -70,6 +70,23 @@ var Parcels = Table[
Where: "",
Include: []string{},
},
+ IdxParcelGeometry: index{
+ Type: "gist",
+ Name: "idx_parcel_geometry",
+ Columns: []indexColumn{
+ {
+ Name: "geometry",
+ Desc: null.FromCond(false, true),
+ IsExpression: false,
+ },
+ },
+ Unique: false,
+ Comment: "",
+ NullsFirst: []bool{false},
+ NullsDistinct: false,
+ Where: "",
+ Include: []string{},
+ },
},
PrimaryKey: &constraint{
Name: "parcel_pkey",
@@ -94,12 +111,13 @@ func (c parcelColumns) AsSlice() []column {
}
type parcelIndexes struct {
- ParcelPkey index
+ ParcelPkey index
+ IdxParcelGeometry index
}
func (i parcelIndexes) AsSlice() []index {
return []index{
- i.ParcelPkey,
+ i.ParcelPkey, i.IdxParcelGeometry,
}
}
diff --git a/db/enums/enums.bob.go b/db/enums/enums.bob.go
index ed4419f7..5598ff8e 100644
--- a/db/enums/enums.bob.go
+++ b/db/enums/enums.bob.go
@@ -457,76 +457,6 @@ func (e *Audiodatatype) Scan(value any) error {
return nil
}
-// Enum values for CommsMailertype
-const (
- CommsMailertypeGreenPool CommsMailertype = "green-pool"
-)
-
-func AllCommsMailertype() []CommsMailertype {
- return []CommsMailertype{
- CommsMailertypeGreenPool,
- }
-}
-
-type CommsMailertype string
-
-func (e CommsMailertype) String() string {
- return string(e)
-}
-
-func (e CommsMailertype) Valid() bool {
- switch e {
- case CommsMailertypeGreenPool:
- return true
- default:
- return false
- }
-}
-
-// useful when testing in other packages
-func (e CommsMailertype) All() []CommsMailertype {
- return AllCommsMailertype()
-}
-
-func (e CommsMailertype) MarshalText() ([]byte, error) {
- return []byte(e), nil
-}
-
-func (e *CommsMailertype) UnmarshalText(text []byte) error {
- return e.Scan(text)
-}
-
-func (e CommsMailertype) MarshalBinary() ([]byte, error) {
- return []byte(e), nil
-}
-
-func (e *CommsMailertype) UnmarshalBinary(data []byte) error {
- return e.Scan(data)
-}
-
-func (e CommsMailertype) Value() (driver.Value, error) {
- return string(e), nil
-}
-
-func (e *CommsMailertype) Scan(value any) error {
- switch x := value.(type) {
- case string:
- *e = CommsMailertype(x)
- case []byte:
- *e = CommsMailertype(x)
- case nil:
- return fmt.Errorf("cannot nil into CommsMailertype")
- default:
- return fmt.Errorf("cannot scan type %T: %v", value, value)
- }
-
- if !e.Valid() {
- return fmt.Errorf("invalid CommsMailertype value: %s", *e)
- }
-
- return nil
-}
-
// Enum values for CommsMessagetypeemail
const (
CommsMessagetypeemailInitialContact CommsMessagetypeemail = "initial-contact"
diff --git a/db/factory/address.bob.go b/db/factory/address.bob.go
index 893379b1..31ecef5f 100644
--- a/db/factory/address.bob.go
+++ b/db/factory/address.bob.go
@@ -54,10 +54,15 @@ type AddressTemplate struct {
}
type addressR struct {
+ Mailers []*addressRMailersR
Residents []*addressRResidentsR
Site *addressRSiteR
}
+type addressRMailersR struct {
+ number int
+ o *CommsMailerTemplate
+}
type addressRResidentsR struct {
number int
o *ResidentTemplate
@@ -76,6 +81,19 @@ func (o *AddressTemplate) Apply(ctx context.Context, mods ...AddressMod) {
// setModelRels creates and sets the relationships on *models.Address
// according to the relationships in the template. Nothing is inserted into the db
func (t AddressTemplate) setModelRels(o *models.Address) {
+ if t.r.Mailers != nil {
+ rel := models.CommsMailerSlice{}
+ for _, r := range t.r.Mailers {
+ related := r.o.BuildMany(r.number)
+ for _, rel := range related {
+ rel.AddressID = o.ID // h2
+ rel.R.Address = o
+ }
+ rel = append(rel, related...)
+ }
+ o.R.Mailers = rel
+ }
+
if t.r.Residents != nil {
rel := models.ResidentSlice{}
for _, r := range t.r.Residents {
@@ -258,6 +276,26 @@ func ensureCreatableAddress(m *models.AddressSetter) {
func (o *AddressTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.Address) error {
var err error
+ isMailersDone, _ := addressRelMailersCtx.Value(ctx)
+ if !isMailersDone && o.r.Mailers != nil {
+ ctx = addressRelMailersCtx.WithValue(ctx, true)
+ for _, r := range o.r.Mailers {
+ if r.o.alreadyPersisted {
+ m.R.Mailers = append(m.R.Mailers, r.o.Build())
+ } else {
+ rel0, err := r.o.CreateMany(ctx, exec, r.number)
+ if err != nil {
+ return err
+ }
+
+ err = m.AttachMailers(ctx, exec, rel0...)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ }
+
isResidentsDone, _ := addressRelResidentsCtx.Value(ctx)
if !isResidentsDone && o.r.Residents != nil {
ctx = addressRelResidentsCtx.WithValue(ctx, true)
@@ -265,12 +303,12 @@ func (o *AddressTemplate) insertOptRels(ctx context.Context, exec bob.Executor,
if r.o.alreadyPersisted {
m.R.Residents = append(m.R.Residents, r.o.Build())
} else {
- rel0, err := r.o.CreateMany(ctx, exec, r.number)
+ rel1, err := r.o.CreateMany(ctx, exec, r.number)
if err != nil {
return err
}
- err = m.AttachResidents(ctx, exec, rel0...)
+ err = m.AttachResidents(ctx, exec, rel1...)
if err != nil {
return err
}
@@ -284,12 +322,12 @@ func (o *AddressTemplate) insertOptRels(ctx context.Context, exec bob.Executor,
if o.r.Site.o.alreadyPersisted {
m.R.Site = o.r.Site.o.Build()
} else {
- var rel1 *models.Site
- rel1, err = o.r.Site.o.Create(ctx, exec)
+ var rel2 *models.Site
+ rel2, err = o.r.Site.o.Create(ctx, exec)
if err != nil {
return err
}
- err = m.AttachSite(ctx, exec, rel1)
+ err = m.AttachSite(ctx, exec, rel2)
if err != nil {
return err
}
@@ -756,6 +794,54 @@ func (m addressMods) WithoutSite() AddressMod {
})
}
+func (m addressMods) WithMailers(number int, related *CommsMailerTemplate) AddressMod {
+ return AddressModFunc(func(ctx context.Context, o *AddressTemplate) {
+ o.r.Mailers = []*addressRMailersR{{
+ number: number,
+ o: related,
+ }}
+ })
+}
+
+func (m addressMods) WithNewMailers(number int, mods ...CommsMailerMod) AddressMod {
+ return AddressModFunc(func(ctx context.Context, o *AddressTemplate) {
+ related := o.f.NewCommsMailerWithContext(ctx, mods...)
+ m.WithMailers(number, related).Apply(ctx, o)
+ })
+}
+
+func (m addressMods) AddMailers(number int, related *CommsMailerTemplate) AddressMod {
+ return AddressModFunc(func(ctx context.Context, o *AddressTemplate) {
+ o.r.Mailers = append(o.r.Mailers, &addressRMailersR{
+ number: number,
+ o: related,
+ })
+ })
+}
+
+func (m addressMods) AddNewMailers(number int, mods ...CommsMailerMod) AddressMod {
+ return AddressModFunc(func(ctx context.Context, o *AddressTemplate) {
+ related := o.f.NewCommsMailerWithContext(ctx, mods...)
+ m.AddMailers(number, related).Apply(ctx, o)
+ })
+}
+
+func (m addressMods) AddExistingMailers(existingModels ...*models.CommsMailer) AddressMod {
+ return AddressModFunc(func(ctx context.Context, o *AddressTemplate) {
+ for _, em := range existingModels {
+ o.r.Mailers = append(o.r.Mailers, &addressRMailersR{
+ o: o.f.FromExistingCommsMailer(em),
+ })
+ }
+ })
+}
+
+func (m addressMods) WithoutMailers() AddressMod {
+ return AddressModFunc(func(ctx context.Context, o *AddressTemplate) {
+ o.r.Mailers = nil
+ })
+}
+
func (m addressMods) WithResidents(number int, related *ResidentTemplate) AddressMod {
return AddressModFunc(func(ctx context.Context, o *AddressTemplate) {
o.r.Residents = []*addressRResidentsR{{
diff --git a/db/factory/bobfactory_context.bob.go b/db/factory/bobfactory_context.bob.go
index 8e600281..669eb20c 100644
--- a/db/factory/bobfactory_context.bob.go
+++ b/db/factory/bobfactory_context.bob.go
@@ -10,6 +10,7 @@ type contextKey string
var (
// Relationship Contexts for address
addressWithParentsCascadingCtx = newContextual[bool]("addressWithParentsCascading")
+ addressRelMailersCtx = newContextual[bool]("address.comms.mailer.comms.mailer.mailer_address_id_fkey")
addressRelResidentsCtx = newContextual[bool]("address.resident.resident.resident_address_id_fkey")
addressRelSiteCtx = newContextual[bool]("address.site.site.site_address_id_fkey")
@@ -84,7 +85,9 @@ var (
commsEmailTemplateRelTemplateEmailLogsCtx = newContextual[bool]("comms.email_log.comms.email_template.comms.email_log.email_log_template_id_fkey")
// Relationship Contexts for comms.mailer
- commsMailerWithParentsCascadingCtx = newContextual[bool]("commsMailerWithParentsCascading")
+ commsMailerWithParentsCascadingCtx = newContextual[bool]("commsMailerWithParentsCascading")
+ commsMailerRelAddressCtx = newContextual[bool]("address.comms.mailer.comms.mailer.mailer_address_id_fkey")
+ commsMailerRelComplianceReportRequestsCtx = newContextual[bool]("comms.mailer.compliance_report_request.compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey")
// Relationship Contexts for comms.phone
commsPhoneWithParentsCascadingCtx = newContextual[bool]("commsPhoneWithParentsCascading")
@@ -112,6 +115,12 @@ var (
complianceReportRequestWithParentsCascadingCtx = newContextual[bool]("complianceReportRequestWithParentsCascading")
complianceReportRequestRelCreatorUserCtx = newContextual[bool]("compliance_report_request.user_.compliance_report_request.compliance_report_request_creator_fkey")
complianceReportRequestRelSiteCtx = newContextual[bool]("compliance_report_request.site.compliance_report_request.compliance_report_request_site_id_site_version_fkey")
+ complianceReportRequestRelMailersCtx = newContextual[bool]("comms.mailer.compliance_report_request.compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey")
+
+ // Relationship Contexts for compliance_report_request_mailer
+ complianceReportRequestMailerWithParentsCascadingCtx = newContextual[bool]("complianceReportRequestMailerWithParentsCascading")
+ complianceReportRequestMailerRelComplianceReportRequestCtx = newContextual[bool]("compliance_report_request.compliance_report_request_mailer.compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkey")
+ complianceReportRequestMailerRelMailerCtx = newContextual[bool]("comms.mailer.compliance_report_request_mailer.compliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey")
// Relationship Contexts for district_subscription_email
districtSubscriptionEmailWithParentsCascadingCtx = newContextual[bool]("districtSubscriptionEmailWithParentsCascading")
diff --git a/db/factory/bobfactory_main.bob.go b/db/factory/bobfactory_main.bob.go
index 52145647..6ce1bb0c 100644
--- a/db/factory/bobfactory_main.bob.go
+++ b/db/factory/bobfactory_main.bob.go
@@ -38,6 +38,7 @@ type Factory struct {
baseCommsTextJobMods CommsTextJobModSlice
baseCommsTextLogMods CommsTextLogModSlice
baseComplianceReportRequestMods ComplianceReportRequestModSlice
+ baseComplianceReportRequestMailerMods ComplianceReportRequestMailerModSlice
baseDistrictSubscriptionEmailMods DistrictSubscriptionEmailModSlice
baseDistrictSubscriptionPhoneMods DistrictSubscriptionPhoneModSlice
baseFieldseekerContainerrelateMods FieldseekerContainerrelateModSlice
@@ -147,6 +148,9 @@ func (f *Factory) FromExistingAddress(m *models.Address) *AddressTemplate {
o.Unit = func() string { return m.Unit }
ctx := context.Background()
+ if len(m.R.Mailers) > 0 {
+ AddressMods.AddExistingMailers(m.R.Mailers...).Apply(ctx, o)
+ }
if len(m.R.Residents) > 0 {
AddressMods.AddExistingResidents(m.R.Residents...).Apply(ctx, o)
}
@@ -680,9 +684,19 @@ func (f *Factory) NewCommsMailerWithContext(ctx context.Context, mods ...CommsMa
func (f *Factory) FromExistingCommsMailer(m *models.CommsMailer) *CommsMailerTemplate {
o := &CommsMailerTemplate{f: f, alreadyPersisted: true}
+ o.AddressID = func() int32 { return m.AddressID }
o.Created = func() time.Time { return m.Created }
o.ID = func() int32 { return m.ID }
- o.Type = func() enums.CommsMailertype { return m.Type }
+ o.Recipient = func() string { return m.Recipient }
+ o.UUID = func() uuid.UUID { return m.UUID }
+
+ ctx := context.Background()
+ if m.R.Address != nil {
+ CommsMailerMods.WithExistingAddress(m.R.Address).Apply(ctx, o)
+ }
+ if len(m.R.ComplianceReportRequests) > 0 {
+ CommsMailerMods.AddExistingComplianceReportRequests(m.R.ComplianceReportRequests...).Apply(ctx, o)
+ }
return o
}
@@ -854,6 +868,42 @@ func (f *Factory) FromExistingComplianceReportRequest(m *models.ComplianceReport
if m.R.Site != nil {
ComplianceReportRequestMods.WithExistingSite(m.R.Site).Apply(ctx, o)
}
+ if len(m.R.Mailers) > 0 {
+ ComplianceReportRequestMods.AddExistingMailers(m.R.Mailers...).Apply(ctx, o)
+ }
+
+ return o
+}
+
+func (f *Factory) NewComplianceReportRequestMailer(mods ...ComplianceReportRequestMailerMod) *ComplianceReportRequestMailerTemplate {
+ return f.NewComplianceReportRequestMailerWithContext(context.Background(), mods...)
+}
+
+func (f *Factory) NewComplianceReportRequestMailerWithContext(ctx context.Context, mods ...ComplianceReportRequestMailerMod) *ComplianceReportRequestMailerTemplate {
+ o := &ComplianceReportRequestMailerTemplate{f: f}
+
+ if f != nil {
+ f.baseComplianceReportRequestMailerMods.Apply(ctx, o)
+ }
+
+ ComplianceReportRequestMailerModSlice(mods).Apply(ctx, o)
+
+ return o
+}
+
+func (f *Factory) FromExistingComplianceReportRequestMailer(m *models.ComplianceReportRequestMailer) *ComplianceReportRequestMailerTemplate {
+ o := &ComplianceReportRequestMailerTemplate{f: f, alreadyPersisted: true}
+
+ o.ComplianceReportRequestID = func() int32 { return m.ComplianceReportRequestID }
+ o.MailerID = func() int32 { return m.MailerID }
+
+ ctx := context.Background()
+ if m.R.ComplianceReportRequest != nil {
+ ComplianceReportRequestMailerMods.WithExistingComplianceReportRequest(m.R.ComplianceReportRequest).Apply(ctx, o)
+ }
+ if m.R.Mailer != nil {
+ ComplianceReportRequestMailerMods.WithExistingMailer(m.R.Mailer).Apply(ctx, o)
+ }
return o
}
@@ -4644,6 +4694,14 @@ func (f *Factory) AddBaseComplianceReportRequestMod(mods ...ComplianceReportRequ
f.baseComplianceReportRequestMods = append(f.baseComplianceReportRequestMods, mods...)
}
+func (f *Factory) ClearBaseComplianceReportRequestMailerMods() {
+ f.baseComplianceReportRequestMailerMods = nil
+}
+
+func (f *Factory) AddBaseComplianceReportRequestMailerMod(mods ...ComplianceReportRequestMailerMod) {
+ f.baseComplianceReportRequestMailerMods = append(f.baseComplianceReportRequestMailerMods, mods...)
+}
+
func (f *Factory) ClearBaseDistrictSubscriptionEmailMods() {
f.baseDistrictSubscriptionEmailMods = nil
}
diff --git a/db/factory/bobfactory_random.bob.go b/db/factory/bobfactory_random.bob.go
index 2f6f2bdb..427dbbe6 100644
--- a/db/factory/bobfactory_random.bob.go
+++ b/db/factory/bobfactory_random.bob.go
@@ -121,16 +121,6 @@ func random_enums_Audiodatatype(f *faker.Faker, limits ...string) enums.Audiodat
return all[f.IntBetween(0, len(all)-1)]
}
-func random_enums_CommsMailertype(f *faker.Faker, limits ...string) enums.CommsMailertype {
- if f == nil {
- f = &defaultFaker
- }
-
- var e enums.CommsMailertype
- all := e.All()
- return all[f.IntBetween(0, len(all)-1)]
-}
-
func random_enums_CommsMessagetypeemail(f *faker.Faker, limits ...string) enums.CommsMessagetypeemail {
if f == nil {
f = &defaultFaker
diff --git a/db/factory/comms.mailer.bob.go b/db/factory/comms.mailer.bob.go
index f5edc457..af79060f 100644
--- a/db/factory/comms.mailer.bob.go
+++ b/db/factory/comms.mailer.bob.go
@@ -9,9 +9,9 @@ import (
"time"
"github.com/Gleipnir-Technology/bob"
- enums "github.com/Gleipnir-Technology/nidus-sync/db/enums"
models "github.com/Gleipnir-Technology/nidus-sync/db/models"
"github.com/aarondl/opt/omit"
+ "github.com/google/uuid"
"github.com/jaswdr/faker/v2"
)
@@ -36,15 +36,31 @@ func (mods CommsMailerModSlice) Apply(ctx context.Context, n *CommsMailerTemplat
// CommsMailerTemplate is an object representing the database table.
// all columns are optional and should be set by mods
type CommsMailerTemplate struct {
- Created func() time.Time
- ID func() int32
- Type func() enums.CommsMailertype
+ AddressID func() int32
+ Created func() time.Time
+ ID func() int32
+ Recipient func() string
+ UUID func() uuid.UUID
+ r commsMailerR
f *Factory
alreadyPersisted bool
}
+type commsMailerR struct {
+ Address *commsMailerRAddressR
+ ComplianceReportRequests []*commsMailerRComplianceReportRequestsR
+}
+
+type commsMailerRAddressR struct {
+ o *AddressTemplate
+}
+type commsMailerRComplianceReportRequestsR struct {
+ number int
+ o *ComplianceReportRequestTemplate
+}
+
// Apply mods to the CommsMailerTemplate
func (o *CommsMailerTemplate) Apply(ctx context.Context, mods ...CommsMailerMod) {
for _, mod := range mods {
@@ -54,13 +70,36 @@ func (o *CommsMailerTemplate) Apply(ctx context.Context, mods ...CommsMailerMod)
// setModelRels creates and sets the relationships on *models.CommsMailer
// according to the relationships in the template. Nothing is inserted into the db
-func (t CommsMailerTemplate) setModelRels(o *models.CommsMailer) {}
+func (t CommsMailerTemplate) setModelRels(o *models.CommsMailer) {
+ if t.r.Address != nil {
+ rel := t.r.Address.o.Build()
+ rel.R.Mailers = append(rel.R.Mailers, o)
+ o.AddressID = rel.ID // h2
+ o.R.Address = rel
+ }
+
+ if t.r.ComplianceReportRequests != nil {
+ rel := models.ComplianceReportRequestSlice{}
+ for _, r := range t.r.ComplianceReportRequests {
+ related := r.o.BuildMany(r.number)
+ for _, rel := range related {
+ rel.R.Mailers = append(rel.R.Mailers, o)
+ }
+ rel = append(rel, related...)
+ }
+ o.R.ComplianceReportRequests = rel
+ }
+}
// BuildSetter returns an *models.CommsMailerSetter
// this does nothing with the relationship templates
func (o CommsMailerTemplate) BuildSetter() *models.CommsMailerSetter {
m := &models.CommsMailerSetter{}
+ if o.AddressID != nil {
+ val := o.AddressID()
+ m.AddressID = omit.From(val)
+ }
if o.Created != nil {
val := o.Created()
m.Created = omit.From(val)
@@ -69,9 +108,13 @@ func (o CommsMailerTemplate) BuildSetter() *models.CommsMailerSetter {
val := o.ID()
m.ID = omit.From(val)
}
- if o.Type != nil {
- val := o.Type()
- m.Type = omit.From(val)
+ if o.Recipient != nil {
+ val := o.Recipient()
+ m.Recipient = omit.From(val)
+ }
+ if o.UUID != nil {
+ val := o.UUID()
+ m.UUID = omit.From(val)
}
return m
@@ -95,14 +138,20 @@ func (o CommsMailerTemplate) BuildManySetter(number int) []*models.CommsMailerSe
func (o CommsMailerTemplate) Build() *models.CommsMailer {
m := &models.CommsMailer{}
+ if o.AddressID != nil {
+ m.AddressID = o.AddressID()
+ }
if o.Created != nil {
m.Created = o.Created()
}
if o.ID != nil {
m.ID = o.ID()
}
- if o.Type != nil {
- m.Type = o.Type()
+ if o.Recipient != nil {
+ m.Recipient = o.Recipient()
+ }
+ if o.UUID != nil {
+ m.UUID = o.UUID()
}
o.setModelRels(m)
@@ -124,13 +173,21 @@ func (o CommsMailerTemplate) BuildMany(number int) models.CommsMailerSlice {
}
func ensureCreatableCommsMailer(m *models.CommsMailerSetter) {
+ if !(m.AddressID.IsValue()) {
+ val := random_int32(nil)
+ m.AddressID = omit.From(val)
+ }
if !(m.Created.IsValue()) {
val := random_time_Time(nil)
m.Created = omit.From(val)
}
- if !(m.Type.IsValue()) {
- val := random_enums_CommsMailertype(nil)
- m.Type = omit.From(val)
+ if !(m.Recipient.IsValue()) {
+ val := random_string(nil)
+ m.Recipient = omit.From(val)
+ }
+ if !(m.UUID.IsValue()) {
+ val := random_uuid_UUID(nil)
+ m.UUID = omit.From(val)
}
}
@@ -150,11 +207,30 @@ func (o *CommsMailerTemplate) Create(ctx context.Context, exec bob.Executor) (*m
opt := o.BuildSetter()
ensureCreatableCommsMailer(opt)
+ if o.r.Address == nil {
+ CommsMailerMods.WithNewAddress().Apply(ctx, o)
+ }
+
+ var rel0 *models.Address
+
+ if o.r.Address.o.alreadyPersisted {
+ rel0 = o.r.Address.o.Build()
+ } else {
+ rel0, err = o.r.Address.o.Create(ctx, exec)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ opt.AddressID = omit.From(rel0.ID)
+
m, err := models.CommsMailers.Insert(opt).One(ctx, exec)
if err != nil {
return nil, err
}
+ m.R.Address = rel0
+
if err := o.insertOptRels(ctx, exec, m); err != nil {
return nil, err
}
@@ -232,12 +308,45 @@ type commsMailerMods struct{}
func (m commsMailerMods) RandomizeAllColumns(f *faker.Faker) CommsMailerMod {
return CommsMailerModSlice{
+ CommsMailerMods.RandomAddressID(f),
CommsMailerMods.RandomCreated(f),
CommsMailerMods.RandomID(f),
- CommsMailerMods.RandomType(f),
+ CommsMailerMods.RandomRecipient(f),
+ CommsMailerMods.RandomUUID(f),
}
}
+// Set the model columns to this value
+func (m commsMailerMods) AddressID(val int32) CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.AddressID = func() int32 { return val }
+ })
+}
+
+// Set the Column from the function
+func (m commsMailerMods) AddressIDFunc(f func() int32) CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.AddressID = f
+ })
+}
+
+// Clear any values for the column
+func (m commsMailerMods) UnsetAddressID() CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.AddressID = nil
+ })
+}
+
+// Generates a random value for the column using the given faker
+// if faker is nil, a default faker is used
+func (m commsMailerMods) RandomAddressID(f *faker.Faker) CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.AddressID = func() int32 {
+ return random_int32(f)
+ }
+ })
+}
+
// Set the model columns to this value
func (m commsMailerMods) Created(val time.Time) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
@@ -301,32 +410,63 @@ func (m commsMailerMods) RandomID(f *faker.Faker) CommsMailerMod {
}
// Set the model columns to this value
-func (m commsMailerMods) Type(val enums.CommsMailertype) CommsMailerMod {
+func (m commsMailerMods) Recipient(val string) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
- o.Type = func() enums.CommsMailertype { return val }
+ o.Recipient = func() string { return val }
})
}
// Set the Column from the function
-func (m commsMailerMods) TypeFunc(f func() enums.CommsMailertype) CommsMailerMod {
+func (m commsMailerMods) RecipientFunc(f func() string) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
- o.Type = f
+ o.Recipient = f
})
}
// Clear any values for the column
-func (m commsMailerMods) UnsetType() CommsMailerMod {
+func (m commsMailerMods) UnsetRecipient() CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
- o.Type = nil
+ o.Recipient = nil
})
}
// Generates a random value for the column using the given faker
// if faker is nil, a default faker is used
-func (m commsMailerMods) RandomType(f *faker.Faker) CommsMailerMod {
+func (m commsMailerMods) RandomRecipient(f *faker.Faker) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
- o.Type = func() enums.CommsMailertype {
- return random_enums_CommsMailertype(f)
+ o.Recipient = func() string {
+ return random_string(f)
+ }
+ })
+}
+
+// Set the model columns to this value
+func (m commsMailerMods) UUID(val uuid.UUID) CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.UUID = func() uuid.UUID { return val }
+ })
+}
+
+// Set the Column from the function
+func (m commsMailerMods) UUIDFunc(f func() uuid.UUID) CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.UUID = f
+ })
+}
+
+// Clear any values for the column
+func (m commsMailerMods) UnsetUUID() CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.UUID = nil
+ })
+}
+
+// Generates a random value for the column using the given faker
+// if faker is nil, a default faker is used
+func (m commsMailerMods) RandomUUID(f *faker.Faker) CommsMailerMod {
+ return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
+ o.UUID = func() uuid.UUID {
+ return random_uuid_UUID(f)
}
})
}
@@ -337,5 +477,88 @@ func (m commsMailerMods) WithParentsCascading() CommsMailerMod {
return
}
ctx = commsMailerWithParentsCascadingCtx.WithValue(ctx, true)
+ {
+
+ related := o.f.NewAddressWithContext(ctx, AddressMods.WithParentsCascading())
+ m.WithAddress(related).Apply(ctx, o)
+ }
+ })
+}
+
+func (m commsMailerMods) WithAddress(rel *AddressTemplate) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ o.r.Address = &commsMailerRAddressR{
+ o: rel,
+ }
+ })
+}
+
+func (m commsMailerMods) WithNewAddress(mods ...AddressMod) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ related := o.f.NewAddressWithContext(ctx, mods...)
+
+ m.WithAddress(related).Apply(ctx, o)
+ })
+}
+
+func (m commsMailerMods) WithExistingAddress(em *models.Address) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ o.r.Address = &commsMailerRAddressR{
+ o: o.f.FromExistingAddress(em),
+ }
+ })
+}
+
+func (m commsMailerMods) WithoutAddress() CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ o.r.Address = nil
+ })
+}
+
+func (m commsMailerMods) WithComplianceReportRequests(number int, related *ComplianceReportRequestTemplate) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ o.r.ComplianceReportRequests = []*commsMailerRComplianceReportRequestsR{{
+ number: number,
+ o: related,
+ }}
+ })
+}
+
+func (m commsMailerMods) WithNewComplianceReportRequests(number int, mods ...ComplianceReportRequestMod) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ related := o.f.NewComplianceReportRequestWithContext(ctx, mods...)
+ m.WithComplianceReportRequests(number, related).Apply(ctx, o)
+ })
+}
+
+func (m commsMailerMods) AddComplianceReportRequests(number int, related *ComplianceReportRequestTemplate) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ o.r.ComplianceReportRequests = append(o.r.ComplianceReportRequests, &commsMailerRComplianceReportRequestsR{
+ number: number,
+ o: related,
+ })
+ })
+}
+
+func (m commsMailerMods) AddNewComplianceReportRequests(number int, mods ...ComplianceReportRequestMod) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ related := o.f.NewComplianceReportRequestWithContext(ctx, mods...)
+ m.AddComplianceReportRequests(number, related).Apply(ctx, o)
+ })
+}
+
+func (m commsMailerMods) AddExistingComplianceReportRequests(existingModels ...*models.ComplianceReportRequest) CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ for _, em := range existingModels {
+ o.r.ComplianceReportRequests = append(o.r.ComplianceReportRequests, &commsMailerRComplianceReportRequestsR{
+ o: o.f.FromExistingComplianceReportRequest(em),
+ })
+ }
+ })
+}
+
+func (m commsMailerMods) WithoutComplianceReportRequests() CommsMailerMod {
+ return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
+ o.r.ComplianceReportRequests = nil
})
}
diff --git a/db/factory/compliance_report_request.bob.go b/db/factory/compliance_report_request.bob.go
index a5ff35e6..9d62156b 100644
--- a/db/factory/compliance_report_request.bob.go
+++ b/db/factory/compliance_report_request.bob.go
@@ -51,6 +51,7 @@ type ComplianceReportRequestTemplate struct {
type complianceReportRequestR struct {
CreatorUser *complianceReportRequestRCreatorUserR
Site *complianceReportRequestRSiteR
+ Mailers []*complianceReportRequestRMailersR
}
type complianceReportRequestRCreatorUserR struct {
@@ -59,6 +60,10 @@ type complianceReportRequestRCreatorUserR struct {
type complianceReportRequestRSiteR struct {
o *SiteTemplate
}
+type complianceReportRequestRMailersR struct {
+ number int
+ o *CommsMailerTemplate
+}
// Apply mods to the ComplianceReportRequestTemplate
func (o *ComplianceReportRequestTemplate) Apply(ctx context.Context, mods ...ComplianceReportRequestMod) {
@@ -84,6 +89,18 @@ func (t ComplianceReportRequestTemplate) setModelRels(o *models.ComplianceReport
o.SiteVersion = rel.Version // h2
o.R.Site = rel
}
+
+ if t.r.Mailers != nil {
+ rel := models.CommsMailerSlice{}
+ for _, r := range t.r.Mailers {
+ related := r.o.BuildMany(r.number)
+ for _, rel := range related {
+ rel.R.ComplianceReportRequests = append(rel.R.ComplianceReportRequests, o)
+ }
+ rel = append(rel, related...)
+ }
+ o.R.Mailers = rel
+ }
}
// BuildSetter returns an *models.ComplianceReportRequestSetter
@@ -606,3 +623,51 @@ func (m complianceReportRequestMods) WithoutSite() ComplianceReportRequestMod {
o.r.Site = nil
})
}
+
+func (m complianceReportRequestMods) WithMailers(number int, related *CommsMailerTemplate) ComplianceReportRequestMod {
+ return ComplianceReportRequestModFunc(func(ctx context.Context, o *ComplianceReportRequestTemplate) {
+ o.r.Mailers = []*complianceReportRequestRMailersR{{
+ number: number,
+ o: related,
+ }}
+ })
+}
+
+func (m complianceReportRequestMods) WithNewMailers(number int, mods ...CommsMailerMod) ComplianceReportRequestMod {
+ return ComplianceReportRequestModFunc(func(ctx context.Context, o *ComplianceReportRequestTemplate) {
+ related := o.f.NewCommsMailerWithContext(ctx, mods...)
+ m.WithMailers(number, related).Apply(ctx, o)
+ })
+}
+
+func (m complianceReportRequestMods) AddMailers(number int, related *CommsMailerTemplate) ComplianceReportRequestMod {
+ return ComplianceReportRequestModFunc(func(ctx context.Context, o *ComplianceReportRequestTemplate) {
+ o.r.Mailers = append(o.r.Mailers, &complianceReportRequestRMailersR{
+ number: number,
+ o: related,
+ })
+ })
+}
+
+func (m complianceReportRequestMods) AddNewMailers(number int, mods ...CommsMailerMod) ComplianceReportRequestMod {
+ return ComplianceReportRequestModFunc(func(ctx context.Context, o *ComplianceReportRequestTemplate) {
+ related := o.f.NewCommsMailerWithContext(ctx, mods...)
+ m.AddMailers(number, related).Apply(ctx, o)
+ })
+}
+
+func (m complianceReportRequestMods) AddExistingMailers(existingModels ...*models.CommsMailer) ComplianceReportRequestMod {
+ return ComplianceReportRequestModFunc(func(ctx context.Context, o *ComplianceReportRequestTemplate) {
+ for _, em := range existingModels {
+ o.r.Mailers = append(o.r.Mailers, &complianceReportRequestRMailersR{
+ o: o.f.FromExistingCommsMailer(em),
+ })
+ }
+ })
+}
+
+func (m complianceReportRequestMods) WithoutMailers() ComplianceReportRequestMod {
+ return ComplianceReportRequestModFunc(func(ctx context.Context, o *ComplianceReportRequestTemplate) {
+ o.r.Mailers = nil
+ })
+}
diff --git a/db/factory/compliance_report_request_mailer.bob.go b/db/factory/compliance_report_request_mailer.bob.go
new file mode 100644
index 00000000..e40a5245
--- /dev/null
+++ b/db/factory/compliance_report_request_mailer.bob.go
@@ -0,0 +1,260 @@
+// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
+// This file is meant to be re-generated in place and/or deleted at any time.
+
+package factory
+
+import (
+ "context"
+
+ models "github.com/Gleipnir-Technology/nidus-sync/db/models"
+ "github.com/jaswdr/faker/v2"
+)
+
+type ComplianceReportRequestMailerMod interface {
+ Apply(context.Context, *ComplianceReportRequestMailerTemplate)
+}
+
+type ComplianceReportRequestMailerModFunc func(context.Context, *ComplianceReportRequestMailerTemplate)
+
+func (f ComplianceReportRequestMailerModFunc) Apply(ctx context.Context, n *ComplianceReportRequestMailerTemplate) {
+ f(ctx, n)
+}
+
+type ComplianceReportRequestMailerModSlice []ComplianceReportRequestMailerMod
+
+func (mods ComplianceReportRequestMailerModSlice) Apply(ctx context.Context, n *ComplianceReportRequestMailerTemplate) {
+ for _, f := range mods {
+ f.Apply(ctx, n)
+ }
+}
+
+// ComplianceReportRequestMailerTemplate is an object representing the database table.
+// all columns are optional and should be set by mods
+type ComplianceReportRequestMailerTemplate struct {
+ ComplianceReportRequestID func() int32
+ MailerID func() int32
+
+ r complianceReportRequestMailerR
+ f *Factory
+
+ alreadyPersisted bool
+}
+
+type complianceReportRequestMailerR struct {
+ ComplianceReportRequest *complianceReportRequestMailerRComplianceReportRequestR
+ Mailer *complianceReportRequestMailerRMailerR
+}
+
+type complianceReportRequestMailerRComplianceReportRequestR struct {
+ o *ComplianceReportRequestTemplate
+}
+type complianceReportRequestMailerRMailerR struct {
+ o *CommsMailerTemplate
+}
+
+// Apply mods to the ComplianceReportRequestMailerTemplate
+func (o *ComplianceReportRequestMailerTemplate) Apply(ctx context.Context, mods ...ComplianceReportRequestMailerMod) {
+ for _, mod := range mods {
+ mod.Apply(ctx, o)
+ }
+}
+
+// setModelRels creates and sets the relationships on *models.ComplianceReportRequestMailer
+// according to the relationships in the template. Nothing is inserted into the db
+func (t ComplianceReportRequestMailerTemplate) setModelRels(o *models.ComplianceReportRequestMailer) {
+ if t.r.ComplianceReportRequest != nil {
+ rel := t.r.ComplianceReportRequest.o.Build()
+ o.ComplianceReportRequestID = rel.ID // h2
+ o.R.ComplianceReportRequest = rel
+ }
+
+ if t.r.Mailer != nil {
+ rel := t.r.Mailer.o.Build()
+ o.MailerID = rel.ID // h2
+ o.R.Mailer = rel
+ }
+}
+
+// Build returns an *models.ComplianceReportRequestMailer
+// Related objects are also created and placed in the .R field
+// NOTE: Objects are not inserted into the database. Use ComplianceReportRequestMailerTemplate.Create
+func (o ComplianceReportRequestMailerTemplate) Build() *models.ComplianceReportRequestMailer {
+ m := &models.ComplianceReportRequestMailer{}
+
+ if o.ComplianceReportRequestID != nil {
+ m.ComplianceReportRequestID = o.ComplianceReportRequestID()
+ }
+ if o.MailerID != nil {
+ m.MailerID = o.MailerID()
+ }
+
+ o.setModelRels(m)
+
+ return m
+}
+
+// BuildMany returns an models.ComplianceReportRequestMailerSlice
+// Related objects are also created and placed in the .R field
+// NOTE: Objects are not inserted into the database. Use ComplianceReportRequestMailerTemplate.CreateMany
+func (o ComplianceReportRequestMailerTemplate) BuildMany(number int) models.ComplianceReportRequestMailerSlice {
+ m := make(models.ComplianceReportRequestMailerSlice, number)
+
+ for i := range m {
+ m[i] = o.Build()
+ }
+
+ return m
+}
+
+// ComplianceReportRequestMailer has methods that act as mods for the ComplianceReportRequestMailerTemplate
+var ComplianceReportRequestMailerMods complianceReportRequestMailerMods
+
+type complianceReportRequestMailerMods struct{}
+
+func (m complianceReportRequestMailerMods) RandomizeAllColumns(f *faker.Faker) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModSlice{
+ ComplianceReportRequestMailerMods.RandomComplianceReportRequestID(f),
+ ComplianceReportRequestMailerMods.RandomMailerID(f),
+ }
+}
+
+// Set the model columns to this value
+func (m complianceReportRequestMailerMods) ComplianceReportRequestID(val int32) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.ComplianceReportRequestID = func() int32 { return val }
+ })
+}
+
+// Set the Column from the function
+func (m complianceReportRequestMailerMods) ComplianceReportRequestIDFunc(f func() int32) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.ComplianceReportRequestID = f
+ })
+}
+
+// Clear any values for the column
+func (m complianceReportRequestMailerMods) UnsetComplianceReportRequestID() ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.ComplianceReportRequestID = nil
+ })
+}
+
+// Generates a random value for the column using the given faker
+// if faker is nil, a default faker is used
+func (m complianceReportRequestMailerMods) RandomComplianceReportRequestID(f *faker.Faker) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.ComplianceReportRequestID = func() int32 {
+ return random_int32(f)
+ }
+ })
+}
+
+// Set the model columns to this value
+func (m complianceReportRequestMailerMods) MailerID(val int32) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.MailerID = func() int32 { return val }
+ })
+}
+
+// Set the Column from the function
+func (m complianceReportRequestMailerMods) MailerIDFunc(f func() int32) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.MailerID = f
+ })
+}
+
+// Clear any values for the column
+func (m complianceReportRequestMailerMods) UnsetMailerID() ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.MailerID = nil
+ })
+}
+
+// Generates a random value for the column using the given faker
+// if faker is nil, a default faker is used
+func (m complianceReportRequestMailerMods) RandomMailerID(f *faker.Faker) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(_ context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.MailerID = func() int32 {
+ return random_int32(f)
+ }
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithParentsCascading() ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ if isDone, _ := complianceReportRequestMailerWithParentsCascadingCtx.Value(ctx); isDone {
+ return
+ }
+ ctx = complianceReportRequestMailerWithParentsCascadingCtx.WithValue(ctx, true)
+ {
+
+ related := o.f.NewComplianceReportRequestWithContext(ctx, ComplianceReportRequestMods.WithParentsCascading())
+ m.WithComplianceReportRequest(related).Apply(ctx, o)
+ }
+ {
+
+ related := o.f.NewCommsMailerWithContext(ctx, CommsMailerMods.WithParentsCascading())
+ m.WithMailer(related).Apply(ctx, o)
+ }
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithComplianceReportRequest(rel *ComplianceReportRequestTemplate) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.r.ComplianceReportRequest = &complianceReportRequestMailerRComplianceReportRequestR{
+ o: rel,
+ }
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithNewComplianceReportRequest(mods ...ComplianceReportRequestMod) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ related := o.f.NewComplianceReportRequestWithContext(ctx, mods...)
+
+ m.WithComplianceReportRequest(related).Apply(ctx, o)
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithExistingComplianceReportRequest(em *models.ComplianceReportRequest) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.r.ComplianceReportRequest = &complianceReportRequestMailerRComplianceReportRequestR{
+ o: o.f.FromExistingComplianceReportRequest(em),
+ }
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithoutComplianceReportRequest() ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.r.ComplianceReportRequest = nil
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithMailer(rel *CommsMailerTemplate) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.r.Mailer = &complianceReportRequestMailerRMailerR{
+ o: rel,
+ }
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithNewMailer(mods ...CommsMailerMod) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ related := o.f.NewCommsMailerWithContext(ctx, mods...)
+
+ m.WithMailer(related).Apply(ctx, o)
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithExistingMailer(em *models.CommsMailer) ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.r.Mailer = &complianceReportRequestMailerRMailerR{
+ o: o.f.FromExistingCommsMailer(em),
+ }
+ })
+}
+
+func (m complianceReportRequestMailerMods) WithoutMailer() ComplianceReportRequestMailerMod {
+ return ComplianceReportRequestMailerModFunc(func(ctx context.Context, o *ComplianceReportRequestMailerTemplate) {
+ o.r.Mailer = nil
+ })
+}
diff --git a/db/migrations/00077_mailer_rework.sql b/db/migrations/00077_mailer_rework.sql
new file mode 100644
index 00000000..2a501702
--- /dev/null
+++ b/db/migrations/00077_mailer_rework.sql
@@ -0,0 +1,29 @@
+-- +goose Up
+DROP TABLE comms.mailer;
+DROP TYPE comms.MailerType;
+CREATE TABLE comms.mailer (
+ address_id INTEGER NOT NULL REFERENCES address(id),
+ created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
+ id SERIAL NOT NULL,
+ recipient TEXT NOT NULL,
+ uuid UUID NOT NULL,
+ PRIMARY KEY(id)
+);
+CREATE TABLE compliance_report_request_mailer (
+ compliance_report_request_id INTEGER NOT NULL REFERENCES compliance_report_request(id),
+ mailer_id INTEGER NOT NULL REFERENCES comms.mailer(id),
+ UNIQUE(compliance_report_request_id, mailer_id)
+);
+-- +goose Down
+DROP TABLE compliance_report_request_mailer;
+DROP TABLE comms.mailer;
+CREATE TYPE comms.MailerType AS ENUM (
+ 'green-pool'
+);
+CREATE TABLE comms.mailer (
+ created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
+ id SERIAL NOT NULL,
+ type_ comms.MailerType NOT NULL,
+ PRIMARY KEY(id)
+);
+
diff --git a/db/models/address.bob.go b/db/models/address.bob.go
index bb6e8338..03065302 100644
--- a/db/models/address.bob.go
+++ b/db/models/address.bob.go
@@ -53,8 +53,9 @@ type AddressesQuery = *psql.ViewQuery[*Address, AddressSlice]
// addressR is where relationships are stored.
type addressR struct {
- Residents ResidentSlice // resident.resident_address_id_fkey
- Site *Site // site.site_address_id_fkey
+ Mailers CommsMailerSlice // comms.mailer.mailer_address_id_fkey
+ Residents ResidentSlice // resident.resident_address_id_fkey
+ Site *Site // site.site_address_id_fkey
}
func buildAddressColumns(alias string) addressColumns {
@@ -557,6 +558,30 @@ func (o AddressSlice) ReloadAll(ctx context.Context, exec bob.Executor) error {
return nil
}
+// Mailers starts a query for related objects on comms.mailer
+func (o *Address) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
+ return CommsMailers.Query(append(mods,
+ sm.Where(CommsMailers.Columns.AddressID.EQ(psql.Arg(o.ID))),
+ )...)
+}
+
+func (os AddressSlice) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
+ pkID := make(pgtypes.Array[int32], 0, len(os))
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+ pkID = append(pkID, o.ID)
+ }
+ PKArgExpr := psql.Select(sm.Columns(
+ psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")),
+ ))
+
+ return CommsMailers.Query(append(mods,
+ sm.Where(psql.Group(CommsMailers.Columns.AddressID).OP("IN", PKArgExpr)),
+ )...)
+}
+
// Residents starts a query for related objects on resident
func (o *Address) Residents(mods ...bob.Mod[*dialect.SelectQuery]) ResidentsQuery {
return Residents.Query(append(mods,
@@ -605,6 +630,74 @@ func (os AddressSlice) Site(mods ...bob.Mod[*dialect.SelectQuery]) SitesQuery {
)...)
}
+func insertAddressMailers0(ctx context.Context, exec bob.Executor, commsMailers1 []*CommsMailerSetter, address0 *Address) (CommsMailerSlice, error) {
+ for i := range commsMailers1 {
+ commsMailers1[i].AddressID = omit.From(address0.ID)
+ }
+
+ ret, err := CommsMailers.Insert(bob.ToMods(commsMailers1...)).All(ctx, exec)
+ if err != nil {
+ return ret, fmt.Errorf("insertAddressMailers0: %w", err)
+ }
+
+ return ret, nil
+}
+
+func attachAddressMailers0(ctx context.Context, exec bob.Executor, count int, commsMailers1 CommsMailerSlice, address0 *Address) (CommsMailerSlice, error) {
+ setter := &CommsMailerSetter{
+ AddressID: omit.From(address0.ID),
+ }
+
+ err := commsMailers1.UpdateAll(ctx, exec, *setter)
+ if err != nil {
+ return nil, fmt.Errorf("attachAddressMailers0: %w", err)
+ }
+
+ return commsMailers1, nil
+}
+
+func (address0 *Address) InsertMailers(ctx context.Context, exec bob.Executor, related ...*CommsMailerSetter) error {
+ if len(related) == 0 {
+ return nil
+ }
+
+ var err error
+
+ commsMailers1, err := insertAddressMailers0(ctx, exec, related, address0)
+ if err != nil {
+ return err
+ }
+
+ address0.R.Mailers = append(address0.R.Mailers, commsMailers1...)
+
+ for _, rel := range commsMailers1 {
+ rel.R.Address = address0
+ }
+ return nil
+}
+
+func (address0 *Address) AttachMailers(ctx context.Context, exec bob.Executor, related ...*CommsMailer) error {
+ if len(related) == 0 {
+ return nil
+ }
+
+ var err error
+ commsMailers1 := CommsMailerSlice(related)
+
+ _, err = attachAddressMailers0(ctx, exec, len(related), commsMailers1, address0)
+ if err != nil {
+ return err
+ }
+
+ address0.R.Mailers = append(address0.R.Mailers, commsMailers1...)
+
+ for _, rel := range related {
+ rel.R.Address = address0
+ }
+
+ return nil
+}
+
func insertAddressResidents0(ctx context.Context, exec bob.Executor, residents1 []*ResidentSetter, address0 *Address) (ResidentSlice, error) {
for i := range residents1 {
residents1[i].AddressID = omit.From(address0.ID)
@@ -765,6 +858,20 @@ func (o *Address) Preload(name string, retrieved any) error {
}
switch name {
+ case "Mailers":
+ rels, ok := retrieved.(CommsMailerSlice)
+ if !ok {
+ return fmt.Errorf("address cannot load %T as %q", retrieved, name)
+ }
+
+ o.R.Mailers = rels
+
+ for _, rel := range rels {
+ if rel != nil {
+ rel.R.Address = o
+ }
+ }
+ return nil
case "Residents":
rels, ok := retrieved.(ResidentSlice)
if !ok {
@@ -819,11 +926,15 @@ func buildAddressPreloader() addressPreloader {
}
type addressThenLoader[Q orm.Loadable] struct {
+ Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Residents func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Site func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildAddressThenLoader[Q orm.Loadable]() addressThenLoader[Q] {
+ type MailersLoadInterface interface {
+ LoadMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
type ResidentsLoadInterface interface {
LoadResidents(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
@@ -832,6 +943,12 @@ func buildAddressThenLoader[Q orm.Loadable]() addressThenLoader[Q] {
}
return addressThenLoader[Q]{
+ Mailers: thenLoadBuilder[Q](
+ "Mailers",
+ func(ctx context.Context, exec bob.Executor, retrieved MailersLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadMailers(ctx, exec, mods...)
+ },
+ ),
Residents: thenLoadBuilder[Q](
"Residents",
func(ctx context.Context, exec bob.Executor, retrieved ResidentsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
@@ -847,6 +964,67 @@ func buildAddressThenLoader[Q orm.Loadable]() addressThenLoader[Q] {
}
}
+// LoadMailers loads the address's Mailers into the .R struct
+func (o *Address) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ // Reset the relationship
+ o.R.Mailers = nil
+
+ related, err := o.Mailers(mods...).All(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ for _, rel := range related {
+ rel.R.Address = o
+ }
+
+ o.R.Mailers = related
+ return nil
+}
+
+// LoadMailers loads the address's Mailers into the .R struct
+func (os AddressSlice) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ commsMailers, err := os.Mailers(mods...).All(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+
+ o.R.Mailers = nil
+ }
+
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+
+ for _, rel := range commsMailers {
+
+ if !(o.ID == rel.AddressID) {
+ continue
+ }
+
+ rel.R.Address = o
+
+ o.R.Mailers = append(o.R.Mailers, rel)
+ }
+ }
+
+ return nil
+}
+
// LoadResidents loads the address's Residents into the .R struct
func (o *Address) LoadResidents(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
@@ -962,6 +1140,7 @@ func (os AddressSlice) LoadSite(ctx context.Context, exec bob.Executor, mods ...
// addressC is where relationship counts are stored.
type addressC struct {
+ Mailers *int64
Residents *int64
}
@@ -972,6 +1151,8 @@ func (o *Address) PreloadCount(name string, count int64) error {
}
switch name {
+ case "Mailers":
+ o.C.Mailers = &count
case "Residents":
o.C.Residents = &count
}
@@ -979,11 +1160,29 @@ func (o *Address) PreloadCount(name string, count int64) error {
}
type addressCountPreloader struct {
+ Mailers func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
Residents func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
}
func buildAddressCountPreloader() addressCountPreloader {
return addressCountPreloader{
+ Mailers: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
+ return countPreloader[*Address]("Mailers", func(parent string) bob.Expression {
+ // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
+ if parent == "" {
+ parent = Addresses.Alias()
+ }
+
+ subqueryMods := []bob.Mod[*dialect.SelectQuery]{
+ sm.Columns(psql.Raw("count(*)")),
+
+ sm.From(CommsMailers.Name()),
+ sm.Where(psql.Quote(CommsMailers.Alias(), "address_id").EQ(psql.Quote(parent, "id"))),
+ }
+ subqueryMods = append(subqueryMods, mods...)
+ return psql.Group(psql.Select(subqueryMods...).Expression)
+ })
+ },
Residents: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
return countPreloader[*Address]("Residents", func(parent string) bob.Expression {
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
@@ -1005,15 +1204,25 @@ func buildAddressCountPreloader() addressCountPreloader {
}
type addressCountThenLoader[Q orm.Loadable] struct {
+ Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Residents func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildAddressCountThenLoader[Q orm.Loadable]() addressCountThenLoader[Q] {
+ type MailersCountInterface interface {
+ LoadCountMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
type ResidentsCountInterface interface {
LoadCountResidents(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
return addressCountThenLoader[Q]{
+ Mailers: countThenLoadBuilder[Q](
+ "Mailers",
+ func(ctx context.Context, exec bob.Executor, retrieved MailersCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadCountMailers(ctx, exec, mods...)
+ },
+ ),
Residents: countThenLoadBuilder[Q](
"Residents",
func(ctx context.Context, exec bob.Executor, retrieved ResidentsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
@@ -1023,6 +1232,36 @@ func buildAddressCountThenLoader[Q orm.Loadable]() addressCountThenLoader[Q] {
}
}
+// LoadCountMailers loads the count of Mailers into the C struct
+func (o *Address) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ count, err := o.Mailers(mods...).Count(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ o.C.Mailers = &count
+ return nil
+}
+
+// LoadCountMailers loads the count of Mailers for a slice
+func (os AddressSlice) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ for _, o := range os {
+ if err := o.LoadCountMailers(ctx, exec, mods...); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
// LoadCountResidents loads the count of Residents into the C struct
func (o *Address) LoadCountResidents(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
@@ -1055,6 +1294,7 @@ func (os AddressSlice) LoadCountResidents(ctx context.Context, exec bob.Executor
type addressJoins[Q dialect.Joinable] struct {
typ string
+ Mailers modAs[Q, commsMailerColumns]
Residents modAs[Q, residentColumns]
Site modAs[Q, siteColumns]
}
@@ -1066,6 +1306,20 @@ func (j addressJoins[Q]) aliasedAs(alias string) addressJoins[Q] {
func buildAddressJoins[Q dialect.Joinable](cols addressColumns, typ string) addressJoins[Q] {
return addressJoins[Q]{
typ: typ,
+ Mailers: modAs[Q, commsMailerColumns]{
+ c: CommsMailers.Columns,
+ f: func(to commsMailerColumns) bob.Mod[Q] {
+ mods := make(mods.QueryMods[Q], 0, 1)
+
+ {
+ mods = append(mods, dialect.Join[Q](typ, CommsMailers.Name().As(to.Alias())).On(
+ to.AddressID.EQ(cols.ID),
+ ))
+ }
+
+ return mods
+ },
+ },
Residents: modAs[Q, residentColumns]{
c: Residents.Columns,
f: func(to residentColumns) bob.Mod[Q] {
diff --git a/db/models/bob_counts.bob.go b/db/models/bob_counts.bob.go
index 096c80f1..0acf1167 100644
--- a/db/models/bob_counts.bob.go
+++ b/db/models/bob_counts.bob.go
@@ -21,102 +21,110 @@ var (
)
type preloadCounts struct {
- Address addressCountPreloader
- ArcgisAccount arcgisAccountCountPreloader
- ArcgisLayer arcgisLayerCountPreloader
- ArcgisLayerField arcgisLayerFieldCountPreloader
- ArcgisServiceFeature arcgisServiceFeatureCountPreloader
- ArcgisUser arcgisuserCountPreloader
- CommsEmailContact commsEmailContactCountPreloader
- CommsEmailTemplate commsEmailTemplateCountPreloader
- CommsPhone commsPhoneCountPreloader
- FileuploadCSV fileuploadCSVCountPreloader
- FileuploadFile fileuploadFileCountPreloader
- NoteAudio noteAudioCountPreloader
- NoteImage noteImageCountPreloader
- Organization organizationCountPreloader
- Parcel parcelCountPreloader
- PublicreportImage publicreportImageCountPreloader
- PublicreportNuisance publicreportNuisanceCountPreloader
- PublicreportPool publicreportPoolCountPreloader
- PublicreportQuick publicreportQuickCountPreloader
- Site siteCountPreloader
- User userCountPreloader
+ Address addressCountPreloader
+ ArcgisAccount arcgisAccountCountPreloader
+ ArcgisLayer arcgisLayerCountPreloader
+ ArcgisLayerField arcgisLayerFieldCountPreloader
+ ArcgisServiceFeature arcgisServiceFeatureCountPreloader
+ ArcgisUser arcgisuserCountPreloader
+ CommsEmailContact commsEmailContactCountPreloader
+ CommsEmailTemplate commsEmailTemplateCountPreloader
+ CommsMailer commsMailerCountPreloader
+ CommsPhone commsPhoneCountPreloader
+ ComplianceReportRequest complianceReportRequestCountPreloader
+ FileuploadCSV fileuploadCSVCountPreloader
+ FileuploadFile fileuploadFileCountPreloader
+ NoteAudio noteAudioCountPreloader
+ NoteImage noteImageCountPreloader
+ Organization organizationCountPreloader
+ Parcel parcelCountPreloader
+ PublicreportImage publicreportImageCountPreloader
+ PublicreportNuisance publicreportNuisanceCountPreloader
+ PublicreportPool publicreportPoolCountPreloader
+ PublicreportQuick publicreportQuickCountPreloader
+ Site siteCountPreloader
+ User userCountPreloader
}
func getPreloadCount() preloadCounts {
return preloadCounts{
- Address: buildAddressCountPreloader(),
- ArcgisAccount: buildArcgisAccountCountPreloader(),
- ArcgisLayer: buildArcgisLayerCountPreloader(),
- ArcgisLayerField: buildArcgisLayerFieldCountPreloader(),
- ArcgisServiceFeature: buildArcgisServiceFeatureCountPreloader(),
- ArcgisUser: buildArcgisUserCountPreloader(),
- CommsEmailContact: buildCommsEmailContactCountPreloader(),
- CommsEmailTemplate: buildCommsEmailTemplateCountPreloader(),
- CommsPhone: buildCommsPhoneCountPreloader(),
- FileuploadCSV: buildFileuploadCSVCountPreloader(),
- FileuploadFile: buildFileuploadFileCountPreloader(),
- NoteAudio: buildNoteAudioCountPreloader(),
- NoteImage: buildNoteImageCountPreloader(),
- Organization: buildOrganizationCountPreloader(),
- Parcel: buildParcelCountPreloader(),
- PublicreportImage: buildPublicreportImageCountPreloader(),
- PublicreportNuisance: buildPublicreportNuisanceCountPreloader(),
- PublicreportPool: buildPublicreportPoolCountPreloader(),
- PublicreportQuick: buildPublicreportQuickCountPreloader(),
- Site: buildSiteCountPreloader(),
- User: buildUserCountPreloader(),
+ Address: buildAddressCountPreloader(),
+ ArcgisAccount: buildArcgisAccountCountPreloader(),
+ ArcgisLayer: buildArcgisLayerCountPreloader(),
+ ArcgisLayerField: buildArcgisLayerFieldCountPreloader(),
+ ArcgisServiceFeature: buildArcgisServiceFeatureCountPreloader(),
+ ArcgisUser: buildArcgisUserCountPreloader(),
+ CommsEmailContact: buildCommsEmailContactCountPreloader(),
+ CommsEmailTemplate: buildCommsEmailTemplateCountPreloader(),
+ CommsMailer: buildCommsMailerCountPreloader(),
+ CommsPhone: buildCommsPhoneCountPreloader(),
+ ComplianceReportRequest: buildComplianceReportRequestCountPreloader(),
+ FileuploadCSV: buildFileuploadCSVCountPreloader(),
+ FileuploadFile: buildFileuploadFileCountPreloader(),
+ NoteAudio: buildNoteAudioCountPreloader(),
+ NoteImage: buildNoteImageCountPreloader(),
+ Organization: buildOrganizationCountPreloader(),
+ Parcel: buildParcelCountPreloader(),
+ PublicreportImage: buildPublicreportImageCountPreloader(),
+ PublicreportNuisance: buildPublicreportNuisanceCountPreloader(),
+ PublicreportPool: buildPublicreportPoolCountPreloader(),
+ PublicreportQuick: buildPublicreportQuickCountPreloader(),
+ Site: buildSiteCountPreloader(),
+ User: buildUserCountPreloader(),
}
}
type thenLoadCounts[Q orm.Loadable] struct {
- Address addressCountThenLoader[Q]
- ArcgisAccount arcgisAccountCountThenLoader[Q]
- ArcgisLayer arcgisLayerCountThenLoader[Q]
- ArcgisLayerField arcgisLayerFieldCountThenLoader[Q]
- ArcgisServiceFeature arcgisServiceFeatureCountThenLoader[Q]
- ArcgisUser arcgisuserCountThenLoader[Q]
- CommsEmailContact commsEmailContactCountThenLoader[Q]
- CommsEmailTemplate commsEmailTemplateCountThenLoader[Q]
- CommsPhone commsPhoneCountThenLoader[Q]
- FileuploadCSV fileuploadCSVCountThenLoader[Q]
- FileuploadFile fileuploadFileCountThenLoader[Q]
- NoteAudio noteAudioCountThenLoader[Q]
- NoteImage noteImageCountThenLoader[Q]
- Organization organizationCountThenLoader[Q]
- Parcel parcelCountThenLoader[Q]
- PublicreportImage publicreportImageCountThenLoader[Q]
- PublicreportNuisance publicreportNuisanceCountThenLoader[Q]
- PublicreportPool publicreportPoolCountThenLoader[Q]
- PublicreportQuick publicreportQuickCountThenLoader[Q]
- Site siteCountThenLoader[Q]
- User userCountThenLoader[Q]
+ Address addressCountThenLoader[Q]
+ ArcgisAccount arcgisAccountCountThenLoader[Q]
+ ArcgisLayer arcgisLayerCountThenLoader[Q]
+ ArcgisLayerField arcgisLayerFieldCountThenLoader[Q]
+ ArcgisServiceFeature arcgisServiceFeatureCountThenLoader[Q]
+ ArcgisUser arcgisuserCountThenLoader[Q]
+ CommsEmailContact commsEmailContactCountThenLoader[Q]
+ CommsEmailTemplate commsEmailTemplateCountThenLoader[Q]
+ CommsMailer commsMailerCountThenLoader[Q]
+ CommsPhone commsPhoneCountThenLoader[Q]
+ ComplianceReportRequest complianceReportRequestCountThenLoader[Q]
+ FileuploadCSV fileuploadCSVCountThenLoader[Q]
+ FileuploadFile fileuploadFileCountThenLoader[Q]
+ NoteAudio noteAudioCountThenLoader[Q]
+ NoteImage noteImageCountThenLoader[Q]
+ Organization organizationCountThenLoader[Q]
+ Parcel parcelCountThenLoader[Q]
+ PublicreportImage publicreportImageCountThenLoader[Q]
+ PublicreportNuisance publicreportNuisanceCountThenLoader[Q]
+ PublicreportPool publicreportPoolCountThenLoader[Q]
+ PublicreportQuick publicreportQuickCountThenLoader[Q]
+ Site siteCountThenLoader[Q]
+ User userCountThenLoader[Q]
}
func getThenLoadCount[Q orm.Loadable]() thenLoadCounts[Q] {
return thenLoadCounts[Q]{
- Address: buildAddressCountThenLoader[Q](),
- ArcgisAccount: buildArcgisAccountCountThenLoader[Q](),
- ArcgisLayer: buildArcgisLayerCountThenLoader[Q](),
- ArcgisLayerField: buildArcgisLayerFieldCountThenLoader[Q](),
- ArcgisServiceFeature: buildArcgisServiceFeatureCountThenLoader[Q](),
- ArcgisUser: buildArcgisUserCountThenLoader[Q](),
- CommsEmailContact: buildCommsEmailContactCountThenLoader[Q](),
- CommsEmailTemplate: buildCommsEmailTemplateCountThenLoader[Q](),
- CommsPhone: buildCommsPhoneCountThenLoader[Q](),
- FileuploadCSV: buildFileuploadCSVCountThenLoader[Q](),
- FileuploadFile: buildFileuploadFileCountThenLoader[Q](),
- NoteAudio: buildNoteAudioCountThenLoader[Q](),
- NoteImage: buildNoteImageCountThenLoader[Q](),
- Organization: buildOrganizationCountThenLoader[Q](),
- Parcel: buildParcelCountThenLoader[Q](),
- PublicreportImage: buildPublicreportImageCountThenLoader[Q](),
- PublicreportNuisance: buildPublicreportNuisanceCountThenLoader[Q](),
- PublicreportPool: buildPublicreportPoolCountThenLoader[Q](),
- PublicreportQuick: buildPublicreportQuickCountThenLoader[Q](),
- Site: buildSiteCountThenLoader[Q](),
- User: buildUserCountThenLoader[Q](),
+ Address: buildAddressCountThenLoader[Q](),
+ ArcgisAccount: buildArcgisAccountCountThenLoader[Q](),
+ ArcgisLayer: buildArcgisLayerCountThenLoader[Q](),
+ ArcgisLayerField: buildArcgisLayerFieldCountThenLoader[Q](),
+ ArcgisServiceFeature: buildArcgisServiceFeatureCountThenLoader[Q](),
+ ArcgisUser: buildArcgisUserCountThenLoader[Q](),
+ CommsEmailContact: buildCommsEmailContactCountThenLoader[Q](),
+ CommsEmailTemplate: buildCommsEmailTemplateCountThenLoader[Q](),
+ CommsMailer: buildCommsMailerCountThenLoader[Q](),
+ CommsPhone: buildCommsPhoneCountThenLoader[Q](),
+ ComplianceReportRequest: buildComplianceReportRequestCountThenLoader[Q](),
+ FileuploadCSV: buildFileuploadCSVCountThenLoader[Q](),
+ FileuploadFile: buildFileuploadFileCountThenLoader[Q](),
+ NoteAudio: buildNoteAudioCountThenLoader[Q](),
+ NoteImage: buildNoteImageCountThenLoader[Q](),
+ Organization: buildOrganizationCountThenLoader[Q](),
+ Parcel: buildParcelCountThenLoader[Q](),
+ PublicreportImage: buildPublicreportImageCountThenLoader[Q](),
+ PublicreportNuisance: buildPublicreportNuisanceCountThenLoader[Q](),
+ PublicreportPool: buildPublicreportPoolCountThenLoader[Q](),
+ PublicreportQuick: buildPublicreportQuickCountThenLoader[Q](),
+ Site: buildSiteCountThenLoader[Q](),
+ User: buildUserCountThenLoader[Q](),
}
}
diff --git a/db/models/bob_joins.bob.go b/db/models/bob_joins.bob.go
index acf2abdc..76f60ab3 100644
--- a/db/models/bob_joins.bob.go
+++ b/db/models/bob_joins.bob.go
@@ -46,10 +46,12 @@ type joins[Q dialect.Joinable] struct {
CommsEmailContacts joinSet[commsEmailContactJoins[Q]]
CommsEmailLogs joinSet[commsEmailLogJoins[Q]]
CommsEmailTemplates joinSet[commsEmailTemplateJoins[Q]]
+ CommsMailers joinSet[commsMailerJoins[Q]]
CommsPhones joinSet[commsPhoneJoins[Q]]
CommsTextJobs joinSet[commsTextJobJoins[Q]]
CommsTextLogs joinSet[commsTextLogJoins[Q]]
ComplianceReportRequests joinSet[complianceReportRequestJoins[Q]]
+ ComplianceReportRequestMailers joinSet[complianceReportRequestMailerJoins[Q]]
DistrictSubscriptionEmails joinSet[districtSubscriptionEmailJoins[Q]]
DistrictSubscriptionPhones joinSet[districtSubscriptionPhoneJoins[Q]]
FieldseekerContainerrelates joinSet[fieldseekerContainerrelateJoins[Q]]
@@ -140,10 +142,12 @@ func getJoins[Q dialect.Joinable]() joins[Q] {
CommsEmailContacts: buildJoinSet[commsEmailContactJoins[Q]](CommsEmailContacts.Columns, buildCommsEmailContactJoins),
CommsEmailLogs: buildJoinSet[commsEmailLogJoins[Q]](CommsEmailLogs.Columns, buildCommsEmailLogJoins),
CommsEmailTemplates: buildJoinSet[commsEmailTemplateJoins[Q]](CommsEmailTemplates.Columns, buildCommsEmailTemplateJoins),
+ CommsMailers: buildJoinSet[commsMailerJoins[Q]](CommsMailers.Columns, buildCommsMailerJoins),
CommsPhones: buildJoinSet[commsPhoneJoins[Q]](CommsPhones.Columns, buildCommsPhoneJoins),
CommsTextJobs: buildJoinSet[commsTextJobJoins[Q]](CommsTextJobs.Columns, buildCommsTextJobJoins),
CommsTextLogs: buildJoinSet[commsTextLogJoins[Q]](CommsTextLogs.Columns, buildCommsTextLogJoins),
ComplianceReportRequests: buildJoinSet[complianceReportRequestJoins[Q]](ComplianceReportRequests.Columns, buildComplianceReportRequestJoins),
+ ComplianceReportRequestMailers: buildJoinSet[complianceReportRequestMailerJoins[Q]](ComplianceReportRequestMailers.Columns, buildComplianceReportRequestMailerJoins),
DistrictSubscriptionEmails: buildJoinSet[districtSubscriptionEmailJoins[Q]](DistrictSubscriptionEmails.Columns, buildDistrictSubscriptionEmailJoins),
DistrictSubscriptionPhones: buildJoinSet[districtSubscriptionPhoneJoins[Q]](DistrictSubscriptionPhones.Columns, buildDistrictSubscriptionPhoneJoins),
FieldseekerContainerrelates: buildJoinSet[fieldseekerContainerrelateJoins[Q]](FieldseekerContainerrelates.Columns, buildFieldseekerContainerrelateJoins),
diff --git a/db/models/bob_loaders.bob.go b/db/models/bob_loaders.bob.go
index 1e691eb5..b5afd551 100644
--- a/db/models/bob_loaders.bob.go
+++ b/db/models/bob_loaders.bob.go
@@ -31,10 +31,12 @@ type preloaders struct {
CommsEmailContact commsEmailContactPreloader
CommsEmailLog commsEmailLogPreloader
CommsEmailTemplate commsEmailTemplatePreloader
+ CommsMailer commsMailerPreloader
CommsPhone commsPhonePreloader
CommsTextJob commsTextJobPreloader
CommsTextLog commsTextLogPreloader
ComplianceReportRequest complianceReportRequestPreloader
+ ComplianceReportRequestMailer complianceReportRequestMailerPreloader
DistrictSubscriptionEmail districtSubscriptionEmailPreloader
DistrictSubscriptionPhone districtSubscriptionPhonePreloader
FieldseekerContainerrelate fieldseekerContainerrelatePreloader
@@ -117,10 +119,12 @@ func getPreloaders() preloaders {
CommsEmailContact: buildCommsEmailContactPreloader(),
CommsEmailLog: buildCommsEmailLogPreloader(),
CommsEmailTemplate: buildCommsEmailTemplatePreloader(),
+ CommsMailer: buildCommsMailerPreloader(),
CommsPhone: buildCommsPhonePreloader(),
CommsTextJob: buildCommsTextJobPreloader(),
CommsTextLog: buildCommsTextLogPreloader(),
ComplianceReportRequest: buildComplianceReportRequestPreloader(),
+ ComplianceReportRequestMailer: buildComplianceReportRequestMailerPreloader(),
DistrictSubscriptionEmail: buildDistrictSubscriptionEmailPreloader(),
DistrictSubscriptionPhone: buildDistrictSubscriptionPhonePreloader(),
FieldseekerContainerrelate: buildFieldseekerContainerrelatePreloader(),
@@ -209,10 +213,12 @@ type thenLoaders[Q orm.Loadable] struct {
CommsEmailContact commsEmailContactThenLoader[Q]
CommsEmailLog commsEmailLogThenLoader[Q]
CommsEmailTemplate commsEmailTemplateThenLoader[Q]
+ CommsMailer commsMailerThenLoader[Q]
CommsPhone commsPhoneThenLoader[Q]
CommsTextJob commsTextJobThenLoader[Q]
CommsTextLog commsTextLogThenLoader[Q]
ComplianceReportRequest complianceReportRequestThenLoader[Q]
+ ComplianceReportRequestMailer complianceReportRequestMailerThenLoader[Q]
DistrictSubscriptionEmail districtSubscriptionEmailThenLoader[Q]
DistrictSubscriptionPhone districtSubscriptionPhoneThenLoader[Q]
FieldseekerContainerrelate fieldseekerContainerrelateThenLoader[Q]
@@ -295,10 +301,12 @@ func getThenLoaders[Q orm.Loadable]() thenLoaders[Q] {
CommsEmailContact: buildCommsEmailContactThenLoader[Q](),
CommsEmailLog: buildCommsEmailLogThenLoader[Q](),
CommsEmailTemplate: buildCommsEmailTemplateThenLoader[Q](),
+ CommsMailer: buildCommsMailerThenLoader[Q](),
CommsPhone: buildCommsPhoneThenLoader[Q](),
CommsTextJob: buildCommsTextJobThenLoader[Q](),
CommsTextLog: buildCommsTextLogThenLoader[Q](),
ComplianceReportRequest: buildComplianceReportRequestThenLoader[Q](),
+ ComplianceReportRequestMailer: buildComplianceReportRequestMailerThenLoader[Q](),
DistrictSubscriptionEmail: buildDistrictSubscriptionEmailThenLoader[Q](),
DistrictSubscriptionPhone: buildDistrictSubscriptionPhoneThenLoader[Q](),
FieldseekerContainerrelate: buildFieldseekerContainerrelateThenLoader[Q](),
diff --git a/db/models/bob_where.bob.go b/db/models/bob_where.bob.go
index fd25e29d..885df44b 100644
--- a/db/models/bob_where.bob.go
+++ b/db/models/bob_where.bob.go
@@ -36,6 +36,7 @@ func Where[Q psql.Filterable]() struct {
CommsTextJobs commsTextJobWhere[Q]
CommsTextLogs commsTextLogWhere[Q]
ComplianceReportRequests complianceReportRequestWhere[Q]
+ ComplianceReportRequestMailers complianceReportRequestMailerWhere[Q]
DistrictSubscriptionEmails districtSubscriptionEmailWhere[Q]
DistrictSubscriptionPhones districtSubscriptionPhoneWhere[Q]
FieldseekerContainerrelates fieldseekerContainerrelateWhere[Q]
@@ -129,6 +130,7 @@ func Where[Q psql.Filterable]() struct {
CommsTextJobs commsTextJobWhere[Q]
CommsTextLogs commsTextLogWhere[Q]
ComplianceReportRequests complianceReportRequestWhere[Q]
+ ComplianceReportRequestMailers complianceReportRequestMailerWhere[Q]
DistrictSubscriptionEmails districtSubscriptionEmailWhere[Q]
DistrictSubscriptionPhones districtSubscriptionPhoneWhere[Q]
FieldseekerContainerrelates fieldseekerContainerrelateWhere[Q]
@@ -221,6 +223,7 @@ func Where[Q psql.Filterable]() struct {
CommsTextJobs: buildCommsTextJobWhere[Q](CommsTextJobs.Columns),
CommsTextLogs: buildCommsTextLogWhere[Q](CommsTextLogs.Columns),
ComplianceReportRequests: buildComplianceReportRequestWhere[Q](ComplianceReportRequests.Columns),
+ ComplianceReportRequestMailers: buildComplianceReportRequestMailerWhere[Q](ComplianceReportRequestMailers.Columns),
DistrictSubscriptionEmails: buildDistrictSubscriptionEmailWhere[Q](DistrictSubscriptionEmails.Columns),
DistrictSubscriptionPhones: buildDistrictSubscriptionPhoneWhere[Q](DistrictSubscriptionPhones.Columns),
FieldseekerContainerrelates: buildFieldseekerContainerrelateWhere[Q](FieldseekerContainerrelates.Columns),
diff --git a/db/models/comms.mailer.bob.go b/db/models/comms.mailer.bob.go
index 1a87ca57..0082f795 100644
--- a/db/models/comms.mailer.bob.go
+++ b/db/models/comms.mailer.bob.go
@@ -5,7 +5,9 @@ package models
import (
"context"
+ "fmt"
"io"
+ "strconv"
"time"
"github.com/Gleipnir-Technology/bob"
@@ -15,15 +17,25 @@ import (
"github.com/Gleipnir-Technology/bob/dialect/psql/sm"
"github.com/Gleipnir-Technology/bob/dialect/psql/um"
"github.com/Gleipnir-Technology/bob/expr"
- enums "github.com/Gleipnir-Technology/nidus-sync/db/enums"
+ "github.com/Gleipnir-Technology/bob/mods"
+ "github.com/Gleipnir-Technology/bob/orm"
+ "github.com/Gleipnir-Technology/bob/types/pgtypes"
"github.com/aarondl/opt/omit"
+ "github.com/google/uuid"
+ "github.com/stephenafamo/scan"
)
// CommsMailer is an object representing the database table.
type CommsMailer struct {
- Created time.Time `db:"created" `
- ID int32 `db:"id,pk" `
- Type enums.CommsMailertype `db:"type_" `
+ AddressID int32 `db:"address_id" `
+ Created time.Time `db:"created" `
+ ID int32 `db:"id,pk" `
+ Recipient string `db:"recipient" `
+ UUID uuid.UUID `db:"uuid" `
+
+ R commsMailerR `db:"-" `
+
+ C commsMailerC `db:"-" `
}
// CommsMailerSlice is an alias for a slice of pointers to CommsMailer.
@@ -36,24 +48,34 @@ var CommsMailers = psql.NewTablex[*CommsMailer, CommsMailerSlice, *CommsMailerSe
// CommsMailersQuery is a query on the mailer table
type CommsMailersQuery = *psql.ViewQuery[*CommsMailer, CommsMailerSlice]
+// commsMailerR is where relationships are stored.
+type commsMailerR struct {
+ Address *Address // comms.mailer.mailer_address_id_fkey
+ ComplianceReportRequests ComplianceReportRequestSlice // compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey
+}
+
func buildCommsMailerColumns(alias string) commsMailerColumns {
return commsMailerColumns{
ColumnsExpr: expr.NewColumnsExpr(
- "created", "id", "type_",
+ "address_id", "created", "id", "recipient", "uuid",
).WithParent("comms.mailer"),
tableAlias: alias,
+ AddressID: psql.Quote(alias, "address_id"),
Created: psql.Quote(alias, "created"),
ID: psql.Quote(alias, "id"),
- Type: psql.Quote(alias, "type_"),
+ Recipient: psql.Quote(alias, "recipient"),
+ UUID: psql.Quote(alias, "uuid"),
}
}
type commsMailerColumns struct {
expr.ColumnsExpr
tableAlias string
+ AddressID psql.Expression
Created psql.Expression
ID psql.Expression
- Type psql.Expression
+ Recipient psql.Expression
+ UUID psql.Expression
}
func (c commsMailerColumns) Alias() string {
@@ -68,34 +90,48 @@ func (commsMailerColumns) AliasedAs(alias string) commsMailerColumns {
// All values are optional, and do not have to be set
// Generated columns are not included
type CommsMailerSetter struct {
- Created omit.Val[time.Time] `db:"created" `
- ID omit.Val[int32] `db:"id,pk" `
- Type omit.Val[enums.CommsMailertype] `db:"type_" `
+ AddressID omit.Val[int32] `db:"address_id" `
+ Created omit.Val[time.Time] `db:"created" `
+ ID omit.Val[int32] `db:"id,pk" `
+ Recipient omit.Val[string] `db:"recipient" `
+ UUID omit.Val[uuid.UUID] `db:"uuid" `
}
func (s CommsMailerSetter) SetColumns() []string {
- vals := make([]string, 0, 3)
+ vals := make([]string, 0, 5)
+ if s.AddressID.IsValue() {
+ vals = append(vals, "address_id")
+ }
if s.Created.IsValue() {
vals = append(vals, "created")
}
if s.ID.IsValue() {
vals = append(vals, "id")
}
- if s.Type.IsValue() {
- vals = append(vals, "type_")
+ if s.Recipient.IsValue() {
+ vals = append(vals, "recipient")
+ }
+ if s.UUID.IsValue() {
+ vals = append(vals, "uuid")
}
return vals
}
func (s CommsMailerSetter) Overwrite(t *CommsMailer) {
+ if s.AddressID.IsValue() {
+ t.AddressID = s.AddressID.MustGet()
+ }
if s.Created.IsValue() {
t.Created = s.Created.MustGet()
}
if s.ID.IsValue() {
t.ID = s.ID.MustGet()
}
- if s.Type.IsValue() {
- t.Type = s.Type.MustGet()
+ if s.Recipient.IsValue() {
+ t.Recipient = s.Recipient.MustGet()
+ }
+ if s.UUID.IsValue() {
+ t.UUID = s.UUID.MustGet()
}
}
@@ -105,25 +141,37 @@ func (s *CommsMailerSetter) Apply(q *dialect.InsertQuery) {
})
q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) {
- vals := make([]bob.Expression, 3)
- if s.Created.IsValue() {
- vals[0] = psql.Arg(s.Created.MustGet())
+ vals := make([]bob.Expression, 5)
+ if s.AddressID.IsValue() {
+ vals[0] = psql.Arg(s.AddressID.MustGet())
} else {
vals[0] = psql.Raw("DEFAULT")
}
- if s.ID.IsValue() {
- vals[1] = psql.Arg(s.ID.MustGet())
+ if s.Created.IsValue() {
+ vals[1] = psql.Arg(s.Created.MustGet())
} else {
vals[1] = psql.Raw("DEFAULT")
}
- if s.Type.IsValue() {
- vals[2] = psql.Arg(s.Type.MustGet())
+ if s.ID.IsValue() {
+ vals[2] = psql.Arg(s.ID.MustGet())
} else {
vals[2] = psql.Raw("DEFAULT")
}
+ if s.Recipient.IsValue() {
+ vals[3] = psql.Arg(s.Recipient.MustGet())
+ } else {
+ vals[3] = psql.Raw("DEFAULT")
+ }
+
+ if s.UUID.IsValue() {
+ vals[4] = psql.Arg(s.UUID.MustGet())
+ } else {
+ vals[4] = psql.Raw("DEFAULT")
+ }
+
return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "")
}))
}
@@ -133,7 +181,14 @@ func (s CommsMailerSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] {
}
func (s CommsMailerSetter) Expressions(prefix ...string) []bob.Expression {
- exprs := make([]bob.Expression, 0, 3)
+ exprs := make([]bob.Expression, 0, 5)
+
+ if s.AddressID.IsValue() {
+ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
+ psql.Quote(append(prefix, "address_id")...),
+ psql.Arg(s.AddressID),
+ }})
+ }
if s.Created.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
@@ -149,10 +204,17 @@ func (s CommsMailerSetter) Expressions(prefix ...string) []bob.Expression {
}})
}
- if s.Type.IsValue() {
+ if s.Recipient.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
- psql.Quote(append(prefix, "type_")...),
- psql.Arg(s.Type),
+ psql.Quote(append(prefix, "recipient")...),
+ psql.Arg(s.Recipient),
+ }})
+ }
+
+ if s.UUID.IsValue() {
+ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
+ psql.Quote(append(prefix, "uuid")...),
+ psql.Arg(s.UUID),
}})
}
@@ -217,6 +279,7 @@ func (o *CommsMailer) Update(ctx context.Context, exec bob.Executor, s *CommsMai
return err
}
+ o.R = v.R
*o = *v
return nil
@@ -236,7 +299,7 @@ func (o *CommsMailer) Reload(ctx context.Context, exec bob.Executor) error {
if err != nil {
return err
}
-
+ o2.R = o.R
*o = *o2
return nil
@@ -283,7 +346,7 @@ func (o CommsMailerSlice) copyMatchingRows(from ...*CommsMailer) {
if new.ID != old.ID {
continue
}
-
+ new.R = old.R
o[i] = new
break
}
@@ -381,10 +444,113 @@ func (o CommsMailerSlice) ReloadAll(ctx context.Context, exec bob.Executor) erro
return nil
}
+// Address starts a query for related objects on address
+func (o *CommsMailer) Address(mods ...bob.Mod[*dialect.SelectQuery]) AddressesQuery {
+ return Addresses.Query(append(mods,
+ sm.Where(Addresses.Columns.ID.EQ(psql.Arg(o.AddressID))),
+ )...)
+}
+
+func (os CommsMailerSlice) Address(mods ...bob.Mod[*dialect.SelectQuery]) AddressesQuery {
+ pkAddressID := make(pgtypes.Array[int32], 0, len(os))
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+ pkAddressID = append(pkAddressID, o.AddressID)
+ }
+ PKArgExpr := psql.Select(sm.Columns(
+ psql.F("unnest", psql.Cast(psql.Arg(pkAddressID), "integer[]")),
+ ))
+
+ return Addresses.Query(append(mods,
+ sm.Where(psql.Group(Addresses.Columns.ID).OP("IN", PKArgExpr)),
+ )...)
+}
+
+// ComplianceReportRequests starts a query for related objects on compliance_report_request
+func (o *CommsMailer) ComplianceReportRequests(mods ...bob.Mod[*dialect.SelectQuery]) ComplianceReportRequestsQuery {
+ return ComplianceReportRequests.Query(append(mods,
+ sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
+ ComplianceReportRequests.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID)),
+ sm.Where(ComplianceReportRequestMailers.Columns.MailerID.EQ(psql.Arg(o.ID))),
+ )...)
+}
+
+func (os CommsMailerSlice) ComplianceReportRequests(mods ...bob.Mod[*dialect.SelectQuery]) ComplianceReportRequestsQuery {
+ pkID := make(pgtypes.Array[int32], 0, len(os))
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+ pkID = append(pkID, o.ID)
+ }
+ PKArgExpr := psql.Select(sm.Columns(
+ psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")),
+ ))
+
+ return ComplianceReportRequests.Query(append(mods,
+ sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
+ ComplianceReportRequests.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID),
+ ),
+ sm.Where(psql.Group(ComplianceReportRequestMailers.Columns.MailerID).OP("IN", PKArgExpr)),
+ )...)
+}
+
+func attachCommsMailerAddress0(ctx context.Context, exec bob.Executor, count int, commsMailer0 *CommsMailer, address1 *Address) (*CommsMailer, error) {
+ setter := &CommsMailerSetter{
+ AddressID: omit.From(address1.ID),
+ }
+
+ err := commsMailer0.Update(ctx, exec, setter)
+ if err != nil {
+ return nil, fmt.Errorf("attachCommsMailerAddress0: %w", err)
+ }
+
+ return commsMailer0, nil
+}
+
+func (commsMailer0 *CommsMailer) InsertAddress(ctx context.Context, exec bob.Executor, related *AddressSetter) error {
+ var err error
+
+ address1, err := Addresses.Insert(related).One(ctx, exec)
+ if err != nil {
+ return fmt.Errorf("inserting related objects: %w", err)
+ }
+
+ _, err = attachCommsMailerAddress0(ctx, exec, 1, commsMailer0, address1)
+ if err != nil {
+ return err
+ }
+
+ commsMailer0.R.Address = address1
+
+ address1.R.Mailers = append(address1.R.Mailers, commsMailer0)
+
+ return nil
+}
+
+func (commsMailer0 *CommsMailer) AttachAddress(ctx context.Context, exec bob.Executor, address1 *Address) error {
+ var err error
+
+ _, err = attachCommsMailerAddress0(ctx, exec, 1, commsMailer0, address1)
+ if err != nil {
+ return err
+ }
+
+ commsMailer0.R.Address = address1
+
+ address1.R.Mailers = append(address1.R.Mailers, commsMailer0)
+
+ return nil
+}
+
type commsMailerWhere[Q psql.Filterable] struct {
- Created psql.WhereMod[Q, time.Time]
- ID psql.WhereMod[Q, int32]
- Type psql.WhereMod[Q, enums.CommsMailertype]
+ AddressID psql.WhereMod[Q, int32]
+ Created psql.WhereMod[Q, time.Time]
+ ID psql.WhereMod[Q, int32]
+ Recipient psql.WhereMod[Q, string]
+ UUID psql.WhereMod[Q, uuid.UUID]
}
func (commsMailerWhere[Q]) AliasedAs(alias string) commsMailerWhere[Q] {
@@ -393,8 +559,379 @@ func (commsMailerWhere[Q]) AliasedAs(alias string) commsMailerWhere[Q] {
func buildCommsMailerWhere[Q psql.Filterable](cols commsMailerColumns) commsMailerWhere[Q] {
return commsMailerWhere[Q]{
- Created: psql.Where[Q, time.Time](cols.Created),
- ID: psql.Where[Q, int32](cols.ID),
- Type: psql.Where[Q, enums.CommsMailertype](cols.Type),
+ AddressID: psql.Where[Q, int32](cols.AddressID),
+ Created: psql.Where[Q, time.Time](cols.Created),
+ ID: psql.Where[Q, int32](cols.ID),
+ Recipient: psql.Where[Q, string](cols.Recipient),
+ UUID: psql.Where[Q, uuid.UUID](cols.UUID),
+ }
+}
+
+func (o *CommsMailer) Preload(name string, retrieved any) error {
+ if o == nil {
+ return nil
+ }
+
+ switch name {
+ case "Address":
+ rel, ok := retrieved.(*Address)
+ if !ok {
+ return fmt.Errorf("commsMailer cannot load %T as %q", retrieved, name)
+ }
+
+ o.R.Address = rel
+
+ if rel != nil {
+ rel.R.Mailers = CommsMailerSlice{o}
+ }
+ return nil
+ case "ComplianceReportRequests":
+ rels, ok := retrieved.(ComplianceReportRequestSlice)
+ if !ok {
+ return fmt.Errorf("commsMailer cannot load %T as %q", retrieved, name)
+ }
+
+ o.R.ComplianceReportRequests = rels
+
+ for _, rel := range rels {
+ if rel != nil {
+ rel.R.Mailers = CommsMailerSlice{o}
+ }
+ }
+ return nil
+ default:
+ return fmt.Errorf("commsMailer has no relationship %q", name)
+ }
+}
+
+type commsMailerPreloader struct {
+ Address func(...psql.PreloadOption) psql.Preloader
+}
+
+func buildCommsMailerPreloader() commsMailerPreloader {
+ return commsMailerPreloader{
+ Address: func(opts ...psql.PreloadOption) psql.Preloader {
+ return psql.Preload[*Address, AddressSlice](psql.PreloadRel{
+ Name: "Address",
+ Sides: []psql.PreloadSide{
+ {
+ From: CommsMailers,
+ To: Addresses,
+ FromColumns: []string{"address_id"},
+ ToColumns: []string{"id"},
+ },
+ },
+ }, Addresses.Columns.Names(), opts...)
+ },
+ }
+}
+
+type commsMailerThenLoader[Q orm.Loadable] struct {
+ Address func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
+ ComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
+}
+
+func buildCommsMailerThenLoader[Q orm.Loadable]() commsMailerThenLoader[Q] {
+ type AddressLoadInterface interface {
+ LoadAddress(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
+ type ComplianceReportRequestsLoadInterface interface {
+ LoadComplianceReportRequests(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
+
+ return commsMailerThenLoader[Q]{
+ Address: thenLoadBuilder[Q](
+ "Address",
+ func(ctx context.Context, exec bob.Executor, retrieved AddressLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadAddress(ctx, exec, mods...)
+ },
+ ),
+ ComplianceReportRequests: thenLoadBuilder[Q](
+ "ComplianceReportRequests",
+ func(ctx context.Context, exec bob.Executor, retrieved ComplianceReportRequestsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadComplianceReportRequests(ctx, exec, mods...)
+ },
+ ),
+ }
+}
+
+// LoadAddress loads the commsMailer's Address into the .R struct
+func (o *CommsMailer) LoadAddress(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ // Reset the relationship
+ o.R.Address = nil
+
+ related, err := o.Address(mods...).One(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ related.R.Mailers = CommsMailerSlice{o}
+
+ o.R.Address = related
+ return nil
+}
+
+// LoadAddress loads the commsMailer's Address into the .R struct
+func (os CommsMailerSlice) LoadAddress(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ addresses, err := os.Address(mods...).All(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+
+ for _, rel := range addresses {
+
+ if !(o.AddressID == rel.ID) {
+ continue
+ }
+
+ rel.R.Mailers = append(rel.R.Mailers, o)
+
+ o.R.Address = rel
+ break
+ }
+ }
+
+ return nil
+}
+
+// LoadComplianceReportRequests loads the commsMailer's ComplianceReportRequests into the .R struct
+func (o *CommsMailer) LoadComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ // Reset the relationship
+ o.R.ComplianceReportRequests = nil
+
+ related, err := o.ComplianceReportRequests(mods...).All(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ for _, rel := range related {
+ rel.R.Mailers = CommsMailerSlice{o}
+ }
+
+ o.R.ComplianceReportRequests = related
+ return nil
+}
+
+// LoadComplianceReportRequests loads the commsMailer's ComplianceReportRequests into the .R struct
+func (os CommsMailerSlice) LoadComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ // since we are changing the columns, we need to check if the original columns were set or add the defaults
+ sq := dialect.SelectQuery{}
+ for _, mod := range mods {
+ mod.Apply(&sq)
+ }
+
+ if len(sq.SelectList.Columns) == 0 {
+ mods = append(mods, sm.Columns(ComplianceReportRequests.Columns))
+ }
+
+ q := os.ComplianceReportRequests(append(
+ mods,
+ sm.Columns(ComplianceReportRequestMailers.Columns.MailerID.As("related_comms.mailer.ID")),
+ )...)
+
+ IDSlice := []int32{}
+
+ mapper := scan.Mod(scan.StructMapper[*ComplianceReportRequest](), func(ctx context.Context, cols []string) (scan.BeforeFunc, func(any, any) error) {
+ return func(row *scan.Row) (any, error) {
+ IDSlice = append(IDSlice, *new(int32))
+ row.ScheduleScanByName("related_comms.mailer.ID", &IDSlice[len(IDSlice)-1])
+
+ return nil, nil
+ },
+ func(any, any) error {
+ return nil
+ }
+ })
+
+ complianceReportRequests, err := bob.Allx[bob.SliceTransformer[*ComplianceReportRequest, ComplianceReportRequestSlice]](ctx, exec, q, mapper)
+ if err != nil {
+ return err
+ }
+
+ for _, o := range os {
+ o.R.ComplianceReportRequests = nil
+ }
+
+ for _, o := range os {
+ for i, rel := range complianceReportRequests {
+ if !(o.ID == IDSlice[i]) {
+ continue
+ }
+
+ rel.R.Mailers = append(rel.R.Mailers, o)
+
+ o.R.ComplianceReportRequests = append(o.R.ComplianceReportRequests, rel)
+ }
+ }
+
+ return nil
+}
+
+// commsMailerC is where relationship counts are stored.
+type commsMailerC struct {
+ ComplianceReportRequests *int64
+}
+
+// PreloadCount sets a count in the C struct by name
+func (o *CommsMailer) PreloadCount(name string, count int64) error {
+ if o == nil {
+ return nil
+ }
+
+ switch name {
+ case "ComplianceReportRequests":
+ o.C.ComplianceReportRequests = &count
+ }
+ return nil
+}
+
+type commsMailerCountPreloader struct {
+ ComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
+}
+
+func buildCommsMailerCountPreloader() commsMailerCountPreloader {
+ return commsMailerCountPreloader{
+ ComplianceReportRequests: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
+ return countPreloader[*CommsMailer]("ComplianceReportRequests", func(parent string) bob.Expression {
+ // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
+ if parent == "" {
+ parent = CommsMailers.Alias()
+ }
+
+ subqueryMods := []bob.Mod[*dialect.SelectQuery]{
+ sm.Columns(psql.Raw("count(*)")),
+
+ sm.From(ComplianceReportRequestMailers.Name()),
+ sm.Where(psql.Quote(ComplianceReportRequestMailers.Alias(), "mailer_id").EQ(psql.Quote(parent, "id"))),
+ sm.InnerJoin(ComplianceReportRequests.Name()).On(
+ psql.Quote(ComplianceReportRequests.Alias(), "id").EQ(psql.Quote(ComplianceReportRequestMailers.Alias(), "compliance_report_request_id")),
+ ),
+ }
+ subqueryMods = append(subqueryMods, mods...)
+ return psql.Group(psql.Select(subqueryMods...).Expression)
+ })
+ },
+ }
+}
+
+type commsMailerCountThenLoader[Q orm.Loadable] struct {
+ ComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
+}
+
+func buildCommsMailerCountThenLoader[Q orm.Loadable]() commsMailerCountThenLoader[Q] {
+ type ComplianceReportRequestsCountInterface interface {
+ LoadCountComplianceReportRequests(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
+
+ return commsMailerCountThenLoader[Q]{
+ ComplianceReportRequests: countThenLoadBuilder[Q](
+ "ComplianceReportRequests",
+ func(ctx context.Context, exec bob.Executor, retrieved ComplianceReportRequestsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadCountComplianceReportRequests(ctx, exec, mods...)
+ },
+ ),
+ }
+}
+
+// LoadCountComplianceReportRequests loads the count of ComplianceReportRequests into the C struct
+func (o *CommsMailer) LoadCountComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ count, err := o.ComplianceReportRequests(mods...).Count(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ o.C.ComplianceReportRequests = &count
+ return nil
+}
+
+// LoadCountComplianceReportRequests loads the count of ComplianceReportRequests for a slice
+func (os CommsMailerSlice) LoadCountComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ for _, o := range os {
+ if err := o.LoadCountComplianceReportRequests(ctx, exec, mods...); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+type commsMailerJoins[Q dialect.Joinable] struct {
+ typ string
+ Address modAs[Q, addressColumns]
+ ComplianceReportRequests modAs[Q, complianceReportRequestColumns]
+}
+
+func (j commsMailerJoins[Q]) aliasedAs(alias string) commsMailerJoins[Q] {
+ return buildCommsMailerJoins[Q](buildCommsMailerColumns(alias), j.typ)
+}
+
+func buildCommsMailerJoins[Q dialect.Joinable](cols commsMailerColumns, typ string) commsMailerJoins[Q] {
+ return commsMailerJoins[Q]{
+ typ: typ,
+ Address: modAs[Q, addressColumns]{
+ c: Addresses.Columns,
+ f: func(to addressColumns) bob.Mod[Q] {
+ mods := make(mods.QueryMods[Q], 0, 1)
+
+ {
+ mods = append(mods, dialect.Join[Q](typ, Addresses.Name().As(to.Alias())).On(
+ to.ID.EQ(cols.AddressID),
+ ))
+ }
+
+ return mods
+ },
+ },
+ ComplianceReportRequests: modAs[Q, complianceReportRequestColumns]{
+ c: ComplianceReportRequests.Columns,
+ f: func(to complianceReportRequestColumns) bob.Mod[Q] {
+ random := strconv.FormatInt(randInt(), 10)
+ mods := make(mods.QueryMods[Q], 0, 2)
+
+ {
+ to := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
+ mods = append(mods, dialect.Join[Q](typ, ComplianceReportRequestMailers.Name().As(to.Alias())).On(
+ to.MailerID.EQ(cols.ID),
+ ))
+ }
+ {
+ cols := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
+ mods = append(mods, dialect.Join[Q](typ, ComplianceReportRequests.Name().As(to.Alias())).On(
+ to.ID.EQ(cols.ComplianceReportRequestID),
+ ))
+ }
+
+ return mods
+ },
+ },
}
}
diff --git a/db/models/compliance_report_request.bob.go b/db/models/compliance_report_request.bob.go
index 2cfbb510..fc023f24 100644
--- a/db/models/compliance_report_request.bob.go
+++ b/db/models/compliance_report_request.bob.go
@@ -7,6 +7,7 @@ import (
"context"
"fmt"
"io"
+ "strconv"
"time"
"github.com/Gleipnir-Technology/bob"
@@ -20,6 +21,7 @@ import (
"github.com/Gleipnir-Technology/bob/orm"
"github.com/Gleipnir-Technology/bob/types/pgtypes"
"github.com/aarondl/opt/omit"
+ "github.com/stephenafamo/scan"
)
// ComplianceReportRequest is an object representing the database table.
@@ -32,6 +34,8 @@ type ComplianceReportRequest struct {
SiteVersion int32 `db:"site_version" `
R complianceReportRequestR `db:"-" `
+
+ C complianceReportRequestC `db:"-" `
}
// ComplianceReportRequestSlice is an alias for a slice of pointers to ComplianceReportRequest.
@@ -46,8 +50,9 @@ type ComplianceReportRequestsQuery = *psql.ViewQuery[*ComplianceReportRequest, C
// complianceReportRequestR is where relationships are stored.
type complianceReportRequestR struct {
- CreatorUser *User // compliance_report_request.compliance_report_request_creator_fkey
- Site *Site // compliance_report_request.compliance_report_request_site_id_site_version_fkey
+ CreatorUser *User // compliance_report_request.compliance_report_request_creator_fkey
+ Site *Site // compliance_report_request.compliance_report_request_site_id_site_version_fkey
+ Mailers CommsMailerSlice // compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey
}
func buildComplianceReportRequestColumns(alias string) complianceReportRequestColumns {
@@ -514,6 +519,35 @@ func (os ComplianceReportRequestSlice) Site(mods ...bob.Mod[*dialect.SelectQuery
)...)
}
+// Mailers starts a query for related objects on comms.mailer
+func (o *ComplianceReportRequest) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
+ return CommsMailers.Query(append(mods,
+ sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
+ CommsMailers.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.MailerID)),
+ sm.Where(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID.EQ(psql.Arg(o.ID))),
+ )...)
+}
+
+func (os ComplianceReportRequestSlice) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
+ pkID := make(pgtypes.Array[int32], 0, len(os))
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+ pkID = append(pkID, o.ID)
+ }
+ PKArgExpr := psql.Select(sm.Columns(
+ psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")),
+ ))
+
+ return CommsMailers.Query(append(mods,
+ sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
+ CommsMailers.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.MailerID),
+ ),
+ sm.Where(psql.Group(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID).OP("IN", PKArgExpr)),
+ )...)
+}
+
func attachComplianceReportRequestCreatorUser0(ctx context.Context, exec bob.Executor, count int, complianceReportRequest0 *ComplianceReportRequest, user1 *User) (*ComplianceReportRequest, error) {
setter := &ComplianceReportRequestSetter{
Creator: omit.From(user1.ID),
@@ -665,6 +699,20 @@ func (o *ComplianceReportRequest) Preload(name string, retrieved any) error {
rel.R.ComplianceReportRequests = ComplianceReportRequestSlice{o}
}
return nil
+ case "Mailers":
+ rels, ok := retrieved.(CommsMailerSlice)
+ if !ok {
+ return fmt.Errorf("complianceReportRequest cannot load %T as %q", retrieved, name)
+ }
+
+ o.R.Mailers = rels
+
+ for _, rel := range rels {
+ if rel != nil {
+ rel.R.ComplianceReportRequests = ComplianceReportRequestSlice{o}
+ }
+ }
+ return nil
default:
return fmt.Errorf("complianceReportRequest has no relationship %q", name)
}
@@ -709,6 +757,7 @@ func buildComplianceReportRequestPreloader() complianceReportRequestPreloader {
type complianceReportRequestThenLoader[Q orm.Loadable] struct {
CreatorUser func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Site func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
+ Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildComplianceReportRequestThenLoader[Q orm.Loadable]() complianceReportRequestThenLoader[Q] {
@@ -718,6 +767,9 @@ func buildComplianceReportRequestThenLoader[Q orm.Loadable]() complianceReportRe
type SiteLoadInterface interface {
LoadSite(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
+ type MailersLoadInterface interface {
+ LoadMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
return complianceReportRequestThenLoader[Q]{
CreatorUser: thenLoadBuilder[Q](
@@ -732,6 +784,12 @@ func buildComplianceReportRequestThenLoader[Q orm.Loadable]() complianceReportRe
return retrieved.LoadSite(ctx, exec, mods...)
},
),
+ Mailers: thenLoadBuilder[Q](
+ "Mailers",
+ func(ctx context.Context, exec bob.Executor, retrieved MailersLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadMailers(ctx, exec, mods...)
+ },
+ ),
}
}
@@ -843,10 +901,188 @@ func (os ComplianceReportRequestSlice) LoadSite(ctx context.Context, exec bob.Ex
return nil
}
+// LoadMailers loads the complianceReportRequest's Mailers into the .R struct
+func (o *ComplianceReportRequest) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ // Reset the relationship
+ o.R.Mailers = nil
+
+ related, err := o.Mailers(mods...).All(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ for _, rel := range related {
+ rel.R.ComplianceReportRequests = ComplianceReportRequestSlice{o}
+ }
+
+ o.R.Mailers = related
+ return nil
+}
+
+// LoadMailers loads the complianceReportRequest's Mailers into the .R struct
+func (os ComplianceReportRequestSlice) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ // since we are changing the columns, we need to check if the original columns were set or add the defaults
+ sq := dialect.SelectQuery{}
+ for _, mod := range mods {
+ mod.Apply(&sq)
+ }
+
+ if len(sq.SelectList.Columns) == 0 {
+ mods = append(mods, sm.Columns(CommsMailers.Columns))
+ }
+
+ q := os.Mailers(append(
+ mods,
+ sm.Columns(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID.As("related_compliance_report_request.ID")),
+ )...)
+
+ IDSlice := []int32{}
+
+ mapper := scan.Mod(scan.StructMapper[*CommsMailer](), func(ctx context.Context, cols []string) (scan.BeforeFunc, func(any, any) error) {
+ return func(row *scan.Row) (any, error) {
+ IDSlice = append(IDSlice, *new(int32))
+ row.ScheduleScanByName("related_compliance_report_request.ID", &IDSlice[len(IDSlice)-1])
+
+ return nil, nil
+ },
+ func(any, any) error {
+ return nil
+ }
+ })
+
+ commsMailers, err := bob.Allx[bob.SliceTransformer[*CommsMailer, CommsMailerSlice]](ctx, exec, q, mapper)
+ if err != nil {
+ return err
+ }
+
+ for _, o := range os {
+ o.R.Mailers = nil
+ }
+
+ for _, o := range os {
+ for i, rel := range commsMailers {
+ if !(o.ID == IDSlice[i]) {
+ continue
+ }
+
+ rel.R.ComplianceReportRequests = append(rel.R.ComplianceReportRequests, o)
+
+ o.R.Mailers = append(o.R.Mailers, rel)
+ }
+ }
+
+ return nil
+}
+
+// complianceReportRequestC is where relationship counts are stored.
+type complianceReportRequestC struct {
+ Mailers *int64
+}
+
+// PreloadCount sets a count in the C struct by name
+func (o *ComplianceReportRequest) PreloadCount(name string, count int64) error {
+ if o == nil {
+ return nil
+ }
+
+ switch name {
+ case "Mailers":
+ o.C.Mailers = &count
+ }
+ return nil
+}
+
+type complianceReportRequestCountPreloader struct {
+ Mailers func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
+}
+
+func buildComplianceReportRequestCountPreloader() complianceReportRequestCountPreloader {
+ return complianceReportRequestCountPreloader{
+ Mailers: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
+ return countPreloader[*ComplianceReportRequest]("Mailers", func(parent string) bob.Expression {
+ // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
+ if parent == "" {
+ parent = ComplianceReportRequests.Alias()
+ }
+
+ subqueryMods := []bob.Mod[*dialect.SelectQuery]{
+ sm.Columns(psql.Raw("count(*)")),
+
+ sm.From(ComplianceReportRequestMailers.Name()),
+ sm.Where(psql.Quote(ComplianceReportRequestMailers.Alias(), "compliance_report_request_id").EQ(psql.Quote(parent, "id"))),
+ sm.InnerJoin(CommsMailers.Name()).On(
+ psql.Quote(CommsMailers.Alias(), "id").EQ(psql.Quote(ComplianceReportRequestMailers.Alias(), "mailer_id")),
+ ),
+ }
+ subqueryMods = append(subqueryMods, mods...)
+ return psql.Group(psql.Select(subqueryMods...).Expression)
+ })
+ },
+ }
+}
+
+type complianceReportRequestCountThenLoader[Q orm.Loadable] struct {
+ Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
+}
+
+func buildComplianceReportRequestCountThenLoader[Q orm.Loadable]() complianceReportRequestCountThenLoader[Q] {
+ type MailersCountInterface interface {
+ LoadCountMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
+
+ return complianceReportRequestCountThenLoader[Q]{
+ Mailers: countThenLoadBuilder[Q](
+ "Mailers",
+ func(ctx context.Context, exec bob.Executor, retrieved MailersCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadCountMailers(ctx, exec, mods...)
+ },
+ ),
+ }
+}
+
+// LoadCountMailers loads the count of Mailers into the C struct
+func (o *ComplianceReportRequest) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ count, err := o.Mailers(mods...).Count(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ o.C.Mailers = &count
+ return nil
+}
+
+// LoadCountMailers loads the count of Mailers for a slice
+func (os ComplianceReportRequestSlice) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ for _, o := range os {
+ if err := o.LoadCountMailers(ctx, exec, mods...); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
type complianceReportRequestJoins[Q dialect.Joinable] struct {
typ string
CreatorUser modAs[Q, userColumns]
Site modAs[Q, siteColumns]
+ Mailers modAs[Q, commsMailerColumns]
}
func (j complianceReportRequestJoins[Q]) aliasedAs(alias string) complianceReportRequestJoins[Q] {
@@ -881,6 +1117,28 @@ func buildComplianceReportRequestJoins[Q dialect.Joinable](cols complianceReport
))
}
+ return mods
+ },
+ },
+ Mailers: modAs[Q, commsMailerColumns]{
+ c: CommsMailers.Columns,
+ f: func(to commsMailerColumns) bob.Mod[Q] {
+ random := strconv.FormatInt(randInt(), 10)
+ mods := make(mods.QueryMods[Q], 0, 2)
+
+ {
+ to := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
+ mods = append(mods, dialect.Join[Q](typ, ComplianceReportRequestMailers.Name().As(to.Alias())).On(
+ to.ComplianceReportRequestID.EQ(cols.ID),
+ ))
+ }
+ {
+ cols := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
+ mods = append(mods, dialect.Join[Q](typ, CommsMailers.Name().As(to.Alias())).On(
+ to.ID.EQ(cols.MailerID),
+ ))
+ }
+
return mods
},
},
diff --git a/db/models/compliance_report_request_mailer.bob.go b/db/models/compliance_report_request_mailer.bob.go
new file mode 100644
index 00000000..56a62a19
--- /dev/null
+++ b/db/models/compliance_report_request_mailer.bob.go
@@ -0,0 +1,464 @@
+// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
+// This file is meant to be re-generated in place and/or deleted at any time.
+
+package models
+
+import (
+ "context"
+ "fmt"
+ "io"
+
+ "github.com/Gleipnir-Technology/bob"
+ "github.com/Gleipnir-Technology/bob/dialect/psql"
+ "github.com/Gleipnir-Technology/bob/dialect/psql/dialect"
+ "github.com/Gleipnir-Technology/bob/dialect/psql/sm"
+ "github.com/Gleipnir-Technology/bob/dialect/psql/um"
+ "github.com/Gleipnir-Technology/bob/expr"
+ "github.com/Gleipnir-Technology/bob/mods"
+ "github.com/Gleipnir-Technology/bob/orm"
+ "github.com/Gleipnir-Technology/bob/types/pgtypes"
+ "github.com/aarondl/opt/omit"
+)
+
+// ComplianceReportRequestMailer is an object representing the database table.
+type ComplianceReportRequestMailer struct {
+ ComplianceReportRequestID int32 `db:"compliance_report_request_id" `
+ MailerID int32 `db:"mailer_id" `
+
+ R complianceReportRequestMailerR `db:"-" `
+}
+
+// ComplianceReportRequestMailerSlice is an alias for a slice of pointers to ComplianceReportRequestMailer.
+// This should almost always be used instead of []*ComplianceReportRequestMailer.
+type ComplianceReportRequestMailerSlice []*ComplianceReportRequestMailer
+
+// ComplianceReportRequestMailers contains methods to work with the compliance_report_request_mailer view
+var ComplianceReportRequestMailers = psql.NewViewx[*ComplianceReportRequestMailer, ComplianceReportRequestMailerSlice]("", "compliance_report_request_mailer", buildComplianceReportRequestMailerColumns("compliance_report_request_mailer"))
+
+// ComplianceReportRequestMailersQuery is a query on the compliance_report_request_mailer view
+type ComplianceReportRequestMailersQuery = *psql.ViewQuery[*ComplianceReportRequestMailer, ComplianceReportRequestMailerSlice]
+
+// complianceReportRequestMailerR is where relationships are stored.
+type complianceReportRequestMailerR struct {
+ ComplianceReportRequest *ComplianceReportRequest // compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkey
+ Mailer *CommsMailer // compliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey
+}
+
+func buildComplianceReportRequestMailerColumns(alias string) complianceReportRequestMailerColumns {
+ return complianceReportRequestMailerColumns{
+ ColumnsExpr: expr.NewColumnsExpr(
+ "compliance_report_request_id", "mailer_id",
+ ).WithParent("compliance_report_request_mailer"),
+ tableAlias: alias,
+ ComplianceReportRequestID: psql.Quote(alias, "compliance_report_request_id"),
+ MailerID: psql.Quote(alias, "mailer_id"),
+ }
+}
+
+type complianceReportRequestMailerColumns struct {
+ expr.ColumnsExpr
+ tableAlias string
+ ComplianceReportRequestID psql.Expression
+ MailerID psql.Expression
+}
+
+func (c complianceReportRequestMailerColumns) Alias() string {
+ return c.tableAlias
+}
+
+func (complianceReportRequestMailerColumns) AliasedAs(alias string) complianceReportRequestMailerColumns {
+ return buildComplianceReportRequestMailerColumns(alias)
+}
+
+// ComplianceReportRequestMailerSetter is used for insert/upsert/update operations
+// All values are optional, and do not have to be set
+// Generated columns are not included
+type ComplianceReportRequestMailerSetter struct {
+ ComplianceReportRequestID omit.Val[int32] `db:"compliance_report_request_id" `
+ MailerID omit.Val[int32] `db:"mailer_id" `
+}
+
+func (s ComplianceReportRequestMailerSetter) SetColumns() []string {
+ vals := make([]string, 0, 2)
+ if s.ComplianceReportRequestID.IsValue() {
+ vals = append(vals, "compliance_report_request_id")
+ }
+ if s.MailerID.IsValue() {
+ vals = append(vals, "mailer_id")
+ }
+ return vals
+}
+
+func (s ComplianceReportRequestMailerSetter) Overwrite(t *ComplianceReportRequestMailer) {
+ if s.ComplianceReportRequestID.IsValue() {
+ t.ComplianceReportRequestID = s.ComplianceReportRequestID.MustGet()
+ }
+ if s.MailerID.IsValue() {
+ t.MailerID = s.MailerID.MustGet()
+ }
+}
+
+func (s *ComplianceReportRequestMailerSetter) Apply(q *dialect.InsertQuery) {
+ q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) {
+ vals := make([]bob.Expression, 2)
+ if s.ComplianceReportRequestID.IsValue() {
+ vals[0] = psql.Arg(s.ComplianceReportRequestID.MustGet())
+ } else {
+ vals[0] = psql.Raw("DEFAULT")
+ }
+
+ if s.MailerID.IsValue() {
+ vals[1] = psql.Arg(s.MailerID.MustGet())
+ } else {
+ vals[1] = psql.Raw("DEFAULT")
+ }
+
+ return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "")
+ }))
+}
+
+func (s ComplianceReportRequestMailerSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] {
+ return um.Set(s.Expressions()...)
+}
+
+func (s ComplianceReportRequestMailerSetter) Expressions(prefix ...string) []bob.Expression {
+ exprs := make([]bob.Expression, 0, 2)
+
+ if s.ComplianceReportRequestID.IsValue() {
+ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
+ psql.Quote(append(prefix, "compliance_report_request_id")...),
+ psql.Arg(s.ComplianceReportRequestID),
+ }})
+ }
+
+ if s.MailerID.IsValue() {
+ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
+ psql.Quote(append(prefix, "mailer_id")...),
+ psql.Arg(s.MailerID),
+ }})
+ }
+
+ return exprs
+}
+
+// AfterQueryHook is called after ComplianceReportRequestMailer is retrieved from the database
+func (o *ComplianceReportRequestMailer) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error {
+ var err error
+
+ switch queryType {
+ case bob.QueryTypeSelect:
+ ctx, err = ComplianceReportRequestMailers.AfterSelectHooks.RunHooks(ctx, exec, ComplianceReportRequestMailerSlice{o})
+ }
+
+ return err
+}
+
+// AfterQueryHook is called after ComplianceReportRequestMailerSlice is retrieved from the database
+func (o ComplianceReportRequestMailerSlice) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error {
+ var err error
+
+ switch queryType {
+ case bob.QueryTypeSelect:
+ ctx, err = ComplianceReportRequestMailers.AfterSelectHooks.RunHooks(ctx, exec, o)
+ }
+
+ return err
+}
+
+// ComplianceReportRequest starts a query for related objects on compliance_report_request
+func (o *ComplianceReportRequestMailer) ComplianceReportRequest(mods ...bob.Mod[*dialect.SelectQuery]) ComplianceReportRequestsQuery {
+ return ComplianceReportRequests.Query(append(mods,
+ sm.Where(ComplianceReportRequests.Columns.ID.EQ(psql.Arg(o.ComplianceReportRequestID))),
+ )...)
+}
+
+func (os ComplianceReportRequestMailerSlice) ComplianceReportRequest(mods ...bob.Mod[*dialect.SelectQuery]) ComplianceReportRequestsQuery {
+ pkComplianceReportRequestID := make(pgtypes.Array[int32], 0, len(os))
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+ pkComplianceReportRequestID = append(pkComplianceReportRequestID, o.ComplianceReportRequestID)
+ }
+ PKArgExpr := psql.Select(sm.Columns(
+ psql.F("unnest", psql.Cast(psql.Arg(pkComplianceReportRequestID), "integer[]")),
+ ))
+
+ return ComplianceReportRequests.Query(append(mods,
+ sm.Where(psql.Group(ComplianceReportRequests.Columns.ID).OP("IN", PKArgExpr)),
+ )...)
+}
+
+// Mailer starts a query for related objects on comms.mailer
+func (o *ComplianceReportRequestMailer) Mailer(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
+ return CommsMailers.Query(append(mods,
+ sm.Where(CommsMailers.Columns.ID.EQ(psql.Arg(o.MailerID))),
+ )...)
+}
+
+func (os ComplianceReportRequestMailerSlice) Mailer(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
+ pkMailerID := make(pgtypes.Array[int32], 0, len(os))
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+ pkMailerID = append(pkMailerID, o.MailerID)
+ }
+ PKArgExpr := psql.Select(sm.Columns(
+ psql.F("unnest", psql.Cast(psql.Arg(pkMailerID), "integer[]")),
+ ))
+
+ return CommsMailers.Query(append(mods,
+ sm.Where(psql.Group(CommsMailers.Columns.ID).OP("IN", PKArgExpr)),
+ )...)
+}
+
+type complianceReportRequestMailerWhere[Q psql.Filterable] struct {
+ ComplianceReportRequestID psql.WhereMod[Q, int32]
+ MailerID psql.WhereMod[Q, int32]
+}
+
+func (complianceReportRequestMailerWhere[Q]) AliasedAs(alias string) complianceReportRequestMailerWhere[Q] {
+ return buildComplianceReportRequestMailerWhere[Q](buildComplianceReportRequestMailerColumns(alias))
+}
+
+func buildComplianceReportRequestMailerWhere[Q psql.Filterable](cols complianceReportRequestMailerColumns) complianceReportRequestMailerWhere[Q] {
+ return complianceReportRequestMailerWhere[Q]{
+ ComplianceReportRequestID: psql.Where[Q, int32](cols.ComplianceReportRequestID),
+ MailerID: psql.Where[Q, int32](cols.MailerID),
+ }
+}
+
+func (o *ComplianceReportRequestMailer) Preload(name string, retrieved any) error {
+ if o == nil {
+ return nil
+ }
+
+ switch name {
+ case "ComplianceReportRequest":
+ rel, ok := retrieved.(*ComplianceReportRequest)
+ if !ok {
+ return fmt.Errorf("complianceReportRequestMailer cannot load %T as %q", retrieved, name)
+ }
+
+ o.R.ComplianceReportRequest = rel
+
+ return nil
+ case "Mailer":
+ rel, ok := retrieved.(*CommsMailer)
+ if !ok {
+ return fmt.Errorf("complianceReportRequestMailer cannot load %T as %q", retrieved, name)
+ }
+
+ o.R.Mailer = rel
+
+ return nil
+ default:
+ return fmt.Errorf("complianceReportRequestMailer has no relationship %q", name)
+ }
+}
+
+type complianceReportRequestMailerPreloader struct {
+ ComplianceReportRequest func(...psql.PreloadOption) psql.Preloader
+ Mailer func(...psql.PreloadOption) psql.Preloader
+}
+
+func buildComplianceReportRequestMailerPreloader() complianceReportRequestMailerPreloader {
+ return complianceReportRequestMailerPreloader{
+ ComplianceReportRequest: func(opts ...psql.PreloadOption) psql.Preloader {
+ return psql.Preload[*ComplianceReportRequest, ComplianceReportRequestSlice](psql.PreloadRel{
+ Name: "ComplianceReportRequest",
+ Sides: []psql.PreloadSide{
+ {
+ From: ComplianceReportRequestMailers,
+ To: ComplianceReportRequests,
+ FromColumns: []string{"compliance_report_request_id"},
+ ToColumns: []string{"id"},
+ },
+ },
+ }, ComplianceReportRequests.Columns.Names(), opts...)
+ },
+ Mailer: func(opts ...psql.PreloadOption) psql.Preloader {
+ return psql.Preload[*CommsMailer, CommsMailerSlice](psql.PreloadRel{
+ Name: "Mailer",
+ Sides: []psql.PreloadSide{
+ {
+ From: ComplianceReportRequestMailers,
+ To: CommsMailers,
+ FromColumns: []string{"mailer_id"},
+ ToColumns: []string{"id"},
+ },
+ },
+ }, CommsMailers.Columns.Names(), opts...)
+ },
+ }
+}
+
+type complianceReportRequestMailerThenLoader[Q orm.Loadable] struct {
+ ComplianceReportRequest func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
+ Mailer func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
+}
+
+func buildComplianceReportRequestMailerThenLoader[Q orm.Loadable]() complianceReportRequestMailerThenLoader[Q] {
+ type ComplianceReportRequestLoadInterface interface {
+ LoadComplianceReportRequest(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
+ type MailerLoadInterface interface {
+ LoadMailer(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
+ }
+
+ return complianceReportRequestMailerThenLoader[Q]{
+ ComplianceReportRequest: thenLoadBuilder[Q](
+ "ComplianceReportRequest",
+ func(ctx context.Context, exec bob.Executor, retrieved ComplianceReportRequestLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadComplianceReportRequest(ctx, exec, mods...)
+ },
+ ),
+ Mailer: thenLoadBuilder[Q](
+ "Mailer",
+ func(ctx context.Context, exec bob.Executor, retrieved MailerLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ return retrieved.LoadMailer(ctx, exec, mods...)
+ },
+ ),
+ }
+}
+
+// LoadComplianceReportRequest loads the complianceReportRequestMailer's ComplianceReportRequest into the .R struct
+func (o *ComplianceReportRequestMailer) LoadComplianceReportRequest(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ // Reset the relationship
+ o.R.ComplianceReportRequest = nil
+
+ related, err := o.ComplianceReportRequest(mods...).One(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ o.R.ComplianceReportRequest = related
+ return nil
+}
+
+// LoadComplianceReportRequest loads the complianceReportRequestMailer's ComplianceReportRequest into the .R struct
+func (os ComplianceReportRequestMailerSlice) LoadComplianceReportRequest(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ complianceReportRequests, err := os.ComplianceReportRequest(mods...).All(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+
+ for _, rel := range complianceReportRequests {
+
+ if !(o.ComplianceReportRequestID == rel.ID) {
+ continue
+ }
+
+ o.R.ComplianceReportRequest = rel
+ break
+ }
+ }
+
+ return nil
+}
+
+// LoadMailer loads the complianceReportRequestMailer's Mailer into the .R struct
+func (o *ComplianceReportRequestMailer) LoadMailer(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if o == nil {
+ return nil
+ }
+
+ // Reset the relationship
+ o.R.Mailer = nil
+
+ related, err := o.Mailer(mods...).One(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ o.R.Mailer = related
+ return nil
+}
+
+// LoadMailer loads the complianceReportRequestMailer's Mailer into the .R struct
+func (os ComplianceReportRequestMailerSlice) LoadMailer(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
+ if len(os) == 0 {
+ return nil
+ }
+
+ commsMailers, err := os.Mailer(mods...).All(ctx, exec)
+ if err != nil {
+ return err
+ }
+
+ for _, o := range os {
+ if o == nil {
+ continue
+ }
+
+ for _, rel := range commsMailers {
+
+ if !(o.MailerID == rel.ID) {
+ continue
+ }
+
+ o.R.Mailer = rel
+ break
+ }
+ }
+
+ return nil
+}
+
+type complianceReportRequestMailerJoins[Q dialect.Joinable] struct {
+ typ string
+ ComplianceReportRequest modAs[Q, complianceReportRequestColumns]
+ Mailer modAs[Q, commsMailerColumns]
+}
+
+func (j complianceReportRequestMailerJoins[Q]) aliasedAs(alias string) complianceReportRequestMailerJoins[Q] {
+ return buildComplianceReportRequestMailerJoins[Q](buildComplianceReportRequestMailerColumns(alias), j.typ)
+}
+
+func buildComplianceReportRequestMailerJoins[Q dialect.Joinable](cols complianceReportRequestMailerColumns, typ string) complianceReportRequestMailerJoins[Q] {
+ return complianceReportRequestMailerJoins[Q]{
+ typ: typ,
+ ComplianceReportRequest: modAs[Q, complianceReportRequestColumns]{
+ c: ComplianceReportRequests.Columns,
+ f: func(to complianceReportRequestColumns) bob.Mod[Q] {
+ mods := make(mods.QueryMods[Q], 0, 1)
+
+ {
+ mods = append(mods, dialect.Join[Q](typ, ComplianceReportRequests.Name().As(to.Alias())).On(
+ to.ID.EQ(cols.ComplianceReportRequestID),
+ ))
+ }
+
+ return mods
+ },
+ },
+ Mailer: modAs[Q, commsMailerColumns]{
+ c: CommsMailers.Columns,
+ f: func(to commsMailerColumns) bob.Mod[Q] {
+ mods := make(mods.QueryMods[Q], 0, 1)
+
+ {
+ mods = append(mods, dialect.Join[Q](typ, CommsMailers.Name().As(to.Alias())).On(
+ to.ID.EQ(cols.MailerID),
+ ))
+ }
+
+ return mods
+ },
+ },
+ }
+}
diff --git a/html/template/sync/mailer.html b/html/template/sync/mailer.html
index 27b48ac4..0dafb467 100644
--- a/html/template/sync/mailer.html
+++ b/html/template/sync/mailer.html
@@ -236,7 +236,7 @@
-