diff --git a/db/dbinfo/address.bob.go b/db/dbinfo/address.bob.go index 5ea9d9c7..f8d3bdef 100644 --- a/db/dbinfo/address.bob.go +++ b/db/dbinfo/address.bob.go @@ -105,6 +105,15 @@ var Addresses = Table[ Generated: false, AutoIncr: false, }, + Region: column{ + Name: "region", + DBType: "text", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, }, Indexes: addressIndexes{ AddressPkey: index{ @@ -207,11 +216,12 @@ type addressColumns struct { PostalCode column Street column Unit column + Region column } func (c addressColumns) AsSlice() []column { return []column{ - c.Country, c.Created, c.Geom, c.H3cell, c.ID, c.Locality, c.Number, c.PostalCode, c.Street, c.Unit, + c.Country, c.Created, c.Geom, c.H3cell, c.ID, c.Locality, c.Number, c.PostalCode, c.Street, c.Unit, c.Region, } } diff --git a/db/factory/address.bob.go b/db/factory/address.bob.go index 31ecef5f..db90ac03 100644 --- a/db/factory/address.bob.go +++ b/db/factory/address.bob.go @@ -46,6 +46,7 @@ type AddressTemplate struct { PostalCode func() string Street func() string Unit func() string + Region func() string r addressR f *Factory @@ -160,6 +161,10 @@ func (o AddressTemplate) BuildSetter() *models.AddressSetter { val := o.Unit() m.Unit = omit.From(val) } + if o.Region != nil { + val := o.Region() + m.Region = omit.From(val) + } return m } @@ -212,6 +217,9 @@ func (o AddressTemplate) Build() *models.Address { if o.Unit != nil { m.Unit = o.Unit() } + if o.Region != nil { + m.Region = o.Region() + } o.setModelRels(m) @@ -268,6 +276,10 @@ func ensureCreatableAddress(m *models.AddressSetter) { val := random_string(nil) m.Unit = omit.From(val) } + if !(m.Region.IsValue()) { + val := random_string(nil) + m.Region = omit.From(val) + } } // insertOptRels creates and inserts any optional the relationships on *models.Address @@ -437,6 +449,7 @@ func (m addressMods) RandomizeAllColumns(f *faker.Faker) AddressMod { AddressMods.RandomPostalCode(f), AddressMods.RandomStreet(f), AddressMods.RandomUnit(f), + AddressMods.RandomRegion(f), } } @@ -750,6 +763,37 @@ func (m addressMods) RandomUnit(f *faker.Faker) AddressMod { }) } +// Set the model columns to this value +func (m addressMods) Region(val string) AddressMod { + return AddressModFunc(func(_ context.Context, o *AddressTemplate) { + o.Region = func() string { return val } + }) +} + +// Set the Column from the function +func (m addressMods) RegionFunc(f func() string) AddressMod { + return AddressModFunc(func(_ context.Context, o *AddressTemplate) { + o.Region = f + }) +} + +// Clear any values for the column +func (m addressMods) UnsetRegion() AddressMod { + return AddressModFunc(func(_ context.Context, o *AddressTemplate) { + o.Region = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m addressMods) RandomRegion(f *faker.Faker) AddressMod { + return AddressModFunc(func(_ context.Context, o *AddressTemplate) { + o.Region = func() string { + return random_string(f) + } + }) +} + func (m addressMods) WithParentsCascading() AddressMod { return AddressModFunc(func(ctx context.Context, o *AddressTemplate) { if isDone, _ := addressWithParentsCascadingCtx.Value(ctx); isDone { diff --git a/db/factory/bobfactory_main.bob.go b/db/factory/bobfactory_main.bob.go index 6ce1bb0c..3d1030a4 100644 --- a/db/factory/bobfactory_main.bob.go +++ b/db/factory/bobfactory_main.bob.go @@ -146,6 +146,7 @@ func (f *Factory) FromExistingAddress(m *models.Address) *AddressTemplate { o.PostalCode = func() string { return m.PostalCode } o.Street = func() string { return m.Street } o.Unit = func() string { return m.Unit } + o.Region = func() string { return m.Region } ctx := context.Background() if len(m.R.Mailers) > 0 { diff --git a/db/migrations/00078_address_region.sql b/db/migrations/00078_address_region.sql new file mode 100644 index 00000000..59343dd3 --- /dev/null +++ b/db/migrations/00078_address_region.sql @@ -0,0 +1,6 @@ +-- +goose Up +ALTER TABLE address ADD COLUMN region TEXT; +UPDATE address SET region = 'California'; +ALTER TABLE address ALTER COLUMN region SET NOT NULL; +-- +goose Down +ALTER TABLE address DROP COLUMN region; diff --git a/db/models/address.bob.go b/db/models/address.bob.go index 03065302..19e8a9b3 100644 --- a/db/models/address.bob.go +++ b/db/models/address.bob.go @@ -35,6 +35,7 @@ type Address struct { PostalCode string `db:"postal_code" ` Street string `db:"street" ` Unit string `db:"unit" ` + Region string `db:"region" ` R addressR `db:"-" ` @@ -61,7 +62,7 @@ type addressR struct { func buildAddressColumns(alias string) addressColumns { return addressColumns{ ColumnsExpr: expr.NewColumnsExpr( - "country", "created", "geom", "h3cell", "id", "locality", "number_", "postal_code", "street", "unit", + "country", "created", "geom", "h3cell", "id", "locality", "number_", "postal_code", "street", "unit", "region", ).WithParent("address"), tableAlias: alias, Country: psql.Quote(alias, "country"), @@ -74,6 +75,7 @@ func buildAddressColumns(alias string) addressColumns { PostalCode: psql.Quote(alias, "postal_code"), Street: psql.Quote(alias, "street"), Unit: psql.Quote(alias, "unit"), + Region: psql.Quote(alias, "region"), } } @@ -90,6 +92,7 @@ type addressColumns struct { PostalCode psql.Expression Street psql.Expression Unit psql.Expression + Region psql.Expression } func (c addressColumns) Alias() string { @@ -114,10 +117,11 @@ type AddressSetter struct { PostalCode omit.Val[string] `db:"postal_code" ` Street omit.Val[string] `db:"street" ` Unit omit.Val[string] `db:"unit" ` + Region omit.Val[string] `db:"region" ` } func (s AddressSetter) SetColumns() []string { - vals := make([]string, 0, 10) + vals := make([]string, 0, 11) if s.Country.IsValue() { vals = append(vals, "country") } @@ -148,6 +152,9 @@ func (s AddressSetter) SetColumns() []string { if s.Unit.IsValue() { vals = append(vals, "unit") } + if s.Region.IsValue() { + vals = append(vals, "region") + } return vals } @@ -182,6 +189,9 @@ func (s AddressSetter) Overwrite(t *Address) { if s.Unit.IsValue() { t.Unit = s.Unit.MustGet() } + if s.Region.IsValue() { + t.Region = s.Region.MustGet() + } } func (s *AddressSetter) Apply(q *dialect.InsertQuery) { @@ -190,7 +200,7 @@ func (s *AddressSetter) 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, 10) + vals := make([]bob.Expression, 11) if s.Country.IsValue() { vals[0] = psql.Arg(s.Country.MustGet()) } else { @@ -251,6 +261,12 @@ func (s *AddressSetter) Apply(q *dialect.InsertQuery) { vals[9] = psql.Raw("DEFAULT") } + if s.Region.IsValue() { + vals[10] = psql.Arg(s.Region.MustGet()) + } else { + vals[10] = psql.Raw("DEFAULT") + } + return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") })) } @@ -260,7 +276,7 @@ func (s AddressSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] { } func (s AddressSetter) Expressions(prefix ...string) []bob.Expression { - exprs := make([]bob.Expression, 0, 10) + exprs := make([]bob.Expression, 0, 11) if s.Country.IsValue() { exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ @@ -332,6 +348,13 @@ func (s AddressSetter) Expressions(prefix ...string) []bob.Expression { }}) } + if s.Region.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "region")...), + psql.Arg(s.Region), + }}) + } + return exprs } @@ -831,6 +854,7 @@ type addressWhere[Q psql.Filterable] struct { PostalCode psql.WhereMod[Q, string] Street psql.WhereMod[Q, string] Unit psql.WhereMod[Q, string] + Region psql.WhereMod[Q, string] } func (addressWhere[Q]) AliasedAs(alias string) addressWhere[Q] { @@ -849,6 +873,7 @@ func buildAddressWhere[Q psql.Filterable](cols addressColumns) addressWhere[Q] { PostalCode: psql.Where[Q, string](cols.PostalCode), Street: psql.Where[Q, string](cols.Street), Unit: psql.Where[Q, string](cols.Unit), + Region: psql.Where[Q, string](cols.Region), } } diff --git a/rmo/mailer.go b/rmo/mailer.go index c4de4c56..3c7d486b 100644 --- a/rmo/mailer.go +++ b/rmo/mailer.go @@ -16,11 +16,12 @@ import ( ) type address struct { - Number int32 `db:"number_"` - Street string `db:"street"` - Locality string `db:"locality"` - PostalCode string `db:"postal_code"` Country string `db:"country"` + Locality string `db:"locality"` + Number int32 `db:"number_"` + PostalCode string `db:"postal_code"` + Street string `db:"street"` + Region string `db:"postal_code"` } type contentMailer struct { Address address @@ -48,6 +49,7 @@ func getMailer(ctx context.Context, r *http.Request) (*html.Response[contentMail "address.number_", "address.street", "address.locality", + "address.region", "address.postal_code", "address.country", ),