Rework mailer database schema, add UUID to mailers

At this point, I sent out our first test mailers for Delta.
This commit is contained in:
Eli Ribble 2026-03-02 23:27:55 +00:00
parent a7bb6181c7
commit a0eee3a95f
No known key found for this signature in database
24 changed files with 2662 additions and 247 deletions

View file

@ -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
}

View file

@ -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,
}
}

View file

@ -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 {
AddressID column
Created column
ID column
Type 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{}

View file

@ -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{}
}

View file

@ -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",
@ -95,11 +112,12 @@ func (c parcelColumns) AsSlice() []column {
type parcelIndexes struct {
ParcelPkey index
IdxParcelGeometry index
}
func (i parcelIndexes) AsSlice() []index {
return []index{
i.ParcelPkey,
i.ParcelPkey, i.IdxParcelGeometry,
}
}

View file

@ -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"

View file

@ -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{{

View file

@ -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")
@ -85,6 +86,8 @@ var (
// Relationship Contexts for comms.mailer
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")

View file

@ -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
}

View file

@ -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

View file

@ -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 {
AddressID func() int32
Created func() time.Time
ID func() int32
Type func() enums.CommsMailertype
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
})
}

View file

@ -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
})
}

View file

@ -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
})
}

View file

@ -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)
);

View file

@ -53,6 +53,7 @@ type AddressesQuery = *psql.ViewQuery[*Address, AddressSlice]
// addressR is where relationships are stored.
type addressR struct {
Mailers CommsMailerSlice // comms.mailer.mailer_address_id_fkey
Residents ResidentSlice // resident.resident_address_id_fkey
Site *Site // site.site_address_id_fkey
}
@ -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] {

View file

@ -29,7 +29,9 @@ type preloadCounts struct {
ArcgisUser arcgisuserCountPreloader
CommsEmailContact commsEmailContactCountPreloader
CommsEmailTemplate commsEmailTemplateCountPreloader
CommsMailer commsMailerCountPreloader
CommsPhone commsPhoneCountPreloader
ComplianceReportRequest complianceReportRequestCountPreloader
FileuploadCSV fileuploadCSVCountPreloader
FileuploadFile fileuploadFileCountPreloader
NoteAudio noteAudioCountPreloader
@ -54,7 +56,9 @@ func getPreloadCount() preloadCounts {
ArcgisUser: buildArcgisUserCountPreloader(),
CommsEmailContact: buildCommsEmailContactCountPreloader(),
CommsEmailTemplate: buildCommsEmailTemplateCountPreloader(),
CommsMailer: buildCommsMailerCountPreloader(),
CommsPhone: buildCommsPhoneCountPreloader(),
ComplianceReportRequest: buildComplianceReportRequestCountPreloader(),
FileuploadCSV: buildFileuploadCSVCountPreloader(),
FileuploadFile: buildFileuploadFileCountPreloader(),
NoteAudio: buildNoteAudioCountPreloader(),
@ -79,7 +83,9 @@ type thenLoadCounts[Q orm.Loadable] struct {
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]
@ -104,7 +110,9 @@ func getThenLoadCount[Q orm.Loadable]() thenLoadCounts[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](),

View file

@ -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),

View file

@ -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](),

View file

@ -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),

View file

@ -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 {
AddressID int32 `db:"address_id" `
Created time.Time `db:"created" `
ID int32 `db:"id,pk" `
Type enums.CommsMailertype `db:"type_" `
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 {
AddressID omit.Val[int32] `db:"address_id" `
Created omit.Val[time.Time] `db:"created" `
ID omit.Val[int32] `db:"id,pk" `
Type omit.Val[enums.CommsMailertype] `db:"type_" `
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 {
AddressID psql.WhereMod[Q, int32]
Created psql.WhereMod[Q, time.Time]
ID psql.WhereMod[Q, int32]
Type psql.WhereMod[Q, enums.CommsMailertype]
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]{
AddressID: psql.Where[Q, int32](cols.AddressID),
Created: psql.Where[Q, time.Time](cols.Created),
ID: psql.Where[Q, int32](cols.ID),
Type: psql.Where[Q, enums.CommsMailertype](cols.Type),
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
},
},
}
}

View file

@ -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.
@ -48,6 +52,7 @@ type ComplianceReportRequestsQuery = *psql.ViewQuery[*ComplianceReportRequest, C
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
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
},
},

View file

@ -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
},
},
}
}

View file

@ -236,7 +236,7 @@
</div>
<img class="hdr-photo-img" src="{{ .PoolImageURL }}" alt="Pool photo" />
</div>
<div class="hdr-docid">id {{ .DocumentID }}</div>
<div class="hdr-docid">ID {{ .DocumentID }}</div>
</div>
<div class="left-panel">
@ -327,7 +327,7 @@
alt="Foto de la piscina"
/>
</div>
<div class="hdr-docid">id {{ .DocumentID }}</div>
<div class="hdr-docid">ID {{ .DocumentID }}</div>
</div>
<div class="left-panel">

View file

@ -12,6 +12,7 @@ import (
"github.com/Gleipnir-Technology/nidus-sync/html"
"github.com/Gleipnir-Technology/nidus-sync/platform/pdf"
"github.com/go-chi/chi/v5"
"github.com/google/uuid"
)
type contentMailer struct {
@ -68,9 +69,10 @@ func getMailerPreview(w http.ResponseWriter, r *http.Request) {
http.Error(w, "no comp", http.StatusInternalServerError)
return
}
doc_id := uuid.New()
html.RenderOrError(w, "sync/mailer.html", contentMailer{
Config: newContentConfig(),
DocumentID: "00000000-0000-0000-0000-000000000000",
DocumentID: doc_id.String(),
LogoURL: config.MakeURLNidus("/api/district/%s/logo", org.Slug.GetOr("unset")),
Organization: org,
PoolImageURL: config.MakeURLNidus("/api/compliance-request/image/pool/%s", code),