diff --git a/db/dbinfo/publicreport.image.bob.go b/db/dbinfo/publicreport.image.bob.go index 987af228..8d47eacc 100644 --- a/db/dbinfo/publicreport.image.bob.go +++ b/db/dbinfo/publicreport.image.bob.go @@ -42,15 +42,6 @@ var PublicreportImages = Table[ Generated: false, AutoIncr: false, }, - Location: column{ - Name: "location", - DBType: "geography", - Default: "NULL", - Comment: "", - Nullable: true, - Generated: false, - AutoIncr: false, - }, ResolutionX: column{ Name: "resolution_x", DBType: "integer", @@ -96,6 +87,15 @@ var PublicreportImages = Table[ Generated: false, AutoIncr: false, }, + Location: column{ + Name: "location", + DBType: "geometry", + Default: "NULL", + Comment: "", + Nullable: true, + Generated: false, + AutoIncr: false, + }, }, Indexes: publicreportImageIndexes{ ImagePkey: index{ @@ -129,17 +129,17 @@ type publicreportImageColumns struct { ID column ContentType column Created column - Location column ResolutionX column ResolutionY column StorageUUID column StorageSize column UploadedFilename column + Location column } func (c publicreportImageColumns) AsSlice() []column { return []column{ - c.ID, c.ContentType, c.Created, c.Location, c.ResolutionX, c.ResolutionY, c.StorageUUID, c.StorageSize, c.UploadedFilename, + c.ID, c.ContentType, c.Created, c.ResolutionX, c.ResolutionY, c.StorageUUID, c.StorageSize, c.UploadedFilename, c.Location, } } diff --git a/db/migrations/00095_publicreport_image_location_type.sql b/db/migrations/00095_publicreport_image_location_type.sql new file mode 100644 index 00000000..cdbd4d1f --- /dev/null +++ b/db/migrations/00095_publicreport_image_location_type.sql @@ -0,0 +1,6 @@ +-- +goose Up +ALTER TABLE publicreport.image ADD COLUMN loc2 geometry(Point, 4326); +UPDATE publicreport.image SET loc2 = location::geometry(Point, 4326); +ALTER TABLE publicreport.image DROP COLUMN location; +ALTER TABLE publicreport.image RENAME COLUMN loc2 TO location; + diff --git a/db/models/publicreport.image.bob.go b/db/models/publicreport.image.bob.go index a1b561c9..0aab0010 100644 --- a/db/models/publicreport.image.bob.go +++ b/db/models/publicreport.image.bob.go @@ -30,12 +30,12 @@ type PublicreportImage struct { ID int32 `db:"id,pk" ` ContentType string `db:"content_type" ` Created time.Time `db:"created" ` - Location null.Val[string] `db:"location" ` ResolutionX int32 `db:"resolution_x" ` ResolutionY int32 `db:"resolution_y" ` StorageUUID uuid.UUID `db:"storage_uuid" ` StorageSize int64 `db:"storage_size" ` UploadedFilename string `db:"uploaded_filename" ` + Location null.Val[string] `db:"location" ` R publicreportImageR `db:"-" ` } @@ -60,18 +60,18 @@ type publicreportImageR struct { func buildPublicreportImageColumns(alias string) publicreportImageColumns { return publicreportImageColumns{ ColumnsExpr: expr.NewColumnsExpr( - "id", "content_type", "created", "location", "resolution_x", "resolution_y", "storage_uuid", "storage_size", "uploaded_filename", + "id", "content_type", "created", "resolution_x", "resolution_y", "storage_uuid", "storage_size", "uploaded_filename", "location", ).WithParent("publicreport.image"), tableAlias: alias, ID: psql.Quote(alias, "id"), ContentType: psql.Quote(alias, "content_type"), Created: psql.Quote(alias, "created"), - Location: psql.Quote(alias, "location"), ResolutionX: psql.Quote(alias, "resolution_x"), ResolutionY: psql.Quote(alias, "resolution_y"), StorageUUID: psql.Quote(alias, "storage_uuid"), StorageSize: psql.Quote(alias, "storage_size"), UploadedFilename: psql.Quote(alias, "uploaded_filename"), + Location: psql.Quote(alias, "location"), } } @@ -81,12 +81,12 @@ type publicreportImageColumns struct { ID psql.Expression ContentType psql.Expression Created psql.Expression - Location psql.Expression ResolutionX psql.Expression ResolutionY psql.Expression StorageUUID psql.Expression StorageSize psql.Expression UploadedFilename psql.Expression + Location psql.Expression } func (c publicreportImageColumns) Alias() string { @@ -104,12 +104,12 @@ type PublicreportImageSetter struct { ID omit.Val[int32] `db:"id,pk" ` ContentType omit.Val[string] `db:"content_type" ` Created omit.Val[time.Time] `db:"created" ` - Location omitnull.Val[string] `db:"location" ` ResolutionX omit.Val[int32] `db:"resolution_x" ` ResolutionY omit.Val[int32] `db:"resolution_y" ` StorageUUID omit.Val[uuid.UUID] `db:"storage_uuid" ` StorageSize omit.Val[int64] `db:"storage_size" ` UploadedFilename omit.Val[string] `db:"uploaded_filename" ` + Location omitnull.Val[string] `db:"location" ` } func (s PublicreportImageSetter) SetColumns() []string { @@ -123,9 +123,6 @@ func (s PublicreportImageSetter) SetColumns() []string { if s.Created.IsValue() { vals = append(vals, "created") } - if !s.Location.IsUnset() { - vals = append(vals, "location") - } if s.ResolutionX.IsValue() { vals = append(vals, "resolution_x") } @@ -141,6 +138,9 @@ func (s PublicreportImageSetter) SetColumns() []string { if s.UploadedFilename.IsValue() { vals = append(vals, "uploaded_filename") } + if !s.Location.IsUnset() { + vals = append(vals, "location") + } return vals } @@ -154,9 +154,6 @@ func (s PublicreportImageSetter) Overwrite(t *PublicreportImage) { if s.Created.IsValue() { t.Created = s.Created.MustGet() } - if !s.Location.IsUnset() { - t.Location = s.Location.MustGetNull() - } if s.ResolutionX.IsValue() { t.ResolutionX = s.ResolutionX.MustGet() } @@ -172,6 +169,9 @@ func (s PublicreportImageSetter) Overwrite(t *PublicreportImage) { if s.UploadedFilename.IsValue() { t.UploadedFilename = s.UploadedFilename.MustGet() } + if !s.Location.IsUnset() { + t.Location = s.Location.MustGetNull() + } } func (s *PublicreportImageSetter) Apply(q *dialect.InsertQuery) { @@ -199,38 +199,38 @@ func (s *PublicreportImageSetter) Apply(q *dialect.InsertQuery) { vals[2] = psql.Raw("DEFAULT") } - if !s.Location.IsUnset() { - vals[3] = psql.Arg(s.Location.MustGetNull()) + if s.ResolutionX.IsValue() { + vals[3] = psql.Arg(s.ResolutionX.MustGet()) } else { vals[3] = psql.Raw("DEFAULT") } - if s.ResolutionX.IsValue() { - vals[4] = psql.Arg(s.ResolutionX.MustGet()) + if s.ResolutionY.IsValue() { + vals[4] = psql.Arg(s.ResolutionY.MustGet()) } else { vals[4] = psql.Raw("DEFAULT") } - if s.ResolutionY.IsValue() { - vals[5] = psql.Arg(s.ResolutionY.MustGet()) + if s.StorageUUID.IsValue() { + vals[5] = psql.Arg(s.StorageUUID.MustGet()) } else { vals[5] = psql.Raw("DEFAULT") } - if s.StorageUUID.IsValue() { - vals[6] = psql.Arg(s.StorageUUID.MustGet()) + if s.StorageSize.IsValue() { + vals[6] = psql.Arg(s.StorageSize.MustGet()) } else { vals[6] = psql.Raw("DEFAULT") } - if s.StorageSize.IsValue() { - vals[7] = psql.Arg(s.StorageSize.MustGet()) + if s.UploadedFilename.IsValue() { + vals[7] = psql.Arg(s.UploadedFilename.MustGet()) } else { vals[7] = psql.Raw("DEFAULT") } - if s.UploadedFilename.IsValue() { - vals[8] = psql.Arg(s.UploadedFilename.MustGet()) + if !s.Location.IsUnset() { + vals[8] = psql.Arg(s.Location.MustGetNull()) } else { vals[8] = psql.Raw("DEFAULT") } @@ -267,13 +267,6 @@ func (s PublicreportImageSetter) Expressions(prefix ...string) []bob.Expression }}) } - if !s.Location.IsUnset() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "location")...), - psql.Arg(s.Location), - }}) - } - if s.ResolutionX.IsValue() { exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ psql.Quote(append(prefix, "resolution_x")...), @@ -309,6 +302,13 @@ func (s PublicreportImageSetter) Expressions(prefix ...string) []bob.Expression }}) } + if !s.Location.IsUnset() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "location")...), + psql.Arg(s.Location), + }}) + } + return exprs } @@ -819,12 +819,12 @@ type publicreportImageWhere[Q psql.Filterable] struct { ID psql.WhereMod[Q, int32] ContentType psql.WhereMod[Q, string] Created psql.WhereMod[Q, time.Time] - Location psql.WhereNullMod[Q, string] ResolutionX psql.WhereMod[Q, int32] ResolutionY psql.WhereMod[Q, int32] StorageUUID psql.WhereMod[Q, uuid.UUID] StorageSize psql.WhereMod[Q, int64] UploadedFilename psql.WhereMod[Q, string] + Location psql.WhereNullMod[Q, string] } func (publicreportImageWhere[Q]) AliasedAs(alias string) publicreportImageWhere[Q] { @@ -836,12 +836,12 @@ func buildPublicreportImageWhere[Q psql.Filterable](cols publicreportImageColumn ID: psql.Where[Q, int32](cols.ID), ContentType: psql.Where[Q, string](cols.ContentType), Created: psql.Where[Q, time.Time](cols.Created), - Location: psql.WhereNull[Q, string](cols.Location), ResolutionX: psql.Where[Q, int32](cols.ResolutionX), ResolutionY: psql.Where[Q, int32](cols.ResolutionY), StorageUUID: psql.Where[Q, uuid.UUID](cols.StorageUUID), StorageSize: psql.Where[Q, int64](cols.StorageSize), UploadedFilename: psql.Where[Q, string](cols.UploadedFilename), + Location: psql.WhereNull[Q, string](cols.Location), } } diff --git a/rmo/image-upload.go b/rmo/image-upload.go index 784cc181..0cee8f86 100644 --- a/rmo/image-upload.go +++ b/rmo/image-upload.go @@ -163,7 +163,7 @@ func saveImageUploads(ctx context.Context, tx bob.Tx, uploads []ImageUpload) (mo if u.Exif.GPS != nil { _, err = psql.Update( um.Table("publicreport.image"), - um.SetCol("location").To(fmt.Sprintf("ST_GeometryFromText('Point(%f %f)')", u.Exif.GPS.Longitude, u.Exif.GPS.Latitude)), + um.SetCol("location").To(fmt.Sprintf("ST_Point(%f, %f, 4326)", u.Exif.GPS.Longitude, u.Exif.GPS.Latitude)), um.Where(psql.Quote("id").EQ(psql.Arg(image.ID))), ).Exec(ctx, tx) }