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 {
Created column
ID column
Type column
AddressID column
Created column
ID column
Recipient column
UUID column
}
func (c commsMailerColumns) AsSlice() []column {
return []column{
c.Created, c.ID, c.Type,
c.AddressID, c.Created, c.ID, c.Recipient, c.UUID,
}
}
@ -93,10 +124,14 @@ func (i commsMailerIndexes) AsSlice() []index {
}
}
type commsMailerForeignKeys struct{}
type commsMailerForeignKeys struct {
CommsMailerMailerAddressIDFkey foreignKey
}
func (f commsMailerForeignKeys) AsSlice() []foreignKey {
return []foreignKey{}
return []foreignKey{
f.CommsMailerMailerAddressIDFkey,
}
}
type commsMailerUniques struct{}

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

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")
@ -84,7 +85,9 @@ var (
commsEmailTemplateRelTemplateEmailLogsCtx = newContextual[bool]("comms.email_log.comms.email_template.comms.email_log.email_log_template_id_fkey")
// Relationship Contexts for comms.mailer
commsMailerWithParentsCascadingCtx = newContextual[bool]("commsMailerWithParentsCascading")
commsMailerWithParentsCascadingCtx = newContextual[bool]("commsMailerWithParentsCascading")
commsMailerRelAddressCtx = newContextual[bool]("address.comms.mailer.comms.mailer.mailer_address_id_fkey")
commsMailerRelComplianceReportRequestsCtx = newContextual[bool]("comms.mailer.compliance_report_request.compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey")
// Relationship Contexts for comms.phone
commsPhoneWithParentsCascadingCtx = newContextual[bool]("commsPhoneWithParentsCascading")
@ -112,6 +115,12 @@ var (
complianceReportRequestWithParentsCascadingCtx = newContextual[bool]("complianceReportRequestWithParentsCascading")
complianceReportRequestRelCreatorUserCtx = newContextual[bool]("compliance_report_request.user_.compliance_report_request.compliance_report_request_creator_fkey")
complianceReportRequestRelSiteCtx = newContextual[bool]("compliance_report_request.site.compliance_report_request.compliance_report_request_site_id_site_version_fkey")
complianceReportRequestRelMailersCtx = newContextual[bool]("comms.mailer.compliance_report_request.compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey")
// Relationship Contexts for compliance_report_request_mailer
complianceReportRequestMailerWithParentsCascadingCtx = newContextual[bool]("complianceReportRequestMailerWithParentsCascading")
complianceReportRequestMailerRelComplianceReportRequestCtx = newContextual[bool]("compliance_report_request.compliance_report_request_mailer.compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkey")
complianceReportRequestMailerRelMailerCtx = newContextual[bool]("comms.mailer.compliance_report_request_mailer.compliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey")
// Relationship Contexts for district_subscription_email
districtSubscriptionEmailWithParentsCascadingCtx = newContextual[bool]("districtSubscriptionEmailWithParentsCascading")

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 {
Created func() time.Time
ID func() int32
Type func() enums.CommsMailertype
AddressID func() int32
Created func() time.Time
ID func() int32
Recipient func() string
UUID func() uuid.UUID
r commsMailerR
f *Factory
alreadyPersisted bool
}
type commsMailerR struct {
Address *commsMailerRAddressR
ComplianceReportRequests []*commsMailerRComplianceReportRequestsR
}
type commsMailerRAddressR struct {
o *AddressTemplate
}
type commsMailerRComplianceReportRequestsR struct {
number int
o *ComplianceReportRequestTemplate
}
// Apply mods to the CommsMailerTemplate
func (o *CommsMailerTemplate) Apply(ctx context.Context, mods ...CommsMailerMod) {
for _, mod := range mods {
@ -54,13 +70,36 @@ func (o *CommsMailerTemplate) Apply(ctx context.Context, mods ...CommsMailerMod)
// setModelRels creates and sets the relationships on *models.CommsMailer
// according to the relationships in the template. Nothing is inserted into the db
func (t CommsMailerTemplate) setModelRels(o *models.CommsMailer) {}
func (t CommsMailerTemplate) setModelRels(o *models.CommsMailer) {
if t.r.Address != nil {
rel := t.r.Address.o.Build()
rel.R.Mailers = append(rel.R.Mailers, o)
o.AddressID = rel.ID // h2
o.R.Address = rel
}
if t.r.ComplianceReportRequests != nil {
rel := models.ComplianceReportRequestSlice{}
for _, r := range t.r.ComplianceReportRequests {
related := r.o.BuildMany(r.number)
for _, rel := range related {
rel.R.Mailers = append(rel.R.Mailers, o)
}
rel = append(rel, related...)
}
o.R.ComplianceReportRequests = rel
}
}
// BuildSetter returns an *models.CommsMailerSetter
// this does nothing with the relationship templates
func (o CommsMailerTemplate) BuildSetter() *models.CommsMailerSetter {
m := &models.CommsMailerSetter{}
if o.AddressID != nil {
val := o.AddressID()
m.AddressID = omit.From(val)
}
if o.Created != nil {
val := o.Created()
m.Created = omit.From(val)
@ -69,9 +108,13 @@ func (o CommsMailerTemplate) BuildSetter() *models.CommsMailerSetter {
val := o.ID()
m.ID = omit.From(val)
}
if o.Type != nil {
val := o.Type()
m.Type = omit.From(val)
if o.Recipient != nil {
val := o.Recipient()
m.Recipient = omit.From(val)
}
if o.UUID != nil {
val := o.UUID()
m.UUID = omit.From(val)
}
return m
@ -95,14 +138,20 @@ func (o CommsMailerTemplate) BuildManySetter(number int) []*models.CommsMailerSe
func (o CommsMailerTemplate) Build() *models.CommsMailer {
m := &models.CommsMailer{}
if o.AddressID != nil {
m.AddressID = o.AddressID()
}
if o.Created != nil {
m.Created = o.Created()
}
if o.ID != nil {
m.ID = o.ID()
}
if o.Type != nil {
m.Type = o.Type()
if o.Recipient != nil {
m.Recipient = o.Recipient()
}
if o.UUID != nil {
m.UUID = o.UUID()
}
o.setModelRels(m)
@ -124,13 +173,21 @@ func (o CommsMailerTemplate) BuildMany(number int) models.CommsMailerSlice {
}
func ensureCreatableCommsMailer(m *models.CommsMailerSetter) {
if !(m.AddressID.IsValue()) {
val := random_int32(nil)
m.AddressID = omit.From(val)
}
if !(m.Created.IsValue()) {
val := random_time_Time(nil)
m.Created = omit.From(val)
}
if !(m.Type.IsValue()) {
val := random_enums_CommsMailertype(nil)
m.Type = omit.From(val)
if !(m.Recipient.IsValue()) {
val := random_string(nil)
m.Recipient = omit.From(val)
}
if !(m.UUID.IsValue()) {
val := random_uuid_UUID(nil)
m.UUID = omit.From(val)
}
}
@ -150,11 +207,30 @@ func (o *CommsMailerTemplate) Create(ctx context.Context, exec bob.Executor) (*m
opt := o.BuildSetter()
ensureCreatableCommsMailer(opt)
if o.r.Address == nil {
CommsMailerMods.WithNewAddress().Apply(ctx, o)
}
var rel0 *models.Address
if o.r.Address.o.alreadyPersisted {
rel0 = o.r.Address.o.Build()
} else {
rel0, err = o.r.Address.o.Create(ctx, exec)
if err != nil {
return nil, err
}
}
opt.AddressID = omit.From(rel0.ID)
m, err := models.CommsMailers.Insert(opt).One(ctx, exec)
if err != nil {
return nil, err
}
m.R.Address = rel0
if err := o.insertOptRels(ctx, exec, m); err != nil {
return nil, err
}
@ -232,12 +308,45 @@ type commsMailerMods struct{}
func (m commsMailerMods) RandomizeAllColumns(f *faker.Faker) CommsMailerMod {
return CommsMailerModSlice{
CommsMailerMods.RandomAddressID(f),
CommsMailerMods.RandomCreated(f),
CommsMailerMods.RandomID(f),
CommsMailerMods.RandomType(f),
CommsMailerMods.RandomRecipient(f),
CommsMailerMods.RandomUUID(f),
}
}
// Set the model columns to this value
func (m commsMailerMods) AddressID(val int32) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.AddressID = func() int32 { return val }
})
}
// Set the Column from the function
func (m commsMailerMods) AddressIDFunc(f func() int32) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.AddressID = f
})
}
// Clear any values for the column
func (m commsMailerMods) UnsetAddressID() CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.AddressID = nil
})
}
// Generates a random value for the column using the given faker
// if faker is nil, a default faker is used
func (m commsMailerMods) RandomAddressID(f *faker.Faker) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.AddressID = func() int32 {
return random_int32(f)
}
})
}
// Set the model columns to this value
func (m commsMailerMods) Created(val time.Time) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
@ -301,32 +410,63 @@ func (m commsMailerMods) RandomID(f *faker.Faker) CommsMailerMod {
}
// Set the model columns to this value
func (m commsMailerMods) Type(val enums.CommsMailertype) CommsMailerMod {
func (m commsMailerMods) Recipient(val string) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.Type = func() enums.CommsMailertype { return val }
o.Recipient = func() string { return val }
})
}
// Set the Column from the function
func (m commsMailerMods) TypeFunc(f func() enums.CommsMailertype) CommsMailerMod {
func (m commsMailerMods) RecipientFunc(f func() string) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.Type = f
o.Recipient = f
})
}
// Clear any values for the column
func (m commsMailerMods) UnsetType() CommsMailerMod {
func (m commsMailerMods) UnsetRecipient() CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.Type = nil
o.Recipient = nil
})
}
// Generates a random value for the column using the given faker
// if faker is nil, a default faker is used
func (m commsMailerMods) RandomType(f *faker.Faker) CommsMailerMod {
func (m commsMailerMods) RandomRecipient(f *faker.Faker) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.Type = func() enums.CommsMailertype {
return random_enums_CommsMailertype(f)
o.Recipient = func() string {
return random_string(f)
}
})
}
// Set the model columns to this value
func (m commsMailerMods) UUID(val uuid.UUID) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.UUID = func() uuid.UUID { return val }
})
}
// Set the Column from the function
func (m commsMailerMods) UUIDFunc(f func() uuid.UUID) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.UUID = f
})
}
// Clear any values for the column
func (m commsMailerMods) UnsetUUID() CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.UUID = nil
})
}
// Generates a random value for the column using the given faker
// if faker is nil, a default faker is used
func (m commsMailerMods) RandomUUID(f *faker.Faker) CommsMailerMod {
return CommsMailerModFunc(func(_ context.Context, o *CommsMailerTemplate) {
o.UUID = func() uuid.UUID {
return random_uuid_UUID(f)
}
})
}
@ -337,5 +477,88 @@ func (m commsMailerMods) WithParentsCascading() CommsMailerMod {
return
}
ctx = commsMailerWithParentsCascadingCtx.WithValue(ctx, true)
{
related := o.f.NewAddressWithContext(ctx, AddressMods.WithParentsCascading())
m.WithAddress(related).Apply(ctx, o)
}
})
}
func (m commsMailerMods) WithAddress(rel *AddressTemplate) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
o.r.Address = &commsMailerRAddressR{
o: rel,
}
})
}
func (m commsMailerMods) WithNewAddress(mods ...AddressMod) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
related := o.f.NewAddressWithContext(ctx, mods...)
m.WithAddress(related).Apply(ctx, o)
})
}
func (m commsMailerMods) WithExistingAddress(em *models.Address) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
o.r.Address = &commsMailerRAddressR{
o: o.f.FromExistingAddress(em),
}
})
}
func (m commsMailerMods) WithoutAddress() CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
o.r.Address = nil
})
}
func (m commsMailerMods) WithComplianceReportRequests(number int, related *ComplianceReportRequestTemplate) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
o.r.ComplianceReportRequests = []*commsMailerRComplianceReportRequestsR{{
number: number,
o: related,
}}
})
}
func (m commsMailerMods) WithNewComplianceReportRequests(number int, mods ...ComplianceReportRequestMod) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
related := o.f.NewComplianceReportRequestWithContext(ctx, mods...)
m.WithComplianceReportRequests(number, related).Apply(ctx, o)
})
}
func (m commsMailerMods) AddComplianceReportRequests(number int, related *ComplianceReportRequestTemplate) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
o.r.ComplianceReportRequests = append(o.r.ComplianceReportRequests, &commsMailerRComplianceReportRequestsR{
number: number,
o: related,
})
})
}
func (m commsMailerMods) AddNewComplianceReportRequests(number int, mods ...ComplianceReportRequestMod) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
related := o.f.NewComplianceReportRequestWithContext(ctx, mods...)
m.AddComplianceReportRequests(number, related).Apply(ctx, o)
})
}
func (m commsMailerMods) AddExistingComplianceReportRequests(existingModels ...*models.ComplianceReportRequest) CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
for _, em := range existingModels {
o.r.ComplianceReportRequests = append(o.r.ComplianceReportRequests, &commsMailerRComplianceReportRequestsR{
o: o.f.FromExistingComplianceReportRequest(em),
})
}
})
}
func (m commsMailerMods) WithoutComplianceReportRequests() CommsMailerMod {
return CommsMailerModFunc(func(ctx context.Context, o *CommsMailerTemplate) {
o.r.ComplianceReportRequests = nil
})
}

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,8 +53,9 @@ type AddressesQuery = *psql.ViewQuery[*Address, AddressSlice]
// addressR is where relationships are stored.
type addressR struct {
Residents ResidentSlice // resident.resident_address_id_fkey
Site *Site // site.site_address_id_fkey
Mailers CommsMailerSlice // comms.mailer.mailer_address_id_fkey
Residents ResidentSlice // resident.resident_address_id_fkey
Site *Site // site.site_address_id_fkey
}
func buildAddressColumns(alias string) addressColumns {
@ -557,6 +558,30 @@ func (o AddressSlice) ReloadAll(ctx context.Context, exec bob.Executor) error {
return nil
}
// Mailers starts a query for related objects on comms.mailer
func (o *Address) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
return CommsMailers.Query(append(mods,
sm.Where(CommsMailers.Columns.AddressID.EQ(psql.Arg(o.ID))),
)...)
}
func (os AddressSlice) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
pkID := make(pgtypes.Array[int32], 0, len(os))
for _, o := range os {
if o == nil {
continue
}
pkID = append(pkID, o.ID)
}
PKArgExpr := psql.Select(sm.Columns(
psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")),
))
return CommsMailers.Query(append(mods,
sm.Where(psql.Group(CommsMailers.Columns.AddressID).OP("IN", PKArgExpr)),
)...)
}
// Residents starts a query for related objects on resident
func (o *Address) Residents(mods ...bob.Mod[*dialect.SelectQuery]) ResidentsQuery {
return Residents.Query(append(mods,
@ -605,6 +630,74 @@ func (os AddressSlice) Site(mods ...bob.Mod[*dialect.SelectQuery]) SitesQuery {
)...)
}
func insertAddressMailers0(ctx context.Context, exec bob.Executor, commsMailers1 []*CommsMailerSetter, address0 *Address) (CommsMailerSlice, error) {
for i := range commsMailers1 {
commsMailers1[i].AddressID = omit.From(address0.ID)
}
ret, err := CommsMailers.Insert(bob.ToMods(commsMailers1...)).All(ctx, exec)
if err != nil {
return ret, fmt.Errorf("insertAddressMailers0: %w", err)
}
return ret, nil
}
func attachAddressMailers0(ctx context.Context, exec bob.Executor, count int, commsMailers1 CommsMailerSlice, address0 *Address) (CommsMailerSlice, error) {
setter := &CommsMailerSetter{
AddressID: omit.From(address0.ID),
}
err := commsMailers1.UpdateAll(ctx, exec, *setter)
if err != nil {
return nil, fmt.Errorf("attachAddressMailers0: %w", err)
}
return commsMailers1, nil
}
func (address0 *Address) InsertMailers(ctx context.Context, exec bob.Executor, related ...*CommsMailerSetter) error {
if len(related) == 0 {
return nil
}
var err error
commsMailers1, err := insertAddressMailers0(ctx, exec, related, address0)
if err != nil {
return err
}
address0.R.Mailers = append(address0.R.Mailers, commsMailers1...)
for _, rel := range commsMailers1 {
rel.R.Address = address0
}
return nil
}
func (address0 *Address) AttachMailers(ctx context.Context, exec bob.Executor, related ...*CommsMailer) error {
if len(related) == 0 {
return nil
}
var err error
commsMailers1 := CommsMailerSlice(related)
_, err = attachAddressMailers0(ctx, exec, len(related), commsMailers1, address0)
if err != nil {
return err
}
address0.R.Mailers = append(address0.R.Mailers, commsMailers1...)
for _, rel := range related {
rel.R.Address = address0
}
return nil
}
func insertAddressResidents0(ctx context.Context, exec bob.Executor, residents1 []*ResidentSetter, address0 *Address) (ResidentSlice, error) {
for i := range residents1 {
residents1[i].AddressID = omit.From(address0.ID)
@ -765,6 +858,20 @@ func (o *Address) Preload(name string, retrieved any) error {
}
switch name {
case "Mailers":
rels, ok := retrieved.(CommsMailerSlice)
if !ok {
return fmt.Errorf("address cannot load %T as %q", retrieved, name)
}
o.R.Mailers = rels
for _, rel := range rels {
if rel != nil {
rel.R.Address = o
}
}
return nil
case "Residents":
rels, ok := retrieved.(ResidentSlice)
if !ok {
@ -819,11 +926,15 @@ func buildAddressPreloader() addressPreloader {
}
type addressThenLoader[Q orm.Loadable] struct {
Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Residents func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Site func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildAddressThenLoader[Q orm.Loadable]() addressThenLoader[Q] {
type MailersLoadInterface interface {
LoadMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
type ResidentsLoadInterface interface {
LoadResidents(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
@ -832,6 +943,12 @@ func buildAddressThenLoader[Q orm.Loadable]() addressThenLoader[Q] {
}
return addressThenLoader[Q]{
Mailers: thenLoadBuilder[Q](
"Mailers",
func(ctx context.Context, exec bob.Executor, retrieved MailersLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
return retrieved.LoadMailers(ctx, exec, mods...)
},
),
Residents: thenLoadBuilder[Q](
"Residents",
func(ctx context.Context, exec bob.Executor, retrieved ResidentsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
@ -847,6 +964,67 @@ func buildAddressThenLoader[Q orm.Loadable]() addressThenLoader[Q] {
}
}
// LoadMailers loads the address's Mailers into the .R struct
func (o *Address) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
return nil
}
// Reset the relationship
o.R.Mailers = nil
related, err := o.Mailers(mods...).All(ctx, exec)
if err != nil {
return err
}
for _, rel := range related {
rel.R.Address = o
}
o.R.Mailers = related
return nil
}
// LoadMailers loads the address's Mailers into the .R struct
func (os AddressSlice) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if len(os) == 0 {
return nil
}
commsMailers, err := os.Mailers(mods...).All(ctx, exec)
if err != nil {
return err
}
for _, o := range os {
if o == nil {
continue
}
o.R.Mailers = nil
}
for _, o := range os {
if o == nil {
continue
}
for _, rel := range commsMailers {
if !(o.ID == rel.AddressID) {
continue
}
rel.R.Address = o
o.R.Mailers = append(o.R.Mailers, rel)
}
}
return nil
}
// LoadResidents loads the address's Residents into the .R struct
func (o *Address) LoadResidents(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
@ -962,6 +1140,7 @@ func (os AddressSlice) LoadSite(ctx context.Context, exec bob.Executor, mods ...
// addressC is where relationship counts are stored.
type addressC struct {
Mailers *int64
Residents *int64
}
@ -972,6 +1151,8 @@ func (o *Address) PreloadCount(name string, count int64) error {
}
switch name {
case "Mailers":
o.C.Mailers = &count
case "Residents":
o.C.Residents = &count
}
@ -979,11 +1160,29 @@ func (o *Address) PreloadCount(name string, count int64) error {
}
type addressCountPreloader struct {
Mailers func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
Residents func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
}
func buildAddressCountPreloader() addressCountPreloader {
return addressCountPreloader{
Mailers: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
return countPreloader[*Address]("Mailers", func(parent string) bob.Expression {
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
if parent == "" {
parent = Addresses.Alias()
}
subqueryMods := []bob.Mod[*dialect.SelectQuery]{
sm.Columns(psql.Raw("count(*)")),
sm.From(CommsMailers.Name()),
sm.Where(psql.Quote(CommsMailers.Alias(), "address_id").EQ(psql.Quote(parent, "id"))),
}
subqueryMods = append(subqueryMods, mods...)
return psql.Group(psql.Select(subqueryMods...).Expression)
})
},
Residents: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
return countPreloader[*Address]("Residents", func(parent string) bob.Expression {
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
@ -1005,15 +1204,25 @@ func buildAddressCountPreloader() addressCountPreloader {
}
type addressCountThenLoader[Q orm.Loadable] struct {
Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Residents func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildAddressCountThenLoader[Q orm.Loadable]() addressCountThenLoader[Q] {
type MailersCountInterface interface {
LoadCountMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
type ResidentsCountInterface interface {
LoadCountResidents(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
return addressCountThenLoader[Q]{
Mailers: countThenLoadBuilder[Q](
"Mailers",
func(ctx context.Context, exec bob.Executor, retrieved MailersCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
return retrieved.LoadCountMailers(ctx, exec, mods...)
},
),
Residents: countThenLoadBuilder[Q](
"Residents",
func(ctx context.Context, exec bob.Executor, retrieved ResidentsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
@ -1023,6 +1232,36 @@ func buildAddressCountThenLoader[Q orm.Loadable]() addressCountThenLoader[Q] {
}
}
// LoadCountMailers loads the count of Mailers into the C struct
func (o *Address) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
return nil
}
count, err := o.Mailers(mods...).Count(ctx, exec)
if err != nil {
return err
}
o.C.Mailers = &count
return nil
}
// LoadCountMailers loads the count of Mailers for a slice
func (os AddressSlice) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if len(os) == 0 {
return nil
}
for _, o := range os {
if err := o.LoadCountMailers(ctx, exec, mods...); err != nil {
return err
}
}
return nil
}
// LoadCountResidents loads the count of Residents into the C struct
func (o *Address) LoadCountResidents(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
@ -1055,6 +1294,7 @@ func (os AddressSlice) LoadCountResidents(ctx context.Context, exec bob.Executor
type addressJoins[Q dialect.Joinable] struct {
typ string
Mailers modAs[Q, commsMailerColumns]
Residents modAs[Q, residentColumns]
Site modAs[Q, siteColumns]
}
@ -1066,6 +1306,20 @@ func (j addressJoins[Q]) aliasedAs(alias string) addressJoins[Q] {
func buildAddressJoins[Q dialect.Joinable](cols addressColumns, typ string) addressJoins[Q] {
return addressJoins[Q]{
typ: typ,
Mailers: modAs[Q, commsMailerColumns]{
c: CommsMailers.Columns,
f: func(to commsMailerColumns) bob.Mod[Q] {
mods := make(mods.QueryMods[Q], 0, 1)
{
mods = append(mods, dialect.Join[Q](typ, CommsMailers.Name().As(to.Alias())).On(
to.AddressID.EQ(cols.ID),
))
}
return mods
},
},
Residents: modAs[Q, residentColumns]{
c: Residents.Columns,
f: func(to residentColumns) bob.Mod[Q] {

View file

@ -21,102 +21,110 @@ var (
)
type preloadCounts struct {
Address addressCountPreloader
ArcgisAccount arcgisAccountCountPreloader
ArcgisLayer arcgisLayerCountPreloader
ArcgisLayerField arcgisLayerFieldCountPreloader
ArcgisServiceFeature arcgisServiceFeatureCountPreloader
ArcgisUser arcgisuserCountPreloader
CommsEmailContact commsEmailContactCountPreloader
CommsEmailTemplate commsEmailTemplateCountPreloader
CommsPhone commsPhoneCountPreloader
FileuploadCSV fileuploadCSVCountPreloader
FileuploadFile fileuploadFileCountPreloader
NoteAudio noteAudioCountPreloader
NoteImage noteImageCountPreloader
Organization organizationCountPreloader
Parcel parcelCountPreloader
PublicreportImage publicreportImageCountPreloader
PublicreportNuisance publicreportNuisanceCountPreloader
PublicreportPool publicreportPoolCountPreloader
PublicreportQuick publicreportQuickCountPreloader
Site siteCountPreloader
User userCountPreloader
Address addressCountPreloader
ArcgisAccount arcgisAccountCountPreloader
ArcgisLayer arcgisLayerCountPreloader
ArcgisLayerField arcgisLayerFieldCountPreloader
ArcgisServiceFeature arcgisServiceFeatureCountPreloader
ArcgisUser arcgisuserCountPreloader
CommsEmailContact commsEmailContactCountPreloader
CommsEmailTemplate commsEmailTemplateCountPreloader
CommsMailer commsMailerCountPreloader
CommsPhone commsPhoneCountPreloader
ComplianceReportRequest complianceReportRequestCountPreloader
FileuploadCSV fileuploadCSVCountPreloader
FileuploadFile fileuploadFileCountPreloader
NoteAudio noteAudioCountPreloader
NoteImage noteImageCountPreloader
Organization organizationCountPreloader
Parcel parcelCountPreloader
PublicreportImage publicreportImageCountPreloader
PublicreportNuisance publicreportNuisanceCountPreloader
PublicreportPool publicreportPoolCountPreloader
PublicreportQuick publicreportQuickCountPreloader
Site siteCountPreloader
User userCountPreloader
}
func getPreloadCount() preloadCounts {
return preloadCounts{
Address: buildAddressCountPreloader(),
ArcgisAccount: buildArcgisAccountCountPreloader(),
ArcgisLayer: buildArcgisLayerCountPreloader(),
ArcgisLayerField: buildArcgisLayerFieldCountPreloader(),
ArcgisServiceFeature: buildArcgisServiceFeatureCountPreloader(),
ArcgisUser: buildArcgisUserCountPreloader(),
CommsEmailContact: buildCommsEmailContactCountPreloader(),
CommsEmailTemplate: buildCommsEmailTemplateCountPreloader(),
CommsPhone: buildCommsPhoneCountPreloader(),
FileuploadCSV: buildFileuploadCSVCountPreloader(),
FileuploadFile: buildFileuploadFileCountPreloader(),
NoteAudio: buildNoteAudioCountPreloader(),
NoteImage: buildNoteImageCountPreloader(),
Organization: buildOrganizationCountPreloader(),
Parcel: buildParcelCountPreloader(),
PublicreportImage: buildPublicreportImageCountPreloader(),
PublicreportNuisance: buildPublicreportNuisanceCountPreloader(),
PublicreportPool: buildPublicreportPoolCountPreloader(),
PublicreportQuick: buildPublicreportQuickCountPreloader(),
Site: buildSiteCountPreloader(),
User: buildUserCountPreloader(),
Address: buildAddressCountPreloader(),
ArcgisAccount: buildArcgisAccountCountPreloader(),
ArcgisLayer: buildArcgisLayerCountPreloader(),
ArcgisLayerField: buildArcgisLayerFieldCountPreloader(),
ArcgisServiceFeature: buildArcgisServiceFeatureCountPreloader(),
ArcgisUser: buildArcgisUserCountPreloader(),
CommsEmailContact: buildCommsEmailContactCountPreloader(),
CommsEmailTemplate: buildCommsEmailTemplateCountPreloader(),
CommsMailer: buildCommsMailerCountPreloader(),
CommsPhone: buildCommsPhoneCountPreloader(),
ComplianceReportRequest: buildComplianceReportRequestCountPreloader(),
FileuploadCSV: buildFileuploadCSVCountPreloader(),
FileuploadFile: buildFileuploadFileCountPreloader(),
NoteAudio: buildNoteAudioCountPreloader(),
NoteImage: buildNoteImageCountPreloader(),
Organization: buildOrganizationCountPreloader(),
Parcel: buildParcelCountPreloader(),
PublicreportImage: buildPublicreportImageCountPreloader(),
PublicreportNuisance: buildPublicreportNuisanceCountPreloader(),
PublicreportPool: buildPublicreportPoolCountPreloader(),
PublicreportQuick: buildPublicreportQuickCountPreloader(),
Site: buildSiteCountPreloader(),
User: buildUserCountPreloader(),
}
}
type thenLoadCounts[Q orm.Loadable] struct {
Address addressCountThenLoader[Q]
ArcgisAccount arcgisAccountCountThenLoader[Q]
ArcgisLayer arcgisLayerCountThenLoader[Q]
ArcgisLayerField arcgisLayerFieldCountThenLoader[Q]
ArcgisServiceFeature arcgisServiceFeatureCountThenLoader[Q]
ArcgisUser arcgisuserCountThenLoader[Q]
CommsEmailContact commsEmailContactCountThenLoader[Q]
CommsEmailTemplate commsEmailTemplateCountThenLoader[Q]
CommsPhone commsPhoneCountThenLoader[Q]
FileuploadCSV fileuploadCSVCountThenLoader[Q]
FileuploadFile fileuploadFileCountThenLoader[Q]
NoteAudio noteAudioCountThenLoader[Q]
NoteImage noteImageCountThenLoader[Q]
Organization organizationCountThenLoader[Q]
Parcel parcelCountThenLoader[Q]
PublicreportImage publicreportImageCountThenLoader[Q]
PublicreportNuisance publicreportNuisanceCountThenLoader[Q]
PublicreportPool publicreportPoolCountThenLoader[Q]
PublicreportQuick publicreportQuickCountThenLoader[Q]
Site siteCountThenLoader[Q]
User userCountThenLoader[Q]
Address addressCountThenLoader[Q]
ArcgisAccount arcgisAccountCountThenLoader[Q]
ArcgisLayer arcgisLayerCountThenLoader[Q]
ArcgisLayerField arcgisLayerFieldCountThenLoader[Q]
ArcgisServiceFeature arcgisServiceFeatureCountThenLoader[Q]
ArcgisUser arcgisuserCountThenLoader[Q]
CommsEmailContact commsEmailContactCountThenLoader[Q]
CommsEmailTemplate commsEmailTemplateCountThenLoader[Q]
CommsMailer commsMailerCountThenLoader[Q]
CommsPhone commsPhoneCountThenLoader[Q]
ComplianceReportRequest complianceReportRequestCountThenLoader[Q]
FileuploadCSV fileuploadCSVCountThenLoader[Q]
FileuploadFile fileuploadFileCountThenLoader[Q]
NoteAudio noteAudioCountThenLoader[Q]
NoteImage noteImageCountThenLoader[Q]
Organization organizationCountThenLoader[Q]
Parcel parcelCountThenLoader[Q]
PublicreportImage publicreportImageCountThenLoader[Q]
PublicreportNuisance publicreportNuisanceCountThenLoader[Q]
PublicreportPool publicreportPoolCountThenLoader[Q]
PublicreportQuick publicreportQuickCountThenLoader[Q]
Site siteCountThenLoader[Q]
User userCountThenLoader[Q]
}
func getThenLoadCount[Q orm.Loadable]() thenLoadCounts[Q] {
return thenLoadCounts[Q]{
Address: buildAddressCountThenLoader[Q](),
ArcgisAccount: buildArcgisAccountCountThenLoader[Q](),
ArcgisLayer: buildArcgisLayerCountThenLoader[Q](),
ArcgisLayerField: buildArcgisLayerFieldCountThenLoader[Q](),
ArcgisServiceFeature: buildArcgisServiceFeatureCountThenLoader[Q](),
ArcgisUser: buildArcgisUserCountThenLoader[Q](),
CommsEmailContact: buildCommsEmailContactCountThenLoader[Q](),
CommsEmailTemplate: buildCommsEmailTemplateCountThenLoader[Q](),
CommsPhone: buildCommsPhoneCountThenLoader[Q](),
FileuploadCSV: buildFileuploadCSVCountThenLoader[Q](),
FileuploadFile: buildFileuploadFileCountThenLoader[Q](),
NoteAudio: buildNoteAudioCountThenLoader[Q](),
NoteImage: buildNoteImageCountThenLoader[Q](),
Organization: buildOrganizationCountThenLoader[Q](),
Parcel: buildParcelCountThenLoader[Q](),
PublicreportImage: buildPublicreportImageCountThenLoader[Q](),
PublicreportNuisance: buildPublicreportNuisanceCountThenLoader[Q](),
PublicreportPool: buildPublicreportPoolCountThenLoader[Q](),
PublicreportQuick: buildPublicreportQuickCountThenLoader[Q](),
Site: buildSiteCountThenLoader[Q](),
User: buildUserCountThenLoader[Q](),
Address: buildAddressCountThenLoader[Q](),
ArcgisAccount: buildArcgisAccountCountThenLoader[Q](),
ArcgisLayer: buildArcgisLayerCountThenLoader[Q](),
ArcgisLayerField: buildArcgisLayerFieldCountThenLoader[Q](),
ArcgisServiceFeature: buildArcgisServiceFeatureCountThenLoader[Q](),
ArcgisUser: buildArcgisUserCountThenLoader[Q](),
CommsEmailContact: buildCommsEmailContactCountThenLoader[Q](),
CommsEmailTemplate: buildCommsEmailTemplateCountThenLoader[Q](),
CommsMailer: buildCommsMailerCountThenLoader[Q](),
CommsPhone: buildCommsPhoneCountThenLoader[Q](),
ComplianceReportRequest: buildComplianceReportRequestCountThenLoader[Q](),
FileuploadCSV: buildFileuploadCSVCountThenLoader[Q](),
FileuploadFile: buildFileuploadFileCountThenLoader[Q](),
NoteAudio: buildNoteAudioCountThenLoader[Q](),
NoteImage: buildNoteImageCountThenLoader[Q](),
Organization: buildOrganizationCountThenLoader[Q](),
Parcel: buildParcelCountThenLoader[Q](),
PublicreportImage: buildPublicreportImageCountThenLoader[Q](),
PublicreportNuisance: buildPublicreportNuisanceCountThenLoader[Q](),
PublicreportPool: buildPublicreportPoolCountThenLoader[Q](),
PublicreportQuick: buildPublicreportQuickCountThenLoader[Q](),
Site: buildSiteCountThenLoader[Q](),
User: buildUserCountThenLoader[Q](),
}
}

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 {
Created time.Time `db:"created" `
ID int32 `db:"id,pk" `
Type enums.CommsMailertype `db:"type_" `
AddressID int32 `db:"address_id" `
Created time.Time `db:"created" `
ID int32 `db:"id,pk" `
Recipient string `db:"recipient" `
UUID uuid.UUID `db:"uuid" `
R commsMailerR `db:"-" `
C commsMailerC `db:"-" `
}
// CommsMailerSlice is an alias for a slice of pointers to CommsMailer.
@ -36,24 +48,34 @@ var CommsMailers = psql.NewTablex[*CommsMailer, CommsMailerSlice, *CommsMailerSe
// CommsMailersQuery is a query on the mailer table
type CommsMailersQuery = *psql.ViewQuery[*CommsMailer, CommsMailerSlice]
// commsMailerR is where relationships are stored.
type commsMailerR struct {
Address *Address // comms.mailer.mailer_address_id_fkey
ComplianceReportRequests ComplianceReportRequestSlice // compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey
}
func buildCommsMailerColumns(alias string) commsMailerColumns {
return commsMailerColumns{
ColumnsExpr: expr.NewColumnsExpr(
"created", "id", "type_",
"address_id", "created", "id", "recipient", "uuid",
).WithParent("comms.mailer"),
tableAlias: alias,
AddressID: psql.Quote(alias, "address_id"),
Created: psql.Quote(alias, "created"),
ID: psql.Quote(alias, "id"),
Type: psql.Quote(alias, "type_"),
Recipient: psql.Quote(alias, "recipient"),
UUID: psql.Quote(alias, "uuid"),
}
}
type commsMailerColumns struct {
expr.ColumnsExpr
tableAlias string
AddressID psql.Expression
Created psql.Expression
ID psql.Expression
Type psql.Expression
Recipient psql.Expression
UUID psql.Expression
}
func (c commsMailerColumns) Alias() string {
@ -68,34 +90,48 @@ func (commsMailerColumns) AliasedAs(alias string) commsMailerColumns {
// All values are optional, and do not have to be set
// Generated columns are not included
type CommsMailerSetter struct {
Created omit.Val[time.Time] `db:"created" `
ID omit.Val[int32] `db:"id,pk" `
Type omit.Val[enums.CommsMailertype] `db:"type_" `
AddressID omit.Val[int32] `db:"address_id" `
Created omit.Val[time.Time] `db:"created" `
ID omit.Val[int32] `db:"id,pk" `
Recipient omit.Val[string] `db:"recipient" `
UUID omit.Val[uuid.UUID] `db:"uuid" `
}
func (s CommsMailerSetter) SetColumns() []string {
vals := make([]string, 0, 3)
vals := make([]string, 0, 5)
if s.AddressID.IsValue() {
vals = append(vals, "address_id")
}
if s.Created.IsValue() {
vals = append(vals, "created")
}
if s.ID.IsValue() {
vals = append(vals, "id")
}
if s.Type.IsValue() {
vals = append(vals, "type_")
if s.Recipient.IsValue() {
vals = append(vals, "recipient")
}
if s.UUID.IsValue() {
vals = append(vals, "uuid")
}
return vals
}
func (s CommsMailerSetter) Overwrite(t *CommsMailer) {
if s.AddressID.IsValue() {
t.AddressID = s.AddressID.MustGet()
}
if s.Created.IsValue() {
t.Created = s.Created.MustGet()
}
if s.ID.IsValue() {
t.ID = s.ID.MustGet()
}
if s.Type.IsValue() {
t.Type = s.Type.MustGet()
if s.Recipient.IsValue() {
t.Recipient = s.Recipient.MustGet()
}
if s.UUID.IsValue() {
t.UUID = s.UUID.MustGet()
}
}
@ -105,25 +141,37 @@ func (s *CommsMailerSetter) Apply(q *dialect.InsertQuery) {
})
q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) {
vals := make([]bob.Expression, 3)
if s.Created.IsValue() {
vals[0] = psql.Arg(s.Created.MustGet())
vals := make([]bob.Expression, 5)
if s.AddressID.IsValue() {
vals[0] = psql.Arg(s.AddressID.MustGet())
} else {
vals[0] = psql.Raw("DEFAULT")
}
if s.ID.IsValue() {
vals[1] = psql.Arg(s.ID.MustGet())
if s.Created.IsValue() {
vals[1] = psql.Arg(s.Created.MustGet())
} else {
vals[1] = psql.Raw("DEFAULT")
}
if s.Type.IsValue() {
vals[2] = psql.Arg(s.Type.MustGet())
if s.ID.IsValue() {
vals[2] = psql.Arg(s.ID.MustGet())
} else {
vals[2] = psql.Raw("DEFAULT")
}
if s.Recipient.IsValue() {
vals[3] = psql.Arg(s.Recipient.MustGet())
} else {
vals[3] = psql.Raw("DEFAULT")
}
if s.UUID.IsValue() {
vals[4] = psql.Arg(s.UUID.MustGet())
} else {
vals[4] = psql.Raw("DEFAULT")
}
return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "")
}))
}
@ -133,7 +181,14 @@ func (s CommsMailerSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] {
}
func (s CommsMailerSetter) Expressions(prefix ...string) []bob.Expression {
exprs := make([]bob.Expression, 0, 3)
exprs := make([]bob.Expression, 0, 5)
if s.AddressID.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "address_id")...),
psql.Arg(s.AddressID),
}})
}
if s.Created.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
@ -149,10 +204,17 @@ func (s CommsMailerSetter) Expressions(prefix ...string) []bob.Expression {
}})
}
if s.Type.IsValue() {
if s.Recipient.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "type_")...),
psql.Arg(s.Type),
psql.Quote(append(prefix, "recipient")...),
psql.Arg(s.Recipient),
}})
}
if s.UUID.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "uuid")...),
psql.Arg(s.UUID),
}})
}
@ -217,6 +279,7 @@ func (o *CommsMailer) Update(ctx context.Context, exec bob.Executor, s *CommsMai
return err
}
o.R = v.R
*o = *v
return nil
@ -236,7 +299,7 @@ func (o *CommsMailer) Reload(ctx context.Context, exec bob.Executor) error {
if err != nil {
return err
}
o2.R = o.R
*o = *o2
return nil
@ -283,7 +346,7 @@ func (o CommsMailerSlice) copyMatchingRows(from ...*CommsMailer) {
if new.ID != old.ID {
continue
}
new.R = old.R
o[i] = new
break
}
@ -381,10 +444,113 @@ func (o CommsMailerSlice) ReloadAll(ctx context.Context, exec bob.Executor) erro
return nil
}
// Address starts a query for related objects on address
func (o *CommsMailer) Address(mods ...bob.Mod[*dialect.SelectQuery]) AddressesQuery {
return Addresses.Query(append(mods,
sm.Where(Addresses.Columns.ID.EQ(psql.Arg(o.AddressID))),
)...)
}
func (os CommsMailerSlice) Address(mods ...bob.Mod[*dialect.SelectQuery]) AddressesQuery {
pkAddressID := make(pgtypes.Array[int32], 0, len(os))
for _, o := range os {
if o == nil {
continue
}
pkAddressID = append(pkAddressID, o.AddressID)
}
PKArgExpr := psql.Select(sm.Columns(
psql.F("unnest", psql.Cast(psql.Arg(pkAddressID), "integer[]")),
))
return Addresses.Query(append(mods,
sm.Where(psql.Group(Addresses.Columns.ID).OP("IN", PKArgExpr)),
)...)
}
// ComplianceReportRequests starts a query for related objects on compliance_report_request
func (o *CommsMailer) ComplianceReportRequests(mods ...bob.Mod[*dialect.SelectQuery]) ComplianceReportRequestsQuery {
return ComplianceReportRequests.Query(append(mods,
sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
ComplianceReportRequests.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID)),
sm.Where(ComplianceReportRequestMailers.Columns.MailerID.EQ(psql.Arg(o.ID))),
)...)
}
func (os CommsMailerSlice) ComplianceReportRequests(mods ...bob.Mod[*dialect.SelectQuery]) ComplianceReportRequestsQuery {
pkID := make(pgtypes.Array[int32], 0, len(os))
for _, o := range os {
if o == nil {
continue
}
pkID = append(pkID, o.ID)
}
PKArgExpr := psql.Select(sm.Columns(
psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")),
))
return ComplianceReportRequests.Query(append(mods,
sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
ComplianceReportRequests.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID),
),
sm.Where(psql.Group(ComplianceReportRequestMailers.Columns.MailerID).OP("IN", PKArgExpr)),
)...)
}
func attachCommsMailerAddress0(ctx context.Context, exec bob.Executor, count int, commsMailer0 *CommsMailer, address1 *Address) (*CommsMailer, error) {
setter := &CommsMailerSetter{
AddressID: omit.From(address1.ID),
}
err := commsMailer0.Update(ctx, exec, setter)
if err != nil {
return nil, fmt.Errorf("attachCommsMailerAddress0: %w", err)
}
return commsMailer0, nil
}
func (commsMailer0 *CommsMailer) InsertAddress(ctx context.Context, exec bob.Executor, related *AddressSetter) error {
var err error
address1, err := Addresses.Insert(related).One(ctx, exec)
if err != nil {
return fmt.Errorf("inserting related objects: %w", err)
}
_, err = attachCommsMailerAddress0(ctx, exec, 1, commsMailer0, address1)
if err != nil {
return err
}
commsMailer0.R.Address = address1
address1.R.Mailers = append(address1.R.Mailers, commsMailer0)
return nil
}
func (commsMailer0 *CommsMailer) AttachAddress(ctx context.Context, exec bob.Executor, address1 *Address) error {
var err error
_, err = attachCommsMailerAddress0(ctx, exec, 1, commsMailer0, address1)
if err != nil {
return err
}
commsMailer0.R.Address = address1
address1.R.Mailers = append(address1.R.Mailers, commsMailer0)
return nil
}
type commsMailerWhere[Q psql.Filterable] struct {
Created psql.WhereMod[Q, time.Time]
ID psql.WhereMod[Q, int32]
Type psql.WhereMod[Q, enums.CommsMailertype]
AddressID psql.WhereMod[Q, int32]
Created psql.WhereMod[Q, time.Time]
ID psql.WhereMod[Q, int32]
Recipient psql.WhereMod[Q, string]
UUID psql.WhereMod[Q, uuid.UUID]
}
func (commsMailerWhere[Q]) AliasedAs(alias string) commsMailerWhere[Q] {
@ -393,8 +559,379 @@ func (commsMailerWhere[Q]) AliasedAs(alias string) commsMailerWhere[Q] {
func buildCommsMailerWhere[Q psql.Filterable](cols commsMailerColumns) commsMailerWhere[Q] {
return commsMailerWhere[Q]{
Created: psql.Where[Q, time.Time](cols.Created),
ID: psql.Where[Q, int32](cols.ID),
Type: psql.Where[Q, enums.CommsMailertype](cols.Type),
AddressID: psql.Where[Q, int32](cols.AddressID),
Created: psql.Where[Q, time.Time](cols.Created),
ID: psql.Where[Q, int32](cols.ID),
Recipient: psql.Where[Q, string](cols.Recipient),
UUID: psql.Where[Q, uuid.UUID](cols.UUID),
}
}
func (o *CommsMailer) Preload(name string, retrieved any) error {
if o == nil {
return nil
}
switch name {
case "Address":
rel, ok := retrieved.(*Address)
if !ok {
return fmt.Errorf("commsMailer cannot load %T as %q", retrieved, name)
}
o.R.Address = rel
if rel != nil {
rel.R.Mailers = CommsMailerSlice{o}
}
return nil
case "ComplianceReportRequests":
rels, ok := retrieved.(ComplianceReportRequestSlice)
if !ok {
return fmt.Errorf("commsMailer cannot load %T as %q", retrieved, name)
}
o.R.ComplianceReportRequests = rels
for _, rel := range rels {
if rel != nil {
rel.R.Mailers = CommsMailerSlice{o}
}
}
return nil
default:
return fmt.Errorf("commsMailer has no relationship %q", name)
}
}
type commsMailerPreloader struct {
Address func(...psql.PreloadOption) psql.Preloader
}
func buildCommsMailerPreloader() commsMailerPreloader {
return commsMailerPreloader{
Address: func(opts ...psql.PreloadOption) psql.Preloader {
return psql.Preload[*Address, AddressSlice](psql.PreloadRel{
Name: "Address",
Sides: []psql.PreloadSide{
{
From: CommsMailers,
To: Addresses,
FromColumns: []string{"address_id"},
ToColumns: []string{"id"},
},
},
}, Addresses.Columns.Names(), opts...)
},
}
}
type commsMailerThenLoader[Q orm.Loadable] struct {
Address func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
ComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildCommsMailerThenLoader[Q orm.Loadable]() commsMailerThenLoader[Q] {
type AddressLoadInterface interface {
LoadAddress(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
type ComplianceReportRequestsLoadInterface interface {
LoadComplianceReportRequests(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
return commsMailerThenLoader[Q]{
Address: thenLoadBuilder[Q](
"Address",
func(ctx context.Context, exec bob.Executor, retrieved AddressLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
return retrieved.LoadAddress(ctx, exec, mods...)
},
),
ComplianceReportRequests: thenLoadBuilder[Q](
"ComplianceReportRequests",
func(ctx context.Context, exec bob.Executor, retrieved ComplianceReportRequestsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
return retrieved.LoadComplianceReportRequests(ctx, exec, mods...)
},
),
}
}
// LoadAddress loads the commsMailer's Address into the .R struct
func (o *CommsMailer) LoadAddress(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
return nil
}
// Reset the relationship
o.R.Address = nil
related, err := o.Address(mods...).One(ctx, exec)
if err != nil {
return err
}
related.R.Mailers = CommsMailerSlice{o}
o.R.Address = related
return nil
}
// LoadAddress loads the commsMailer's Address into the .R struct
func (os CommsMailerSlice) LoadAddress(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if len(os) == 0 {
return nil
}
addresses, err := os.Address(mods...).All(ctx, exec)
if err != nil {
return err
}
for _, o := range os {
if o == nil {
continue
}
for _, rel := range addresses {
if !(o.AddressID == rel.ID) {
continue
}
rel.R.Mailers = append(rel.R.Mailers, o)
o.R.Address = rel
break
}
}
return nil
}
// LoadComplianceReportRequests loads the commsMailer's ComplianceReportRequests into the .R struct
func (o *CommsMailer) LoadComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
return nil
}
// Reset the relationship
o.R.ComplianceReportRequests = nil
related, err := o.ComplianceReportRequests(mods...).All(ctx, exec)
if err != nil {
return err
}
for _, rel := range related {
rel.R.Mailers = CommsMailerSlice{o}
}
o.R.ComplianceReportRequests = related
return nil
}
// LoadComplianceReportRequests loads the commsMailer's ComplianceReportRequests into the .R struct
func (os CommsMailerSlice) LoadComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if len(os) == 0 {
return nil
}
// since we are changing the columns, we need to check if the original columns were set or add the defaults
sq := dialect.SelectQuery{}
for _, mod := range mods {
mod.Apply(&sq)
}
if len(sq.SelectList.Columns) == 0 {
mods = append(mods, sm.Columns(ComplianceReportRequests.Columns))
}
q := os.ComplianceReportRequests(append(
mods,
sm.Columns(ComplianceReportRequestMailers.Columns.MailerID.As("related_comms.mailer.ID")),
)...)
IDSlice := []int32{}
mapper := scan.Mod(scan.StructMapper[*ComplianceReportRequest](), func(ctx context.Context, cols []string) (scan.BeforeFunc, func(any, any) error) {
return func(row *scan.Row) (any, error) {
IDSlice = append(IDSlice, *new(int32))
row.ScheduleScanByName("related_comms.mailer.ID", &IDSlice[len(IDSlice)-1])
return nil, nil
},
func(any, any) error {
return nil
}
})
complianceReportRequests, err := bob.Allx[bob.SliceTransformer[*ComplianceReportRequest, ComplianceReportRequestSlice]](ctx, exec, q, mapper)
if err != nil {
return err
}
for _, o := range os {
o.R.ComplianceReportRequests = nil
}
for _, o := range os {
for i, rel := range complianceReportRequests {
if !(o.ID == IDSlice[i]) {
continue
}
rel.R.Mailers = append(rel.R.Mailers, o)
o.R.ComplianceReportRequests = append(o.R.ComplianceReportRequests, rel)
}
}
return nil
}
// commsMailerC is where relationship counts are stored.
type commsMailerC struct {
ComplianceReportRequests *int64
}
// PreloadCount sets a count in the C struct by name
func (o *CommsMailer) PreloadCount(name string, count int64) error {
if o == nil {
return nil
}
switch name {
case "ComplianceReportRequests":
o.C.ComplianceReportRequests = &count
}
return nil
}
type commsMailerCountPreloader struct {
ComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
}
func buildCommsMailerCountPreloader() commsMailerCountPreloader {
return commsMailerCountPreloader{
ComplianceReportRequests: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
return countPreloader[*CommsMailer]("ComplianceReportRequests", func(parent string) bob.Expression {
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
if parent == "" {
parent = CommsMailers.Alias()
}
subqueryMods := []bob.Mod[*dialect.SelectQuery]{
sm.Columns(psql.Raw("count(*)")),
sm.From(ComplianceReportRequestMailers.Name()),
sm.Where(psql.Quote(ComplianceReportRequestMailers.Alias(), "mailer_id").EQ(psql.Quote(parent, "id"))),
sm.InnerJoin(ComplianceReportRequests.Name()).On(
psql.Quote(ComplianceReportRequests.Alias(), "id").EQ(psql.Quote(ComplianceReportRequestMailers.Alias(), "compliance_report_request_id")),
),
}
subqueryMods = append(subqueryMods, mods...)
return psql.Group(psql.Select(subqueryMods...).Expression)
})
},
}
}
type commsMailerCountThenLoader[Q orm.Loadable] struct {
ComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildCommsMailerCountThenLoader[Q orm.Loadable]() commsMailerCountThenLoader[Q] {
type ComplianceReportRequestsCountInterface interface {
LoadCountComplianceReportRequests(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
return commsMailerCountThenLoader[Q]{
ComplianceReportRequests: countThenLoadBuilder[Q](
"ComplianceReportRequests",
func(ctx context.Context, exec bob.Executor, retrieved ComplianceReportRequestsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
return retrieved.LoadCountComplianceReportRequests(ctx, exec, mods...)
},
),
}
}
// LoadCountComplianceReportRequests loads the count of ComplianceReportRequests into the C struct
func (o *CommsMailer) LoadCountComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
return nil
}
count, err := o.ComplianceReportRequests(mods...).Count(ctx, exec)
if err != nil {
return err
}
o.C.ComplianceReportRequests = &count
return nil
}
// LoadCountComplianceReportRequests loads the count of ComplianceReportRequests for a slice
func (os CommsMailerSlice) LoadCountComplianceReportRequests(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if len(os) == 0 {
return nil
}
for _, o := range os {
if err := o.LoadCountComplianceReportRequests(ctx, exec, mods...); err != nil {
return err
}
}
return nil
}
type commsMailerJoins[Q dialect.Joinable] struct {
typ string
Address modAs[Q, addressColumns]
ComplianceReportRequests modAs[Q, complianceReportRequestColumns]
}
func (j commsMailerJoins[Q]) aliasedAs(alias string) commsMailerJoins[Q] {
return buildCommsMailerJoins[Q](buildCommsMailerColumns(alias), j.typ)
}
func buildCommsMailerJoins[Q dialect.Joinable](cols commsMailerColumns, typ string) commsMailerJoins[Q] {
return commsMailerJoins[Q]{
typ: typ,
Address: modAs[Q, addressColumns]{
c: Addresses.Columns,
f: func(to addressColumns) bob.Mod[Q] {
mods := make(mods.QueryMods[Q], 0, 1)
{
mods = append(mods, dialect.Join[Q](typ, Addresses.Name().As(to.Alias())).On(
to.ID.EQ(cols.AddressID),
))
}
return mods
},
},
ComplianceReportRequests: modAs[Q, complianceReportRequestColumns]{
c: ComplianceReportRequests.Columns,
f: func(to complianceReportRequestColumns) bob.Mod[Q] {
random := strconv.FormatInt(randInt(), 10)
mods := make(mods.QueryMods[Q], 0, 2)
{
to := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
mods = append(mods, dialect.Join[Q](typ, ComplianceReportRequestMailers.Name().As(to.Alias())).On(
to.MailerID.EQ(cols.ID),
))
}
{
cols := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
mods = append(mods, dialect.Join[Q](typ, ComplianceReportRequests.Name().As(to.Alias())).On(
to.ID.EQ(cols.ComplianceReportRequestID),
))
}
return mods
},
},
}
}

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.
@ -46,8 +50,9 @@ type ComplianceReportRequestsQuery = *psql.ViewQuery[*ComplianceReportRequest, C
// complianceReportRequestR is where relationships are stored.
type complianceReportRequestR struct {
CreatorUser *User // compliance_report_request.compliance_report_request_creator_fkey
Site *Site // compliance_report_request.compliance_report_request_site_id_site_version_fkey
CreatorUser *User // compliance_report_request.compliance_report_request_creator_fkey
Site *Site // compliance_report_request.compliance_report_request_site_id_site_version_fkey
Mailers CommsMailerSlice // compliance_report_request_mailer.compliance_report_request_mai_compliance_report_request_id_fkeycompliance_report_request_mailer.compliance_report_request_mailer_mailer_id_fkey
}
func buildComplianceReportRequestColumns(alias string) complianceReportRequestColumns {
@ -514,6 +519,35 @@ func (os ComplianceReportRequestSlice) Site(mods ...bob.Mod[*dialect.SelectQuery
)...)
}
// Mailers starts a query for related objects on comms.mailer
func (o *ComplianceReportRequest) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
return CommsMailers.Query(append(mods,
sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
CommsMailers.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.MailerID)),
sm.Where(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID.EQ(psql.Arg(o.ID))),
)...)
}
func (os ComplianceReportRequestSlice) Mailers(mods ...bob.Mod[*dialect.SelectQuery]) CommsMailersQuery {
pkID := make(pgtypes.Array[int32], 0, len(os))
for _, o := range os {
if o == nil {
continue
}
pkID = append(pkID, o.ID)
}
PKArgExpr := psql.Select(sm.Columns(
psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")),
))
return CommsMailers.Query(append(mods,
sm.InnerJoin(ComplianceReportRequestMailers.NameAs()).On(
CommsMailers.Columns.ID.EQ(ComplianceReportRequestMailers.Columns.MailerID),
),
sm.Where(psql.Group(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID).OP("IN", PKArgExpr)),
)...)
}
func attachComplianceReportRequestCreatorUser0(ctx context.Context, exec bob.Executor, count int, complianceReportRequest0 *ComplianceReportRequest, user1 *User) (*ComplianceReportRequest, error) {
setter := &ComplianceReportRequestSetter{
Creator: omit.From(user1.ID),
@ -665,6 +699,20 @@ func (o *ComplianceReportRequest) Preload(name string, retrieved any) error {
rel.R.ComplianceReportRequests = ComplianceReportRequestSlice{o}
}
return nil
case "Mailers":
rels, ok := retrieved.(CommsMailerSlice)
if !ok {
return fmt.Errorf("complianceReportRequest cannot load %T as %q", retrieved, name)
}
o.R.Mailers = rels
for _, rel := range rels {
if rel != nil {
rel.R.ComplianceReportRequests = ComplianceReportRequestSlice{o}
}
}
return nil
default:
return fmt.Errorf("complianceReportRequest has no relationship %q", name)
}
@ -709,6 +757,7 @@ func buildComplianceReportRequestPreloader() complianceReportRequestPreloader {
type complianceReportRequestThenLoader[Q orm.Loadable] struct {
CreatorUser func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Site func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildComplianceReportRequestThenLoader[Q orm.Loadable]() complianceReportRequestThenLoader[Q] {
@ -718,6 +767,9 @@ func buildComplianceReportRequestThenLoader[Q orm.Loadable]() complianceReportRe
type SiteLoadInterface interface {
LoadSite(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
type MailersLoadInterface interface {
LoadMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
return complianceReportRequestThenLoader[Q]{
CreatorUser: thenLoadBuilder[Q](
@ -732,6 +784,12 @@ func buildComplianceReportRequestThenLoader[Q orm.Loadable]() complianceReportRe
return retrieved.LoadSite(ctx, exec, mods...)
},
),
Mailers: thenLoadBuilder[Q](
"Mailers",
func(ctx context.Context, exec bob.Executor, retrieved MailersLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
return retrieved.LoadMailers(ctx, exec, mods...)
},
),
}
}
@ -843,10 +901,188 @@ func (os ComplianceReportRequestSlice) LoadSite(ctx context.Context, exec bob.Ex
return nil
}
// LoadMailers loads the complianceReportRequest's Mailers into the .R struct
func (o *ComplianceReportRequest) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
return nil
}
// Reset the relationship
o.R.Mailers = nil
related, err := o.Mailers(mods...).All(ctx, exec)
if err != nil {
return err
}
for _, rel := range related {
rel.R.ComplianceReportRequests = ComplianceReportRequestSlice{o}
}
o.R.Mailers = related
return nil
}
// LoadMailers loads the complianceReportRequest's Mailers into the .R struct
func (os ComplianceReportRequestSlice) LoadMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if len(os) == 0 {
return nil
}
// since we are changing the columns, we need to check if the original columns were set or add the defaults
sq := dialect.SelectQuery{}
for _, mod := range mods {
mod.Apply(&sq)
}
if len(sq.SelectList.Columns) == 0 {
mods = append(mods, sm.Columns(CommsMailers.Columns))
}
q := os.Mailers(append(
mods,
sm.Columns(ComplianceReportRequestMailers.Columns.ComplianceReportRequestID.As("related_compliance_report_request.ID")),
)...)
IDSlice := []int32{}
mapper := scan.Mod(scan.StructMapper[*CommsMailer](), func(ctx context.Context, cols []string) (scan.BeforeFunc, func(any, any) error) {
return func(row *scan.Row) (any, error) {
IDSlice = append(IDSlice, *new(int32))
row.ScheduleScanByName("related_compliance_report_request.ID", &IDSlice[len(IDSlice)-1])
return nil, nil
},
func(any, any) error {
return nil
}
})
commsMailers, err := bob.Allx[bob.SliceTransformer[*CommsMailer, CommsMailerSlice]](ctx, exec, q, mapper)
if err != nil {
return err
}
for _, o := range os {
o.R.Mailers = nil
}
for _, o := range os {
for i, rel := range commsMailers {
if !(o.ID == IDSlice[i]) {
continue
}
rel.R.ComplianceReportRequests = append(rel.R.ComplianceReportRequests, o)
o.R.Mailers = append(o.R.Mailers, rel)
}
}
return nil
}
// complianceReportRequestC is where relationship counts are stored.
type complianceReportRequestC struct {
Mailers *int64
}
// PreloadCount sets a count in the C struct by name
func (o *ComplianceReportRequest) PreloadCount(name string, count int64) error {
if o == nil {
return nil
}
switch name {
case "Mailers":
o.C.Mailers = &count
}
return nil
}
type complianceReportRequestCountPreloader struct {
Mailers func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
}
func buildComplianceReportRequestCountPreloader() complianceReportRequestCountPreloader {
return complianceReportRequestCountPreloader{
Mailers: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
return countPreloader[*ComplianceReportRequest]("Mailers", func(parent string) bob.Expression {
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
if parent == "" {
parent = ComplianceReportRequests.Alias()
}
subqueryMods := []bob.Mod[*dialect.SelectQuery]{
sm.Columns(psql.Raw("count(*)")),
sm.From(ComplianceReportRequestMailers.Name()),
sm.Where(psql.Quote(ComplianceReportRequestMailers.Alias(), "compliance_report_request_id").EQ(psql.Quote(parent, "id"))),
sm.InnerJoin(CommsMailers.Name()).On(
psql.Quote(CommsMailers.Alias(), "id").EQ(psql.Quote(ComplianceReportRequestMailers.Alias(), "mailer_id")),
),
}
subqueryMods = append(subqueryMods, mods...)
return psql.Group(psql.Select(subqueryMods...).Expression)
})
},
}
}
type complianceReportRequestCountThenLoader[Q orm.Loadable] struct {
Mailers func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
}
func buildComplianceReportRequestCountThenLoader[Q orm.Loadable]() complianceReportRequestCountThenLoader[Q] {
type MailersCountInterface interface {
LoadCountMailers(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
}
return complianceReportRequestCountThenLoader[Q]{
Mailers: countThenLoadBuilder[Q](
"Mailers",
func(ctx context.Context, exec bob.Executor, retrieved MailersCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
return retrieved.LoadCountMailers(ctx, exec, mods...)
},
),
}
}
// LoadCountMailers loads the count of Mailers into the C struct
func (o *ComplianceReportRequest) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if o == nil {
return nil
}
count, err := o.Mailers(mods...).Count(ctx, exec)
if err != nil {
return err
}
o.C.Mailers = &count
return nil
}
// LoadCountMailers loads the count of Mailers for a slice
func (os ComplianceReportRequestSlice) LoadCountMailers(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
if len(os) == 0 {
return nil
}
for _, o := range os {
if err := o.LoadCountMailers(ctx, exec, mods...); err != nil {
return err
}
}
return nil
}
type complianceReportRequestJoins[Q dialect.Joinable] struct {
typ string
CreatorUser modAs[Q, userColumns]
Site modAs[Q, siteColumns]
Mailers modAs[Q, commsMailerColumns]
}
func (j complianceReportRequestJoins[Q]) aliasedAs(alias string) complianceReportRequestJoins[Q] {
@ -881,6 +1117,28 @@ func buildComplianceReportRequestJoins[Q dialect.Joinable](cols complianceReport
))
}
return mods
},
},
Mailers: modAs[Q, commsMailerColumns]{
c: CommsMailers.Columns,
f: func(to commsMailerColumns) bob.Mod[Q] {
random := strconv.FormatInt(randInt(), 10)
mods := make(mods.QueryMods[Q], 0, 2)
{
to := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
mods = append(mods, dialect.Join[Q](typ, ComplianceReportRequestMailers.Name().As(to.Alias())).On(
to.ComplianceReportRequestID.EQ(cols.ID),
))
}
{
cols := ComplianceReportRequestMailers.Columns.AliasedAs(ComplianceReportRequestMailers.Columns.Alias() + random)
mods = append(mods, dialect.Join[Q](typ, CommsMailers.Name().As(to.Alias())).On(
to.ID.EQ(cols.MailerID),
))
}
return mods
},
},

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