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