From 079d20c086e337986e22cd824e124928921551d6 Mon Sep 17 00:00:00 2001 From: Eli Ribble Date: Fri, 16 Jan 2026 14:52:11 +0000 Subject: [PATCH] Extract EXIF data from images This required a schema change and actually dumps all existing photo data from the public reports page. That's probably fine since it's not deployed to any customers so all data is currently test data. --- background/arcgis.go | 4 + db/dberrors/publicreport.image.bob.go | 17 + db/dberrors/publicreport.image_exif.bob.go | 17 + db/dberrors/publicreport.pool_image.bob.go | 17 + db/dberrors/publicreport.pool_photo.bob.go | 17 - db/dberrors/publicreport.quick_image.bob.go | 17 + db/dberrors/publicreport.quick_photo.bob.go | 17 - db/dbinfo/publicreport.image.bob.go | 162 +++ db/dbinfo/publicreport.image_exif.bob.go | 137 ++ db/dbinfo/publicreport.pool_image.bob.go | 132 ++ db/dbinfo/publicreport.pool_photo.bob.go | 147 -- db/dbinfo/publicreport.quick_image.bob.go | 132 ++ db/dbinfo/publicreport.quick_photo.bob.go | 147 -- db/factory/bobfactory_context.bob.go | 28 +- db/factory/bobfactory_main.bob.go | 171 ++- db/factory/publicreport.image.bob.go | 822 +++++++++++ db/factory/publicreport.image_exif.bob.go | 413 ++++++ db/factory/publicreport.pool.bob.go | 59 +- db/factory/publicreport.pool_image.bob.go | 431 ++++++ db/factory/publicreport.pool_photo.bob.go | 498 ------- db/factory/publicreport.quick.bob.go | 59 +- db/factory/publicreport.quick_image.bob.go | 431 ++++++ db/factory/publicreport.quick_photo.bob.go | 498 ------- db/migrations/00035_photo_content_type.sql | 37 + db/models/bob_counts.bob.go | 4 + db/models/bob_joins.bob.go | 12 +- db/models/bob_loaders.bob.go | 24 +- db/models/bob_where.bob.go | 18 +- db/models/publicreport.image.bob.go | 1440 +++++++++++++++++++ db/models/publicreport.image_exif.bob.go | 645 +++++++++ db/models/publicreport.pool.bob.go | 235 +-- db/models/publicreport.pool_image.bob.go | 766 ++++++++++ db/models/publicreport.pool_photo.bob.go | 678 --------- db/models/publicreport.quick.bob.go | 235 +-- db/models/publicreport.quick_image.bob.go | 766 ++++++++++ db/models/publicreport.quick_photo.bob.go | 678 --------- go.mod | 10 + go.sum | 55 + public-report/image-upload.go | 182 +++ public-report/photo-upload.go | 59 - public-report/pool.go | 34 +- public-report/quick.go | 41 +- userfile/userfile.go | 10 +- 43 files changed, 7208 insertions(+), 3094 deletions(-) create mode 100644 db/dberrors/publicreport.image.bob.go create mode 100644 db/dberrors/publicreport.image_exif.bob.go create mode 100644 db/dberrors/publicreport.pool_image.bob.go delete mode 100644 db/dberrors/publicreport.pool_photo.bob.go create mode 100644 db/dberrors/publicreport.quick_image.bob.go delete mode 100644 db/dberrors/publicreport.quick_photo.bob.go create mode 100644 db/dbinfo/publicreport.image.bob.go create mode 100644 db/dbinfo/publicreport.image_exif.bob.go create mode 100644 db/dbinfo/publicreport.pool_image.bob.go delete mode 100644 db/dbinfo/publicreport.pool_photo.bob.go create mode 100644 db/dbinfo/publicreport.quick_image.bob.go delete mode 100644 db/dbinfo/publicreport.quick_photo.bob.go create mode 100644 db/factory/publicreport.image.bob.go create mode 100644 db/factory/publicreport.image_exif.bob.go create mode 100644 db/factory/publicreport.pool_image.bob.go delete mode 100644 db/factory/publicreport.pool_photo.bob.go create mode 100644 db/factory/publicreport.quick_image.bob.go delete mode 100644 db/factory/publicreport.quick_photo.bob.go create mode 100644 db/migrations/00035_photo_content_type.sql create mode 100644 db/models/publicreport.image.bob.go create mode 100644 db/models/publicreport.image_exif.bob.go create mode 100644 db/models/publicreport.pool_image.bob.go delete mode 100644 db/models/publicreport.pool_photo.bob.go create mode 100644 db/models/publicreport.quick_image.bob.go delete mode 100644 db/models/publicreport.quick_photo.bob.go create mode 100644 public-report/image-upload.go delete mode 100644 public-report/photo-upload.go diff --git a/background/arcgis.go b/background/arcgis.go index 901fda63..d53177da 100644 --- a/background/arcgis.go +++ b/background/arcgis.go @@ -338,6 +338,10 @@ func updatePortalData(ctx context.Context, client *arcgis.ArcGIS, user_id int32) } tx, err := db.PGInstance.BobDB.BeginTx(ctx, nil) + if err != nil { + return nil, fmt.Errorf("Failed to create transaction: %w", err) + } + _, err = models.ArcgisUserPrivileges.Delete( dm.Where( models.ArcgisUserPrivileges.Columns.UserID.EQ(psql.Arg(p.User.ID)), diff --git a/db/dberrors/publicreport.image.bob.go b/db/dberrors/publicreport.image.bob.go new file mode 100644 index 00000000..4986333c --- /dev/null +++ b/db/dberrors/publicreport.image.bob.go @@ -0,0 +1,17 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package dberrors + +var PublicreportImageErrors = &publicreportImageErrors{ + ErrUniqueImagePkey: &UniqueConstraintError{ + schema: "publicreport", + table: "image", + columns: []string{"id"}, + s: "image_pkey", + }, +} + +type publicreportImageErrors struct { + ErrUniqueImagePkey *UniqueConstraintError +} diff --git a/db/dberrors/publicreport.image_exif.bob.go b/db/dberrors/publicreport.image_exif.bob.go new file mode 100644 index 00000000..28ab3ada --- /dev/null +++ b/db/dberrors/publicreport.image_exif.bob.go @@ -0,0 +1,17 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package dberrors + +var PublicreportImageExifErrors = &publicreportImageExifErrors{ + ErrUniqueImageExifPkey: &UniqueConstraintError{ + schema: "publicreport", + table: "image_exif", + columns: []string{"image_id", "name", "value"}, + s: "image_exif_pkey", + }, +} + +type publicreportImageExifErrors struct { + ErrUniqueImageExifPkey *UniqueConstraintError +} diff --git a/db/dberrors/publicreport.pool_image.bob.go b/db/dberrors/publicreport.pool_image.bob.go new file mode 100644 index 00000000..5317ef9f --- /dev/null +++ b/db/dberrors/publicreport.pool_image.bob.go @@ -0,0 +1,17 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package dberrors + +var PublicreportPoolImageErrors = &publicreportPoolImageErrors{ + ErrUniquePoolImagePkey: &UniqueConstraintError{ + schema: "publicreport", + table: "pool_image", + columns: []string{"image_id", "pool_id"}, + s: "pool_image_pkey", + }, +} + +type publicreportPoolImageErrors struct { + ErrUniquePoolImagePkey *UniqueConstraintError +} diff --git a/db/dberrors/publicreport.pool_photo.bob.go b/db/dberrors/publicreport.pool_photo.bob.go deleted file mode 100644 index 0a5310e6..00000000 --- a/db/dberrors/publicreport.pool_photo.bob.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by BobGen psql v0.42.1. DO NOT EDIT. -// This file is meant to be re-generated in place and/or deleted at any time. - -package dberrors - -var PublicreportPoolPhotoErrors = &publicreportPoolPhotoErrors{ - ErrUniquePoolPhotoPkey: &UniqueConstraintError{ - schema: "publicreport", - table: "pool_photo", - columns: []string{"id"}, - s: "pool_photo_pkey", - }, -} - -type publicreportPoolPhotoErrors struct { - ErrUniquePoolPhotoPkey *UniqueConstraintError -} diff --git a/db/dberrors/publicreport.quick_image.bob.go b/db/dberrors/publicreport.quick_image.bob.go new file mode 100644 index 00000000..d0bb4097 --- /dev/null +++ b/db/dberrors/publicreport.quick_image.bob.go @@ -0,0 +1,17 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package dberrors + +var PublicreportQuickImageErrors = &publicreportQuickImageErrors{ + ErrUniqueQuickImagePkey: &UniqueConstraintError{ + schema: "publicreport", + table: "quick_image", + columns: []string{"image_id", "quick_id"}, + s: "quick_image_pkey", + }, +} + +type publicreportQuickImageErrors struct { + ErrUniqueQuickImagePkey *UniqueConstraintError +} diff --git a/db/dberrors/publicreport.quick_photo.bob.go b/db/dberrors/publicreport.quick_photo.bob.go deleted file mode 100644 index 4dd54714..00000000 --- a/db/dberrors/publicreport.quick_photo.bob.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by BobGen psql v0.42.1. DO NOT EDIT. -// This file is meant to be re-generated in place and/or deleted at any time. - -package dberrors - -var PublicreportQuickPhotoErrors = &publicreportQuickPhotoErrors{ - ErrUniqueQuickPhotoPkey: &UniqueConstraintError{ - schema: "publicreport", - table: "quick_photo", - columns: []string{"id"}, - s: "quick_photo_pkey", - }, -} - -type publicreportQuickPhotoErrors struct { - ErrUniqueQuickPhotoPkey *UniqueConstraintError -} diff --git a/db/dbinfo/publicreport.image.bob.go b/db/dbinfo/publicreport.image.bob.go new file mode 100644 index 00000000..aca07c41 --- /dev/null +++ b/db/dbinfo/publicreport.image.bob.go @@ -0,0 +1,162 @@ +// Code generated by BobGen psql v0.42.1. 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 PublicreportImages = Table[ + publicreportImageColumns, + publicreportImageIndexes, + publicreportImageForeignKeys, + publicreportImageUniques, + publicreportImageChecks, +]{ + Schema: "publicreport", + Name: "image", + Columns: publicreportImageColumns{ + ID: column{ + Name: "id", + DBType: "integer", + Default: "nextval('publicreport.image_id_seq'::regclass)", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + ContentType: column{ + Name: "content_type", + DBType: "text", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + Created: column{ + Name: "created", + DBType: "timestamp without time zone", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + ResolutionX: column{ + Name: "resolution_x", + DBType: "integer", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + ResolutionY: column{ + Name: "resolution_y", + DBType: "integer", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + StorageUUID: column{ + Name: "storage_uuid", + DBType: "uuid", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + StorageSize: column{ + Name: "storage_size", + DBType: "bigint", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + UploadedFilename: column{ + Name: "uploaded_filename", + DBType: "text", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + }, + Indexes: publicreportImageIndexes{ + ImagePkey: index{ + Type: "btree", + Name: "image_pkey", + Columns: []indexColumn{ + { + Name: "id", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + }, + Unique: true, + Comment: "", + NullsFirst: []bool{false}, + NullsDistinct: false, + Where: "", + Include: []string{}, + }, + }, + PrimaryKey: &constraint{ + Name: "image_pkey", + Columns: []string{"id"}, + Comment: "", + }, + + Comment: "", +} + +type publicreportImageColumns struct { + ID column + ContentType column + Created column + ResolutionX column + ResolutionY column + StorageUUID column + StorageSize column + UploadedFilename column +} + +func (c publicreportImageColumns) AsSlice() []column { + return []column{ + c.ID, c.ContentType, c.Created, c.ResolutionX, c.ResolutionY, c.StorageUUID, c.StorageSize, c.UploadedFilename, + } +} + +type publicreportImageIndexes struct { + ImagePkey index +} + +func (i publicreportImageIndexes) AsSlice() []index { + return []index{ + i.ImagePkey, + } +} + +type publicreportImageForeignKeys struct{} + +func (f publicreportImageForeignKeys) AsSlice() []foreignKey { + return []foreignKey{} +} + +type publicreportImageUniques struct{} + +func (u publicreportImageUniques) AsSlice() []constraint { + return []constraint{} +} + +type publicreportImageChecks struct{} + +func (c publicreportImageChecks) AsSlice() []check { + return []check{} +} diff --git a/db/dbinfo/publicreport.image_exif.bob.go b/db/dbinfo/publicreport.image_exif.bob.go new file mode 100644 index 00000000..97aa27b7 --- /dev/null +++ b/db/dbinfo/publicreport.image_exif.bob.go @@ -0,0 +1,137 @@ +// Code generated by BobGen psql v0.42.1. 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 PublicreportImageExifs = Table[ + publicreportImageExifColumns, + publicreportImageExifIndexes, + publicreportImageExifForeignKeys, + publicreportImageExifUniques, + publicreportImageExifChecks, +]{ + Schema: "publicreport", + Name: "image_exif", + Columns: publicreportImageExifColumns{ + ImageID: column{ + Name: "image_id", + DBType: "integer", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + Name: column{ + Name: "name", + DBType: "text", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + Value: column{ + Name: "value", + DBType: "text", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + }, + Indexes: publicreportImageExifIndexes{ + ImageExifPkey: index{ + Type: "btree", + Name: "image_exif_pkey", + Columns: []indexColumn{ + { + Name: "image_id", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + { + Name: "name", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + { + Name: "value", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + }, + Unique: true, + Comment: "", + NullsFirst: []bool{false, false, false}, + NullsDistinct: false, + Where: "", + Include: []string{}, + }, + }, + PrimaryKey: &constraint{ + Name: "image_exif_pkey", + Columns: []string{"image_id", "name", "value"}, + Comment: "", + }, + ForeignKeys: publicreportImageExifForeignKeys{ + PublicreportImageExifImageExifImageIDFkey: foreignKey{ + constraint: constraint{ + Name: "publicreport.image_exif.image_exif_image_id_fkey", + Columns: []string{"image_id"}, + Comment: "", + }, + ForeignTable: "publicreport.image", + ForeignColumns: []string{"id"}, + }, + }, + + Comment: "", +} + +type publicreportImageExifColumns struct { + ImageID column + Name column + Value column +} + +func (c publicreportImageExifColumns) AsSlice() []column { + return []column{ + c.ImageID, c.Name, c.Value, + } +} + +type publicreportImageExifIndexes struct { + ImageExifPkey index +} + +func (i publicreportImageExifIndexes) AsSlice() []index { + return []index{ + i.ImageExifPkey, + } +} + +type publicreportImageExifForeignKeys struct { + PublicreportImageExifImageExifImageIDFkey foreignKey +} + +func (f publicreportImageExifForeignKeys) AsSlice() []foreignKey { + return []foreignKey{ + f.PublicreportImageExifImageExifImageIDFkey, + } +} + +type publicreportImageExifUniques struct{} + +func (u publicreportImageExifUniques) AsSlice() []constraint { + return []constraint{} +} + +type publicreportImageExifChecks struct{} + +func (c publicreportImageExifChecks) AsSlice() []check { + return []check{} +} diff --git a/db/dbinfo/publicreport.pool_image.bob.go b/db/dbinfo/publicreport.pool_image.bob.go new file mode 100644 index 00000000..cb44e9b9 --- /dev/null +++ b/db/dbinfo/publicreport.pool_image.bob.go @@ -0,0 +1,132 @@ +// Code generated by BobGen psql v0.42.1. 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 PublicreportPoolImages = Table[ + publicreportPoolImageColumns, + publicreportPoolImageIndexes, + publicreportPoolImageForeignKeys, + publicreportPoolImageUniques, + publicreportPoolImageChecks, +]{ + Schema: "publicreport", + Name: "pool_image", + Columns: publicreportPoolImageColumns{ + ImageID: column{ + Name: "image_id", + DBType: "integer", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + PoolID: column{ + Name: "pool_id", + DBType: "integer", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + }, + Indexes: publicreportPoolImageIndexes{ + PoolImagePkey: index{ + Type: "btree", + Name: "pool_image_pkey", + Columns: []indexColumn{ + { + Name: "image_id", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + { + Name: "pool_id", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + }, + Unique: true, + Comment: "", + NullsFirst: []bool{false, false}, + NullsDistinct: false, + Where: "", + Include: []string{}, + }, + }, + PrimaryKey: &constraint{ + Name: "pool_image_pkey", + Columns: []string{"image_id", "pool_id"}, + Comment: "", + }, + ForeignKeys: publicreportPoolImageForeignKeys{ + PublicreportPoolImagePoolImageImageIDFkey: foreignKey{ + constraint: constraint{ + Name: "publicreport.pool_image.pool_image_image_id_fkey", + Columns: []string{"image_id"}, + Comment: "", + }, + ForeignTable: "publicreport.image", + ForeignColumns: []string{"id"}, + }, + PublicreportPoolImagePoolImagePoolIDFkey: foreignKey{ + constraint: constraint{ + Name: "publicreport.pool_image.pool_image_pool_id_fkey", + Columns: []string{"pool_id"}, + Comment: "", + }, + ForeignTable: "publicreport.pool", + ForeignColumns: []string{"id"}, + }, + }, + + Comment: "", +} + +type publicreportPoolImageColumns struct { + ImageID column + PoolID column +} + +func (c publicreportPoolImageColumns) AsSlice() []column { + return []column{ + c.ImageID, c.PoolID, + } +} + +type publicreportPoolImageIndexes struct { + PoolImagePkey index +} + +func (i publicreportPoolImageIndexes) AsSlice() []index { + return []index{ + i.PoolImagePkey, + } +} + +type publicreportPoolImageForeignKeys struct { + PublicreportPoolImagePoolImageImageIDFkey foreignKey + PublicreportPoolImagePoolImagePoolIDFkey foreignKey +} + +func (f publicreportPoolImageForeignKeys) AsSlice() []foreignKey { + return []foreignKey{ + f.PublicreportPoolImagePoolImageImageIDFkey, f.PublicreportPoolImagePoolImagePoolIDFkey, + } +} + +type publicreportPoolImageUniques struct{} + +func (u publicreportPoolImageUniques) AsSlice() []constraint { + return []constraint{} +} + +type publicreportPoolImageChecks struct{} + +func (c publicreportPoolImageChecks) AsSlice() []check { + return []check{} +} diff --git a/db/dbinfo/publicreport.pool_photo.bob.go b/db/dbinfo/publicreport.pool_photo.bob.go deleted file mode 100644 index 8b116463..00000000 --- a/db/dbinfo/publicreport.pool_photo.bob.go +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by BobGen psql v0.42.1. 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 PublicreportPoolPhotos = Table[ - publicreportPoolPhotoColumns, - publicreportPoolPhotoIndexes, - publicreportPoolPhotoForeignKeys, - publicreportPoolPhotoUniques, - publicreportPoolPhotoChecks, -]{ - Schema: "publicreport", - Name: "pool_photo", - Columns: publicreportPoolPhotoColumns{ - ID: column{ - Name: "id", - DBType: "integer", - Default: "nextval('publicreport.pool_photo_id_seq'::regclass)", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - Size: column{ - Name: "size", - DBType: "bigint", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - Filename: column{ - Name: "filename", - DBType: "text", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - PoolID: column{ - Name: "pool_id", - DBType: "integer", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - UUID: column{ - Name: "uuid", - DBType: "uuid", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - }, - Indexes: publicreportPoolPhotoIndexes{ - PoolPhotoPkey: index{ - Type: "btree", - Name: "pool_photo_pkey", - Columns: []indexColumn{ - { - Name: "id", - Desc: null.FromCond(false, true), - IsExpression: false, - }, - }, - Unique: true, - Comment: "", - NullsFirst: []bool{false}, - NullsDistinct: false, - Where: "", - Include: []string{}, - }, - }, - PrimaryKey: &constraint{ - Name: "pool_photo_pkey", - Columns: []string{"id"}, - Comment: "", - }, - ForeignKeys: publicreportPoolPhotoForeignKeys{ - PublicreportPoolPhotoPoolPhotoPoolIDFkey: foreignKey{ - constraint: constraint{ - Name: "publicreport.pool_photo.pool_photo_pool_id_fkey", - Columns: []string{"pool_id"}, - Comment: "", - }, - ForeignTable: "publicreport.pool", - ForeignColumns: []string{"id"}, - }, - }, - - Comment: "", -} - -type publicreportPoolPhotoColumns struct { - ID column - Size column - Filename column - PoolID column - UUID column -} - -func (c publicreportPoolPhotoColumns) AsSlice() []column { - return []column{ - c.ID, c.Size, c.Filename, c.PoolID, c.UUID, - } -} - -type publicreportPoolPhotoIndexes struct { - PoolPhotoPkey index -} - -func (i publicreportPoolPhotoIndexes) AsSlice() []index { - return []index{ - i.PoolPhotoPkey, - } -} - -type publicreportPoolPhotoForeignKeys struct { - PublicreportPoolPhotoPoolPhotoPoolIDFkey foreignKey -} - -func (f publicreportPoolPhotoForeignKeys) AsSlice() []foreignKey { - return []foreignKey{ - f.PublicreportPoolPhotoPoolPhotoPoolIDFkey, - } -} - -type publicreportPoolPhotoUniques struct{} - -func (u publicreportPoolPhotoUniques) AsSlice() []constraint { - return []constraint{} -} - -type publicreportPoolPhotoChecks struct{} - -func (c publicreportPoolPhotoChecks) AsSlice() []check { - return []check{} -} diff --git a/db/dbinfo/publicreport.quick_image.bob.go b/db/dbinfo/publicreport.quick_image.bob.go new file mode 100644 index 00000000..d311615b --- /dev/null +++ b/db/dbinfo/publicreport.quick_image.bob.go @@ -0,0 +1,132 @@ +// Code generated by BobGen psql v0.42.1. 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 PublicreportQuickImages = Table[ + publicreportQuickImageColumns, + publicreportQuickImageIndexes, + publicreportQuickImageForeignKeys, + publicreportQuickImageUniques, + publicreportQuickImageChecks, +]{ + Schema: "publicreport", + Name: "quick_image", + Columns: publicreportQuickImageColumns{ + ImageID: column{ + Name: "image_id", + DBType: "integer", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + QuickID: column{ + Name: "quick_id", + DBType: "integer", + Default: "", + Comment: "", + Nullable: false, + Generated: false, + AutoIncr: false, + }, + }, + Indexes: publicreportQuickImageIndexes{ + QuickImagePkey: index{ + Type: "btree", + Name: "quick_image_pkey", + Columns: []indexColumn{ + { + Name: "image_id", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + { + Name: "quick_id", + Desc: null.FromCond(false, true), + IsExpression: false, + }, + }, + Unique: true, + Comment: "", + NullsFirst: []bool{false, false}, + NullsDistinct: false, + Where: "", + Include: []string{}, + }, + }, + PrimaryKey: &constraint{ + Name: "quick_image_pkey", + Columns: []string{"image_id", "quick_id"}, + Comment: "", + }, + ForeignKeys: publicreportQuickImageForeignKeys{ + PublicreportQuickImageQuickImageImageIDFkey: foreignKey{ + constraint: constraint{ + Name: "publicreport.quick_image.quick_image_image_id_fkey", + Columns: []string{"image_id"}, + Comment: "", + }, + ForeignTable: "publicreport.image", + ForeignColumns: []string{"id"}, + }, + PublicreportQuickImageQuickImageQuickIDFkey: foreignKey{ + constraint: constraint{ + Name: "publicreport.quick_image.quick_image_quick_id_fkey", + Columns: []string{"quick_id"}, + Comment: "", + }, + ForeignTable: "publicreport.quick", + ForeignColumns: []string{"id"}, + }, + }, + + Comment: "", +} + +type publicreportQuickImageColumns struct { + ImageID column + QuickID column +} + +func (c publicreportQuickImageColumns) AsSlice() []column { + return []column{ + c.ImageID, c.QuickID, + } +} + +type publicreportQuickImageIndexes struct { + QuickImagePkey index +} + +func (i publicreportQuickImageIndexes) AsSlice() []index { + return []index{ + i.QuickImagePkey, + } +} + +type publicreportQuickImageForeignKeys struct { + PublicreportQuickImageQuickImageImageIDFkey foreignKey + PublicreportQuickImageQuickImageQuickIDFkey foreignKey +} + +func (f publicreportQuickImageForeignKeys) AsSlice() []foreignKey { + return []foreignKey{ + f.PublicreportQuickImageQuickImageImageIDFkey, f.PublicreportQuickImageQuickImageQuickIDFkey, + } +} + +type publicreportQuickImageUniques struct{} + +func (u publicreportQuickImageUniques) AsSlice() []constraint { + return []constraint{} +} + +type publicreportQuickImageChecks struct{} + +func (c publicreportQuickImageChecks) AsSlice() []check { + return []check{} +} diff --git a/db/dbinfo/publicreport.quick_photo.bob.go b/db/dbinfo/publicreport.quick_photo.bob.go deleted file mode 100644 index f827d142..00000000 --- a/db/dbinfo/publicreport.quick_photo.bob.go +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by BobGen psql v0.42.1. 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 PublicreportQuickPhotos = Table[ - publicreportQuickPhotoColumns, - publicreportQuickPhotoIndexes, - publicreportQuickPhotoForeignKeys, - publicreportQuickPhotoUniques, - publicreportQuickPhotoChecks, -]{ - Schema: "publicreport", - Name: "quick_photo", - Columns: publicreportQuickPhotoColumns{ - ID: column{ - Name: "id", - DBType: "integer", - Default: "nextval('publicreport.quick_photo_id_seq'::regclass)", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - Size: column{ - Name: "size", - DBType: "bigint", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - Filename: column{ - Name: "filename", - DBType: "text", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - QuickID: column{ - Name: "quick_id", - DBType: "integer", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - UUID: column{ - Name: "uuid", - DBType: "uuid", - Default: "", - Comment: "", - Nullable: false, - Generated: false, - AutoIncr: false, - }, - }, - Indexes: publicreportQuickPhotoIndexes{ - QuickPhotoPkey: index{ - Type: "btree", - Name: "quick_photo_pkey", - Columns: []indexColumn{ - { - Name: "id", - Desc: null.FromCond(false, true), - IsExpression: false, - }, - }, - Unique: true, - Comment: "", - NullsFirst: []bool{false}, - NullsDistinct: false, - Where: "", - Include: []string{}, - }, - }, - PrimaryKey: &constraint{ - Name: "quick_photo_pkey", - Columns: []string{"id"}, - Comment: "", - }, - ForeignKeys: publicreportQuickPhotoForeignKeys{ - PublicreportQuickPhotoQuickPhotoQuickIDFkey: foreignKey{ - constraint: constraint{ - Name: "publicreport.quick_photo.quick_photo_quick_id_fkey", - Columns: []string{"quick_id"}, - Comment: "", - }, - ForeignTable: "publicreport.quick", - ForeignColumns: []string{"id"}, - }, - }, - - Comment: "", -} - -type publicreportQuickPhotoColumns struct { - ID column - Size column - Filename column - QuickID column - UUID column -} - -func (c publicreportQuickPhotoColumns) AsSlice() []column { - return []column{ - c.ID, c.Size, c.Filename, c.QuickID, c.UUID, - } -} - -type publicreportQuickPhotoIndexes struct { - QuickPhotoPkey index -} - -func (i publicreportQuickPhotoIndexes) AsSlice() []index { - return []index{ - i.QuickPhotoPkey, - } -} - -type publicreportQuickPhotoForeignKeys struct { - PublicreportQuickPhotoQuickPhotoQuickIDFkey foreignKey -} - -func (f publicreportQuickPhotoForeignKeys) AsSlice() []foreignKey { - return []foreignKey{ - f.PublicreportQuickPhotoQuickPhotoQuickIDFkey, - } -} - -type publicreportQuickPhotoUniques struct{} - -func (u publicreportQuickPhotoUniques) AsSlice() []constraint { - return []constraint{} -} - -type publicreportQuickPhotoChecks struct{} - -func (c publicreportQuickPhotoChecks) AsSlice() []check { - return []check{} -} diff --git a/db/factory/bobfactory_context.bob.go b/db/factory/bobfactory_context.bob.go index 289d2646..7e9c7a84 100644 --- a/db/factory/bobfactory_context.bob.go +++ b/db/factory/bobfactory_context.bob.go @@ -222,24 +222,36 @@ var ( organizationRelImportDistrictGidDistrictCtx = newContextual[bool]("import.district.organization.organization.organization_import_district_gid_fkey") organizationRelUserCtx = newContextual[bool]("organization.user_.user_.user__organization_id_fkey") + // Relationship Contexts for publicreport.image + publicreportImageWithParentsCascadingCtx = newContextual[bool]("publicreportImageWithParentsCascading") + publicreportImageRelImageExifsCtx = newContextual[bool]("publicreport.image.publicreport.image_exif.publicreport.image_exif.image_exif_image_id_fkey") + publicreportImageRelPoolsCtx = newContextual[bool]("publicreport.image.publicreport.pool.publicreport.pool_image.pool_image_image_id_fkeypublicreport.pool_image.pool_image_pool_id_fkey") + publicreportImageRelQuicksCtx = newContextual[bool]("publicreport.image.publicreport.quick.publicreport.quick_image.quick_image_image_id_fkeypublicreport.quick_image.quick_image_quick_id_fkey") + + // Relationship Contexts for publicreport.image_exif + publicreportImageExifWithParentsCascadingCtx = newContextual[bool]("publicreportImageExifWithParentsCascading") + publicreportImageExifRelImageCtx = newContextual[bool]("publicreport.image.publicreport.image_exif.publicreport.image_exif.image_exif_image_id_fkey") + // Relationship Contexts for publicreport.nuisance publicreportNuisanceWithParentsCascadingCtx = newContextual[bool]("publicreportNuisanceWithParentsCascading") // Relationship Contexts for publicreport.pool publicreportPoolWithParentsCascadingCtx = newContextual[bool]("publicreportPoolWithParentsCascading") - publicreportPoolRelPoolPhotosCtx = newContextual[bool]("publicreport.pool.publicreport.pool_photo.publicreport.pool_photo.pool_photo_pool_id_fkey") + publicreportPoolRelImagesCtx = newContextual[bool]("publicreport.image.publicreport.pool.publicreport.pool_image.pool_image_image_id_fkeypublicreport.pool_image.pool_image_pool_id_fkey") - // Relationship Contexts for publicreport.pool_photo - publicreportPoolPhotoWithParentsCascadingCtx = newContextual[bool]("publicreportPoolPhotoWithParentsCascading") - publicreportPoolPhotoRelPoolCtx = newContextual[bool]("publicreport.pool.publicreport.pool_photo.publicreport.pool_photo.pool_photo_pool_id_fkey") + // Relationship Contexts for publicreport.pool_image + publicreportPoolImageWithParentsCascadingCtx = newContextual[bool]("publicreportPoolImageWithParentsCascading") + publicreportPoolImageRelImageCtx = newContextual[bool]("publicreport.image.publicreport.pool_image.publicreport.pool_image.pool_image_image_id_fkey") + publicreportPoolImageRelPoolCtx = newContextual[bool]("publicreport.pool.publicreport.pool_image.publicreport.pool_image.pool_image_pool_id_fkey") // Relationship Contexts for publicreport.quick publicreportQuickWithParentsCascadingCtx = newContextual[bool]("publicreportQuickWithParentsCascading") - publicreportQuickRelQuickPhotosCtx = newContextual[bool]("publicreport.quick.publicreport.quick_photo.publicreport.quick_photo.quick_photo_quick_id_fkey") + publicreportQuickRelImagesCtx = newContextual[bool]("publicreport.image.publicreport.quick.publicreport.quick_image.quick_image_image_id_fkeypublicreport.quick_image.quick_image_quick_id_fkey") - // Relationship Contexts for publicreport.quick_photo - publicreportQuickPhotoWithParentsCascadingCtx = newContextual[bool]("publicreportQuickPhotoWithParentsCascading") - publicreportQuickPhotoRelQuickCtx = newContextual[bool]("publicreport.quick.publicreport.quick_photo.publicreport.quick_photo.quick_photo_quick_id_fkey") + // Relationship Contexts for publicreport.quick_image + publicreportQuickImageWithParentsCascadingCtx = newContextual[bool]("publicreportQuickImageWithParentsCascading") + publicreportQuickImageRelImageCtx = newContextual[bool]("publicreport.image.publicreport.quick_image.publicreport.quick_image.quick_image_image_id_fkey") + publicreportQuickImageRelQuickCtx = newContextual[bool]("publicreport.quick.publicreport.quick_image.publicreport.quick_image.quick_image_quick_id_fkey") // Relationship Contexts for publicreport.report_location publicreportReportLocationWithParentsCascadingCtx = newContextual[bool]("publicreportReportLocationWithParentsCascading") diff --git a/db/factory/bobfactory_main.bob.go b/db/factory/bobfactory_main.bob.go index eadbf506..d184b64e 100644 --- a/db/factory/bobfactory_main.bob.go +++ b/db/factory/bobfactory_main.bob.go @@ -62,11 +62,13 @@ type Factory struct { baseNotificationMods NotificationModSlice baseOauthTokenMods OauthTokenModSlice baseOrganizationMods OrganizationModSlice + basePublicreportImageMods PublicreportImageModSlice + basePublicreportImageExifMods PublicreportImageExifModSlice basePublicreportNuisanceMods PublicreportNuisanceModSlice basePublicreportPoolMods PublicreportPoolModSlice - basePublicreportPoolPhotoMods PublicreportPoolPhotoModSlice + basePublicreportPoolImageMods PublicreportPoolImageModSlice basePublicreportQuickMods PublicreportQuickModSlice - basePublicreportQuickPhotoMods PublicreportQuickPhotoModSlice + basePublicreportQuickImageMods PublicreportQuickImageModSlice basePublicreportReportLocationMods PublicreportReportLocationModSlice baseRasterColumnMods RasterColumnModSlice baseRasterOverviewMods RasterOverviewModSlice @@ -2512,6 +2514,79 @@ func (f *Factory) FromExistingOrganization(m *models.Organization) *Organization return o } +func (f *Factory) NewPublicreportImage(mods ...PublicreportImageMod) *PublicreportImageTemplate { + return f.NewPublicreportImageWithContext(context.Background(), mods...) +} + +func (f *Factory) NewPublicreportImageWithContext(ctx context.Context, mods ...PublicreportImageMod) *PublicreportImageTemplate { + o := &PublicreportImageTemplate{f: f} + + if f != nil { + f.basePublicreportImageMods.Apply(ctx, o) + } + + PublicreportImageModSlice(mods).Apply(ctx, o) + + return o +} + +func (f *Factory) FromExistingPublicreportImage(m *models.PublicreportImage) *PublicreportImageTemplate { + o := &PublicreportImageTemplate{f: f, alreadyPersisted: true} + + o.ID = func() int32 { return m.ID } + o.ContentType = func() string { return m.ContentType } + o.Created = func() time.Time { return m.Created } + o.ResolutionX = func() int32 { return m.ResolutionX } + o.ResolutionY = func() int32 { return m.ResolutionY } + o.StorageUUID = func() uuid.UUID { return m.StorageUUID } + o.StorageSize = func() int64 { return m.StorageSize } + o.UploadedFilename = func() string { return m.UploadedFilename } + + ctx := context.Background() + if len(m.R.ImageExifs) > 0 { + PublicreportImageMods.AddExistingImageExifs(m.R.ImageExifs...).Apply(ctx, o) + } + if len(m.R.Pools) > 0 { + PublicreportImageMods.AddExistingPools(m.R.Pools...).Apply(ctx, o) + } + if len(m.R.Quicks) > 0 { + PublicreportImageMods.AddExistingQuicks(m.R.Quicks...).Apply(ctx, o) + } + + return o +} + +func (f *Factory) NewPublicreportImageExif(mods ...PublicreportImageExifMod) *PublicreportImageExifTemplate { + return f.NewPublicreportImageExifWithContext(context.Background(), mods...) +} + +func (f *Factory) NewPublicreportImageExifWithContext(ctx context.Context, mods ...PublicreportImageExifMod) *PublicreportImageExifTemplate { + o := &PublicreportImageExifTemplate{f: f} + + if f != nil { + f.basePublicreportImageExifMods.Apply(ctx, o) + } + + PublicreportImageExifModSlice(mods).Apply(ctx, o) + + return o +} + +func (f *Factory) FromExistingPublicreportImageExif(m *models.PublicreportImageExif) *PublicreportImageExifTemplate { + o := &PublicreportImageExifTemplate{f: f, alreadyPersisted: true} + + o.ImageID = func() int32 { return m.ImageID } + o.Name = func() string { return m.Name } + o.Value = func() string { return m.Value } + + ctx := context.Background() + if m.R.Image != nil { + PublicreportImageExifMods.WithExistingImage(m.R.Image).Apply(ctx, o) + } + + return o +} + func (f *Factory) NewPublicreportNuisance(mods ...PublicreportNuisanceMod) *PublicreportNuisanceTemplate { return f.NewPublicreportNuisanceWithContext(context.Background(), mods...) } @@ -2613,41 +2688,41 @@ func (f *Factory) FromExistingPublicreportPool(m *models.PublicreportPool) *Publ o.Status = func() enums.PublicreportReportstatustype { return m.Status } ctx := context.Background() - if len(m.R.PoolPhotos) > 0 { - PublicreportPoolMods.AddExistingPoolPhotos(m.R.PoolPhotos...).Apply(ctx, o) + if len(m.R.Images) > 0 { + PublicreportPoolMods.AddExistingImages(m.R.Images...).Apply(ctx, o) } return o } -func (f *Factory) NewPublicreportPoolPhoto(mods ...PublicreportPoolPhotoMod) *PublicreportPoolPhotoTemplate { - return f.NewPublicreportPoolPhotoWithContext(context.Background(), mods...) +func (f *Factory) NewPublicreportPoolImage(mods ...PublicreportPoolImageMod) *PublicreportPoolImageTemplate { + return f.NewPublicreportPoolImageWithContext(context.Background(), mods...) } -func (f *Factory) NewPublicreportPoolPhotoWithContext(ctx context.Context, mods ...PublicreportPoolPhotoMod) *PublicreportPoolPhotoTemplate { - o := &PublicreportPoolPhotoTemplate{f: f} +func (f *Factory) NewPublicreportPoolImageWithContext(ctx context.Context, mods ...PublicreportPoolImageMod) *PublicreportPoolImageTemplate { + o := &PublicreportPoolImageTemplate{f: f} if f != nil { - f.basePublicreportPoolPhotoMods.Apply(ctx, o) + f.basePublicreportPoolImageMods.Apply(ctx, o) } - PublicreportPoolPhotoModSlice(mods).Apply(ctx, o) + PublicreportPoolImageModSlice(mods).Apply(ctx, o) return o } -func (f *Factory) FromExistingPublicreportPoolPhoto(m *models.PublicreportPoolPhoto) *PublicreportPoolPhotoTemplate { - o := &PublicreportPoolPhotoTemplate{f: f, alreadyPersisted: true} +func (f *Factory) FromExistingPublicreportPoolImage(m *models.PublicreportPoolImage) *PublicreportPoolImageTemplate { + o := &PublicreportPoolImageTemplate{f: f, alreadyPersisted: true} - o.ID = func() int32 { return m.ID } - o.Size = func() int64 { return m.Size } - o.Filename = func() string { return m.Filename } + o.ImageID = func() int32 { return m.ImageID } o.PoolID = func() int32 { return m.PoolID } - o.UUID = func() uuid.UUID { return m.UUID } ctx := context.Background() + if m.R.Image != nil { + PublicreportPoolImageMods.WithExistingImage(m.R.Image).Apply(ctx, o) + } if m.R.Pool != nil { - PublicreportPoolPhotoMods.WithExistingPool(m.R.Pool).Apply(ctx, o) + PublicreportPoolImageMods.WithExistingPool(m.R.Pool).Apply(ctx, o) } return o @@ -2684,41 +2759,41 @@ func (f *Factory) FromExistingPublicreportQuick(m *models.PublicreportQuick) *Pu o.Status = func() enums.PublicreportReportstatustype { return m.Status } ctx := context.Background() - if len(m.R.QuickPhotos) > 0 { - PublicreportQuickMods.AddExistingQuickPhotos(m.R.QuickPhotos...).Apply(ctx, o) + if len(m.R.Images) > 0 { + PublicreportQuickMods.AddExistingImages(m.R.Images...).Apply(ctx, o) } return o } -func (f *Factory) NewPublicreportQuickPhoto(mods ...PublicreportQuickPhotoMod) *PublicreportQuickPhotoTemplate { - return f.NewPublicreportQuickPhotoWithContext(context.Background(), mods...) +func (f *Factory) NewPublicreportQuickImage(mods ...PublicreportQuickImageMod) *PublicreportQuickImageTemplate { + return f.NewPublicreportQuickImageWithContext(context.Background(), mods...) } -func (f *Factory) NewPublicreportQuickPhotoWithContext(ctx context.Context, mods ...PublicreportQuickPhotoMod) *PublicreportQuickPhotoTemplate { - o := &PublicreportQuickPhotoTemplate{f: f} +func (f *Factory) NewPublicreportQuickImageWithContext(ctx context.Context, mods ...PublicreportQuickImageMod) *PublicreportQuickImageTemplate { + o := &PublicreportQuickImageTemplate{f: f} if f != nil { - f.basePublicreportQuickPhotoMods.Apply(ctx, o) + f.basePublicreportQuickImageMods.Apply(ctx, o) } - PublicreportQuickPhotoModSlice(mods).Apply(ctx, o) + PublicreportQuickImageModSlice(mods).Apply(ctx, o) return o } -func (f *Factory) FromExistingPublicreportQuickPhoto(m *models.PublicreportQuickPhoto) *PublicreportQuickPhotoTemplate { - o := &PublicreportQuickPhotoTemplate{f: f, alreadyPersisted: true} +func (f *Factory) FromExistingPublicreportQuickImage(m *models.PublicreportQuickImage) *PublicreportQuickImageTemplate { + o := &PublicreportQuickImageTemplate{f: f, alreadyPersisted: true} - o.ID = func() int32 { return m.ID } - o.Size = func() int64 { return m.Size } - o.Filename = func() string { return m.Filename } + o.ImageID = func() int32 { return m.ImageID } o.QuickID = func() int32 { return m.QuickID } - o.UUID = func() uuid.UUID { return m.UUID } ctx := context.Background() + if m.R.Image != nil { + PublicreportQuickImageMods.WithExistingImage(m.R.Image).Apply(ctx, o) + } if m.R.Quick != nil { - PublicreportQuickPhotoMods.WithExistingQuick(m.R.Quick).Apply(ctx, o) + PublicreportQuickImageMods.WithExistingQuick(m.R.Quick).Apply(ctx, o) } return o @@ -3293,6 +3368,22 @@ func (f *Factory) AddBaseOrganizationMod(mods ...OrganizationMod) { f.baseOrganizationMods = append(f.baseOrganizationMods, mods...) } +func (f *Factory) ClearBasePublicreportImageMods() { + f.basePublicreportImageMods = nil +} + +func (f *Factory) AddBasePublicreportImageMod(mods ...PublicreportImageMod) { + f.basePublicreportImageMods = append(f.basePublicreportImageMods, mods...) +} + +func (f *Factory) ClearBasePublicreportImageExifMods() { + f.basePublicreportImageExifMods = nil +} + +func (f *Factory) AddBasePublicreportImageExifMod(mods ...PublicreportImageExifMod) { + f.basePublicreportImageExifMods = append(f.basePublicreportImageExifMods, mods...) +} + func (f *Factory) ClearBasePublicreportNuisanceMods() { f.basePublicreportNuisanceMods = nil } @@ -3309,12 +3400,12 @@ func (f *Factory) AddBasePublicreportPoolMod(mods ...PublicreportPoolMod) { f.basePublicreportPoolMods = append(f.basePublicreportPoolMods, mods...) } -func (f *Factory) ClearBasePublicreportPoolPhotoMods() { - f.basePublicreportPoolPhotoMods = nil +func (f *Factory) ClearBasePublicreportPoolImageMods() { + f.basePublicreportPoolImageMods = nil } -func (f *Factory) AddBasePublicreportPoolPhotoMod(mods ...PublicreportPoolPhotoMod) { - f.basePublicreportPoolPhotoMods = append(f.basePublicreportPoolPhotoMods, mods...) +func (f *Factory) AddBasePublicreportPoolImageMod(mods ...PublicreportPoolImageMod) { + f.basePublicreportPoolImageMods = append(f.basePublicreportPoolImageMods, mods...) } func (f *Factory) ClearBasePublicreportQuickMods() { @@ -3325,12 +3416,12 @@ func (f *Factory) AddBasePublicreportQuickMod(mods ...PublicreportQuickMod) { f.basePublicreportQuickMods = append(f.basePublicreportQuickMods, mods...) } -func (f *Factory) ClearBasePublicreportQuickPhotoMods() { - f.basePublicreportQuickPhotoMods = nil +func (f *Factory) ClearBasePublicreportQuickImageMods() { + f.basePublicreportQuickImageMods = nil } -func (f *Factory) AddBasePublicreportQuickPhotoMod(mods ...PublicreportQuickPhotoMod) { - f.basePublicreportQuickPhotoMods = append(f.basePublicreportQuickPhotoMods, mods...) +func (f *Factory) AddBasePublicreportQuickImageMod(mods ...PublicreportQuickImageMod) { + f.basePublicreportQuickImageMods = append(f.basePublicreportQuickImageMods, mods...) } func (f *Factory) ClearBasePublicreportReportLocationMods() { diff --git a/db/factory/publicreport.image.bob.go b/db/factory/publicreport.image.bob.go new file mode 100644 index 00000000..3d292ad4 --- /dev/null +++ b/db/factory/publicreport.image.bob.go @@ -0,0 +1,822 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package factory + +import ( + "context" + "testing" + "time" + + models "github.com/Gleipnir-Technology/nidus-sync/db/models" + "github.com/aarondl/opt/omit" + "github.com/google/uuid" + "github.com/jaswdr/faker/v2" + "github.com/stephenafamo/bob" +) + +type PublicreportImageMod interface { + Apply(context.Context, *PublicreportImageTemplate) +} + +type PublicreportImageModFunc func(context.Context, *PublicreportImageTemplate) + +func (f PublicreportImageModFunc) Apply(ctx context.Context, n *PublicreportImageTemplate) { + f(ctx, n) +} + +type PublicreportImageModSlice []PublicreportImageMod + +func (mods PublicreportImageModSlice) Apply(ctx context.Context, n *PublicreportImageTemplate) { + for _, f := range mods { + f.Apply(ctx, n) + } +} + +// PublicreportImageTemplate is an object representing the database table. +// all columns are optional and should be set by mods +type PublicreportImageTemplate struct { + ID func() int32 + ContentType func() string + Created func() time.Time + ResolutionX func() int32 + ResolutionY func() int32 + StorageUUID func() uuid.UUID + StorageSize func() int64 + UploadedFilename func() string + + r publicreportImageR + f *Factory + + alreadyPersisted bool +} + +type publicreportImageR struct { + ImageExifs []*publicreportImageRImageExifsR + Pools []*publicreportImageRPoolsR + Quicks []*publicreportImageRQuicksR +} + +type publicreportImageRImageExifsR struct { + number int + o *PublicreportImageExifTemplate +} +type publicreportImageRPoolsR struct { + number int + o *PublicreportPoolTemplate +} +type publicreportImageRQuicksR struct { + number int + o *PublicreportQuickTemplate +} + +// Apply mods to the PublicreportImageTemplate +func (o *PublicreportImageTemplate) Apply(ctx context.Context, mods ...PublicreportImageMod) { + for _, mod := range mods { + mod.Apply(ctx, o) + } +} + +// setModelRels creates and sets the relationships on *models.PublicreportImage +// according to the relationships in the template. Nothing is inserted into the db +func (t PublicreportImageTemplate) setModelRels(o *models.PublicreportImage) { + if t.r.ImageExifs != nil { + rel := models.PublicreportImageExifSlice{} + for _, r := range t.r.ImageExifs { + related := r.o.BuildMany(r.number) + for _, rel := range related { + rel.ImageID = o.ID // h2 + rel.R.Image = o + } + rel = append(rel, related...) + } + o.R.ImageExifs = rel + } + + if t.r.Pools != nil { + rel := models.PublicreportPoolSlice{} + for _, r := range t.r.Pools { + related := r.o.BuildMany(r.number) + for _, rel := range related { + rel.R.Images = append(rel.R.Images, o) + } + rel = append(rel, related...) + } + o.R.Pools = rel + } + + if t.r.Quicks != nil { + rel := models.PublicreportQuickSlice{} + for _, r := range t.r.Quicks { + related := r.o.BuildMany(r.number) + for _, rel := range related { + rel.R.Images = append(rel.R.Images, o) + } + rel = append(rel, related...) + } + o.R.Quicks = rel + } +} + +// BuildSetter returns an *models.PublicreportImageSetter +// this does nothing with the relationship templates +func (o PublicreportImageTemplate) BuildSetter() *models.PublicreportImageSetter { + m := &models.PublicreportImageSetter{} + + if o.ID != nil { + val := o.ID() + m.ID = omit.From(val) + } + if o.ContentType != nil { + val := o.ContentType() + m.ContentType = omit.From(val) + } + if o.Created != nil { + val := o.Created() + m.Created = omit.From(val) + } + if o.ResolutionX != nil { + val := o.ResolutionX() + m.ResolutionX = omit.From(val) + } + if o.ResolutionY != nil { + val := o.ResolutionY() + m.ResolutionY = omit.From(val) + } + if o.StorageUUID != nil { + val := o.StorageUUID() + m.StorageUUID = omit.From(val) + } + if o.StorageSize != nil { + val := o.StorageSize() + m.StorageSize = omit.From(val) + } + if o.UploadedFilename != nil { + val := o.UploadedFilename() + m.UploadedFilename = omit.From(val) + } + + return m +} + +// BuildManySetter returns an []*models.PublicreportImageSetter +// this does nothing with the relationship templates +func (o PublicreportImageTemplate) BuildManySetter(number int) []*models.PublicreportImageSetter { + m := make([]*models.PublicreportImageSetter, number) + + for i := range m { + m[i] = o.BuildSetter() + } + + return m +} + +// Build returns an *models.PublicreportImage +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportImageTemplate.Create +func (o PublicreportImageTemplate) Build() *models.PublicreportImage { + m := &models.PublicreportImage{} + + if o.ID != nil { + m.ID = o.ID() + } + if o.ContentType != nil { + m.ContentType = o.ContentType() + } + if o.Created != nil { + m.Created = o.Created() + } + if o.ResolutionX != nil { + m.ResolutionX = o.ResolutionX() + } + if o.ResolutionY != nil { + m.ResolutionY = o.ResolutionY() + } + if o.StorageUUID != nil { + m.StorageUUID = o.StorageUUID() + } + if o.StorageSize != nil { + m.StorageSize = o.StorageSize() + } + if o.UploadedFilename != nil { + m.UploadedFilename = o.UploadedFilename() + } + + o.setModelRels(m) + + return m +} + +// BuildMany returns an models.PublicreportImageSlice +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportImageTemplate.CreateMany +func (o PublicreportImageTemplate) BuildMany(number int) models.PublicreportImageSlice { + m := make(models.PublicreportImageSlice, number) + + for i := range m { + m[i] = o.Build() + } + + return m +} + +func ensureCreatablePublicreportImage(m *models.PublicreportImageSetter) { + if !(m.ContentType.IsValue()) { + val := random_string(nil) + m.ContentType = omit.From(val) + } + if !(m.Created.IsValue()) { + val := random_time_Time(nil) + m.Created = omit.From(val) + } + if !(m.ResolutionX.IsValue()) { + val := random_int32(nil) + m.ResolutionX = omit.From(val) + } + if !(m.ResolutionY.IsValue()) { + val := random_int32(nil) + m.ResolutionY = omit.From(val) + } + if !(m.StorageUUID.IsValue()) { + val := random_uuid_UUID(nil) + m.StorageUUID = omit.From(val) + } + if !(m.StorageSize.IsValue()) { + val := random_int64(nil) + m.StorageSize = omit.From(val) + } + if !(m.UploadedFilename.IsValue()) { + val := random_string(nil) + m.UploadedFilename = omit.From(val) + } +} + +// insertOptRels creates and inserts any optional the relationships on *models.PublicreportImage +// according to the relationships in the template. +// any required relationship should have already exist on the model +func (o *PublicreportImageTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportImage) error { + var err error + + isImageExifsDone, _ := publicreportImageRelImageExifsCtx.Value(ctx) + if !isImageExifsDone && o.r.ImageExifs != nil { + ctx = publicreportImageRelImageExifsCtx.WithValue(ctx, true) + for _, r := range o.r.ImageExifs { + if r.o.alreadyPersisted { + m.R.ImageExifs = append(m.R.ImageExifs, r.o.Build()) + } else { + rel0, err := r.o.CreateMany(ctx, exec, r.number) + if err != nil { + return err + } + + err = m.AttachImageExifs(ctx, exec, rel0...) + if err != nil { + return err + } + } + } + } + + isPoolsDone, _ := publicreportImageRelPoolsCtx.Value(ctx) + if !isPoolsDone && o.r.Pools != nil { + ctx = publicreportImageRelPoolsCtx.WithValue(ctx, true) + for _, r := range o.r.Pools { + if r.o.alreadyPersisted { + m.R.Pools = append(m.R.Pools, r.o.Build()) + } else { + rel1, err := r.o.CreateMany(ctx, exec, r.number) + if err != nil { + return err + } + + err = m.AttachPools(ctx, exec, rel1...) + if err != nil { + return err + } + } + } + } + + isQuicksDone, _ := publicreportImageRelQuicksCtx.Value(ctx) + if !isQuicksDone && o.r.Quicks != nil { + ctx = publicreportImageRelQuicksCtx.WithValue(ctx, true) + for _, r := range o.r.Quicks { + if r.o.alreadyPersisted { + m.R.Quicks = append(m.R.Quicks, r.o.Build()) + } else { + rel2, err := r.o.CreateMany(ctx, exec, r.number) + if err != nil { + return err + } + + err = m.AttachQuicks(ctx, exec, rel2...) + if err != nil { + return err + } + } + } + } + + return err +} + +// Create builds a publicreportImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +func (o *PublicreportImageTemplate) Create(ctx context.Context, exec bob.Executor) (*models.PublicreportImage, error) { + var err error + opt := o.BuildSetter() + ensureCreatablePublicreportImage(opt) + + m, err := models.PublicreportImages.Insert(opt).One(ctx, exec) + if err != nil { + return nil, err + } + + if err := o.insertOptRels(ctx, exec, m); err != nil { + return nil, err + } + return m, err +} + +// MustCreate builds a publicreportImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o *PublicreportImageTemplate) MustCreate(ctx context.Context, exec bob.Executor) *models.PublicreportImage { + m, err := o.Create(ctx, exec) + if err != nil { + panic(err) + } + return m +} + +// CreateOrFail builds a publicreportImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o *PublicreportImageTemplate) CreateOrFail(ctx context.Context, tb testing.TB, exec bob.Executor) *models.PublicreportImage { + tb.Helper() + m, err := o.Create(ctx, exec) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// CreateMany builds multiple publicreportImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +func (o PublicreportImageTemplate) CreateMany(ctx context.Context, exec bob.Executor, number int) (models.PublicreportImageSlice, error) { + var err error + m := make(models.PublicreportImageSlice, number) + + for i := range m { + m[i], err = o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + return m, nil +} + +// MustCreateMany builds multiple publicreportImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o PublicreportImageTemplate) MustCreateMany(ctx context.Context, exec bob.Executor, number int) models.PublicreportImageSlice { + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + panic(err) + } + return m +} + +// CreateManyOrFail builds multiple publicreportImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o PublicreportImageTemplate) CreateManyOrFail(ctx context.Context, tb testing.TB, exec bob.Executor, number int) models.PublicreportImageSlice { + tb.Helper() + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// PublicreportImage has methods that act as mods for the PublicreportImageTemplate +var PublicreportImageMods publicreportImageMods + +type publicreportImageMods struct{} + +func (m publicreportImageMods) RandomizeAllColumns(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModSlice{ + PublicreportImageMods.RandomID(f), + PublicreportImageMods.RandomContentType(f), + PublicreportImageMods.RandomCreated(f), + PublicreportImageMods.RandomResolutionX(f), + PublicreportImageMods.RandomResolutionY(f), + PublicreportImageMods.RandomStorageUUID(f), + PublicreportImageMods.RandomStorageSize(f), + PublicreportImageMods.RandomUploadedFilename(f), + } +} + +// Set the model columns to this value +func (m publicreportImageMods) ID(val int32) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ID = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) IDFunc(f func() int32) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ID = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetID() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ID = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomID(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ID = func() int32 { + return random_int32(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageMods) ContentType(val string) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ContentType = func() string { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) ContentTypeFunc(f func() string) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ContentType = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetContentType() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ContentType = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomContentType(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ContentType = func() string { + return random_string(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageMods) Created(val time.Time) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.Created = func() time.Time { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) CreatedFunc(f func() time.Time) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.Created = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetCreated() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.Created = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomCreated(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.Created = func() time.Time { + return random_time_Time(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageMods) ResolutionX(val int32) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionX = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) ResolutionXFunc(f func() int32) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionX = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetResolutionX() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionX = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomResolutionX(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionX = func() int32 { + return random_int32(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageMods) ResolutionY(val int32) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionY = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) ResolutionYFunc(f func() int32) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionY = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetResolutionY() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionY = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomResolutionY(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.ResolutionY = func() int32 { + return random_int32(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageMods) StorageUUID(val uuid.UUID) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageUUID = func() uuid.UUID { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) StorageUUIDFunc(f func() uuid.UUID) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageUUID = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetStorageUUID() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageUUID = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomStorageUUID(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageUUID = func() uuid.UUID { + return random_uuid_UUID(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageMods) StorageSize(val int64) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageSize = func() int64 { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) StorageSizeFunc(f func() int64) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageSize = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetStorageSize() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageSize = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomStorageSize(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.StorageSize = func() int64 { + return random_int64(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageMods) UploadedFilename(val string) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.UploadedFilename = func() string { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageMods) UploadedFilenameFunc(f func() string) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.UploadedFilename = f + }) +} + +// Clear any values for the column +func (m publicreportImageMods) UnsetUploadedFilename() PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.UploadedFilename = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageMods) RandomUploadedFilename(f *faker.Faker) PublicreportImageMod { + return PublicreportImageModFunc(func(_ context.Context, o *PublicreportImageTemplate) { + o.UploadedFilename = func() string { + return random_string(f) + } + }) +} + +func (m publicreportImageMods) WithParentsCascading() PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + if isDone, _ := publicreportImageWithParentsCascadingCtx.Value(ctx); isDone { + return + } + ctx = publicreportImageWithParentsCascadingCtx.WithValue(ctx, true) + }) +} + +func (m publicreportImageMods) WithImageExifs(number int, related *PublicreportImageExifTemplate) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.ImageExifs = []*publicreportImageRImageExifsR{{ + number: number, + o: related, + }} + }) +} + +func (m publicreportImageMods) WithNewImageExifs(number int, mods ...PublicreportImageExifMod) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + related := o.f.NewPublicreportImageExifWithContext(ctx, mods...) + m.WithImageExifs(number, related).Apply(ctx, o) + }) +} + +func (m publicreportImageMods) AddImageExifs(number int, related *PublicreportImageExifTemplate) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.ImageExifs = append(o.r.ImageExifs, &publicreportImageRImageExifsR{ + number: number, + o: related, + }) + }) +} + +func (m publicreportImageMods) AddNewImageExifs(number int, mods ...PublicreportImageExifMod) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + related := o.f.NewPublicreportImageExifWithContext(ctx, mods...) + m.AddImageExifs(number, related).Apply(ctx, o) + }) +} + +func (m publicreportImageMods) AddExistingImageExifs(existingModels ...*models.PublicreportImageExif) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + for _, em := range existingModels { + o.r.ImageExifs = append(o.r.ImageExifs, &publicreportImageRImageExifsR{ + o: o.f.FromExistingPublicreportImageExif(em), + }) + } + }) +} + +func (m publicreportImageMods) WithoutImageExifs() PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.ImageExifs = nil + }) +} + +func (m publicreportImageMods) WithPools(number int, related *PublicreportPoolTemplate) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.Pools = []*publicreportImageRPoolsR{{ + number: number, + o: related, + }} + }) +} + +func (m publicreportImageMods) WithNewPools(number int, mods ...PublicreportPoolMod) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + related := o.f.NewPublicreportPoolWithContext(ctx, mods...) + m.WithPools(number, related).Apply(ctx, o) + }) +} + +func (m publicreportImageMods) AddPools(number int, related *PublicreportPoolTemplate) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.Pools = append(o.r.Pools, &publicreportImageRPoolsR{ + number: number, + o: related, + }) + }) +} + +func (m publicreportImageMods) AddNewPools(number int, mods ...PublicreportPoolMod) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + related := o.f.NewPublicreportPoolWithContext(ctx, mods...) + m.AddPools(number, related).Apply(ctx, o) + }) +} + +func (m publicreportImageMods) AddExistingPools(existingModels ...*models.PublicreportPool) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + for _, em := range existingModels { + o.r.Pools = append(o.r.Pools, &publicreportImageRPoolsR{ + o: o.f.FromExistingPublicreportPool(em), + }) + } + }) +} + +func (m publicreportImageMods) WithoutPools() PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.Pools = nil + }) +} + +func (m publicreportImageMods) WithQuicks(number int, related *PublicreportQuickTemplate) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.Quicks = []*publicreportImageRQuicksR{{ + number: number, + o: related, + }} + }) +} + +func (m publicreportImageMods) WithNewQuicks(number int, mods ...PublicreportQuickMod) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + related := o.f.NewPublicreportQuickWithContext(ctx, mods...) + m.WithQuicks(number, related).Apply(ctx, o) + }) +} + +func (m publicreportImageMods) AddQuicks(number int, related *PublicreportQuickTemplate) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.Quicks = append(o.r.Quicks, &publicreportImageRQuicksR{ + number: number, + o: related, + }) + }) +} + +func (m publicreportImageMods) AddNewQuicks(number int, mods ...PublicreportQuickMod) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + related := o.f.NewPublicreportQuickWithContext(ctx, mods...) + m.AddQuicks(number, related).Apply(ctx, o) + }) +} + +func (m publicreportImageMods) AddExistingQuicks(existingModels ...*models.PublicreportQuick) PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + for _, em := range existingModels { + o.r.Quicks = append(o.r.Quicks, &publicreportImageRQuicksR{ + o: o.f.FromExistingPublicreportQuick(em), + }) + } + }) +} + +func (m publicreportImageMods) WithoutQuicks() PublicreportImageMod { + return PublicreportImageModFunc(func(ctx context.Context, o *PublicreportImageTemplate) { + o.r.Quicks = nil + }) +} diff --git a/db/factory/publicreport.image_exif.bob.go b/db/factory/publicreport.image_exif.bob.go new file mode 100644 index 00000000..742829a4 --- /dev/null +++ b/db/factory/publicreport.image_exif.bob.go @@ -0,0 +1,413 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package factory + +import ( + "context" + "testing" + + models "github.com/Gleipnir-Technology/nidus-sync/db/models" + "github.com/aarondl/opt/omit" + "github.com/jaswdr/faker/v2" + "github.com/stephenafamo/bob" +) + +type PublicreportImageExifMod interface { + Apply(context.Context, *PublicreportImageExifTemplate) +} + +type PublicreportImageExifModFunc func(context.Context, *PublicreportImageExifTemplate) + +func (f PublicreportImageExifModFunc) Apply(ctx context.Context, n *PublicreportImageExifTemplate) { + f(ctx, n) +} + +type PublicreportImageExifModSlice []PublicreportImageExifMod + +func (mods PublicreportImageExifModSlice) Apply(ctx context.Context, n *PublicreportImageExifTemplate) { + for _, f := range mods { + f.Apply(ctx, n) + } +} + +// PublicreportImageExifTemplate is an object representing the database table. +// all columns are optional and should be set by mods +type PublicreportImageExifTemplate struct { + ImageID func() int32 + Name func() string + Value func() string + + r publicreportImageExifR + f *Factory + + alreadyPersisted bool +} + +type publicreportImageExifR struct { + Image *publicreportImageExifRImageR +} + +type publicreportImageExifRImageR struct { + o *PublicreportImageTemplate +} + +// Apply mods to the PublicreportImageExifTemplate +func (o *PublicreportImageExifTemplate) Apply(ctx context.Context, mods ...PublicreportImageExifMod) { + for _, mod := range mods { + mod.Apply(ctx, o) + } +} + +// setModelRels creates and sets the relationships on *models.PublicreportImageExif +// according to the relationships in the template. Nothing is inserted into the db +func (t PublicreportImageExifTemplate) setModelRels(o *models.PublicreportImageExif) { + if t.r.Image != nil { + rel := t.r.Image.o.Build() + rel.R.ImageExifs = append(rel.R.ImageExifs, o) + o.ImageID = rel.ID // h2 + o.R.Image = rel + } +} + +// BuildSetter returns an *models.PublicreportImageExifSetter +// this does nothing with the relationship templates +func (o PublicreportImageExifTemplate) BuildSetter() *models.PublicreportImageExifSetter { + m := &models.PublicreportImageExifSetter{} + + if o.ImageID != nil { + val := o.ImageID() + m.ImageID = omit.From(val) + } + if o.Name != nil { + val := o.Name() + m.Name = omit.From(val) + } + if o.Value != nil { + val := o.Value() + m.Value = omit.From(val) + } + + return m +} + +// BuildManySetter returns an []*models.PublicreportImageExifSetter +// this does nothing with the relationship templates +func (o PublicreportImageExifTemplate) BuildManySetter(number int) []*models.PublicreportImageExifSetter { + m := make([]*models.PublicreportImageExifSetter, number) + + for i := range m { + m[i] = o.BuildSetter() + } + + return m +} + +// Build returns an *models.PublicreportImageExif +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportImageExifTemplate.Create +func (o PublicreportImageExifTemplate) Build() *models.PublicreportImageExif { + m := &models.PublicreportImageExif{} + + if o.ImageID != nil { + m.ImageID = o.ImageID() + } + if o.Name != nil { + m.Name = o.Name() + } + if o.Value != nil { + m.Value = o.Value() + } + + o.setModelRels(m) + + return m +} + +// BuildMany returns an models.PublicreportImageExifSlice +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportImageExifTemplate.CreateMany +func (o PublicreportImageExifTemplate) BuildMany(number int) models.PublicreportImageExifSlice { + m := make(models.PublicreportImageExifSlice, number) + + for i := range m { + m[i] = o.Build() + } + + return m +} + +func ensureCreatablePublicreportImageExif(m *models.PublicreportImageExifSetter) { + if !(m.ImageID.IsValue()) { + val := random_int32(nil) + m.ImageID = omit.From(val) + } + if !(m.Name.IsValue()) { + val := random_string(nil) + m.Name = omit.From(val) + } + if !(m.Value.IsValue()) { + val := random_string(nil) + m.Value = omit.From(val) + } +} + +// insertOptRels creates and inserts any optional the relationships on *models.PublicreportImageExif +// according to the relationships in the template. +// any required relationship should have already exist on the model +func (o *PublicreportImageExifTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportImageExif) error { + var err error + + return err +} + +// Create builds a publicreportImageExif and inserts it into the database +// Relations objects are also inserted and placed in the .R field +func (o *PublicreportImageExifTemplate) Create(ctx context.Context, exec bob.Executor) (*models.PublicreportImageExif, error) { + var err error + opt := o.BuildSetter() + ensureCreatablePublicreportImageExif(opt) + + if o.r.Image == nil { + PublicreportImageExifMods.WithNewImage().Apply(ctx, o) + } + + var rel0 *models.PublicreportImage + + if o.r.Image.o.alreadyPersisted { + rel0 = o.r.Image.o.Build() + } else { + rel0, err = o.r.Image.o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + opt.ImageID = omit.From(rel0.ID) + + m, err := models.PublicreportImageExifs.Insert(opt).One(ctx, exec) + if err != nil { + return nil, err + } + + m.R.Image = rel0 + + if err := o.insertOptRels(ctx, exec, m); err != nil { + return nil, err + } + return m, err +} + +// MustCreate builds a publicreportImageExif and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o *PublicreportImageExifTemplate) MustCreate(ctx context.Context, exec bob.Executor) *models.PublicreportImageExif { + m, err := o.Create(ctx, exec) + if err != nil { + panic(err) + } + return m +} + +// CreateOrFail builds a publicreportImageExif and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o *PublicreportImageExifTemplate) CreateOrFail(ctx context.Context, tb testing.TB, exec bob.Executor) *models.PublicreportImageExif { + tb.Helper() + m, err := o.Create(ctx, exec) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// CreateMany builds multiple publicreportImageExifs and inserts them into the database +// Relations objects are also inserted and placed in the .R field +func (o PublicreportImageExifTemplate) CreateMany(ctx context.Context, exec bob.Executor, number int) (models.PublicreportImageExifSlice, error) { + var err error + m := make(models.PublicreportImageExifSlice, number) + + for i := range m { + m[i], err = o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + return m, nil +} + +// MustCreateMany builds multiple publicreportImageExifs and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o PublicreportImageExifTemplate) MustCreateMany(ctx context.Context, exec bob.Executor, number int) models.PublicreportImageExifSlice { + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + panic(err) + } + return m +} + +// CreateManyOrFail builds multiple publicreportImageExifs and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o PublicreportImageExifTemplate) CreateManyOrFail(ctx context.Context, tb testing.TB, exec bob.Executor, number int) models.PublicreportImageExifSlice { + tb.Helper() + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// PublicreportImageExif has methods that act as mods for the PublicreportImageExifTemplate +var PublicreportImageExifMods publicreportImageExifMods + +type publicreportImageExifMods struct{} + +func (m publicreportImageExifMods) RandomizeAllColumns(f *faker.Faker) PublicreportImageExifMod { + return PublicreportImageExifModSlice{ + PublicreportImageExifMods.RandomImageID(f), + PublicreportImageExifMods.RandomName(f), + PublicreportImageExifMods.RandomValue(f), + } +} + +// Set the model columns to this value +func (m publicreportImageExifMods) ImageID(val int32) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.ImageID = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageExifMods) ImageIDFunc(f func() int32) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.ImageID = f + }) +} + +// Clear any values for the column +func (m publicreportImageExifMods) UnsetImageID() PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.ImageID = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageExifMods) RandomImageID(f *faker.Faker) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.ImageID = func() int32 { + return random_int32(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageExifMods) Name(val string) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Name = func() string { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageExifMods) NameFunc(f func() string) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Name = f + }) +} + +// Clear any values for the column +func (m publicreportImageExifMods) UnsetName() PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Name = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageExifMods) RandomName(f *faker.Faker) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Name = func() string { + return random_string(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportImageExifMods) Value(val string) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Value = func() string { return val } + }) +} + +// Set the Column from the function +func (m publicreportImageExifMods) ValueFunc(f func() string) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Value = f + }) +} + +// Clear any values for the column +func (m publicreportImageExifMods) UnsetValue() PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Value = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportImageExifMods) RandomValue(f *faker.Faker) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(_ context.Context, o *PublicreportImageExifTemplate) { + o.Value = func() string { + return random_string(f) + } + }) +} + +func (m publicreportImageExifMods) WithParentsCascading() PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(ctx context.Context, o *PublicreportImageExifTemplate) { + if isDone, _ := publicreportImageExifWithParentsCascadingCtx.Value(ctx); isDone { + return + } + ctx = publicreportImageExifWithParentsCascadingCtx.WithValue(ctx, true) + { + + related := o.f.NewPublicreportImageWithContext(ctx, PublicreportImageMods.WithParentsCascading()) + m.WithImage(related).Apply(ctx, o) + } + }) +} + +func (m publicreportImageExifMods) WithImage(rel *PublicreportImageTemplate) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(ctx context.Context, o *PublicreportImageExifTemplate) { + o.r.Image = &publicreportImageExifRImageR{ + o: rel, + } + }) +} + +func (m publicreportImageExifMods) WithNewImage(mods ...PublicreportImageMod) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(ctx context.Context, o *PublicreportImageExifTemplate) { + related := o.f.NewPublicreportImageWithContext(ctx, mods...) + + m.WithImage(related).Apply(ctx, o) + }) +} + +func (m publicreportImageExifMods) WithExistingImage(em *models.PublicreportImage) PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(ctx context.Context, o *PublicreportImageExifTemplate) { + o.r.Image = &publicreportImageExifRImageR{ + o: o.f.FromExistingPublicreportImage(em), + } + }) +} + +func (m publicreportImageExifMods) WithoutImage() PublicreportImageExifMod { + return PublicreportImageExifModFunc(func(ctx context.Context, o *PublicreportImageExifTemplate) { + o.r.Image = nil + }) +} diff --git a/db/factory/publicreport.pool.bob.go b/db/factory/publicreport.pool.bob.go index d35ac5c2..72b2f50e 100644 --- a/db/factory/publicreport.pool.bob.go +++ b/db/factory/publicreport.pool.bob.go @@ -76,12 +76,12 @@ type PublicreportPoolTemplate struct { } type publicreportPoolR struct { - PoolPhotos []*publicreportPoolRPoolPhotosR + Images []*publicreportPoolRImagesR } -type publicreportPoolRPoolPhotosR struct { +type publicreportPoolRImagesR struct { number int - o *PublicreportPoolPhotoTemplate + o *PublicreportImageTemplate } // Apply mods to the PublicreportPoolTemplate @@ -94,17 +94,16 @@ func (o *PublicreportPoolTemplate) Apply(ctx context.Context, mods ...Publicrepo // setModelRels creates and sets the relationships on *models.PublicreportPool // according to the relationships in the template. Nothing is inserted into the db func (t PublicreportPoolTemplate) setModelRels(o *models.PublicreportPool) { - if t.r.PoolPhotos != nil { - rel := models.PublicreportPoolPhotoSlice{} - for _, r := range t.r.PoolPhotos { + if t.r.Images != nil { + rel := models.PublicreportImageSlice{} + for _, r := range t.r.Images { related := r.o.BuildMany(r.number) for _, rel := range related { - rel.PoolID = o.ID // h2 - rel.R.Pool = o + rel.R.Pools = append(rel.R.Pools, o) } rel = append(rel, related...) } - o.R.PoolPhotos = rel + o.R.Images = rel } } @@ -481,19 +480,19 @@ func ensureCreatablePublicreportPool(m *models.PublicreportPoolSetter) { func (o *PublicreportPoolTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportPool) error { var err error - isPoolPhotosDone, _ := publicreportPoolRelPoolPhotosCtx.Value(ctx) - if !isPoolPhotosDone && o.r.PoolPhotos != nil { - ctx = publicreportPoolRelPoolPhotosCtx.WithValue(ctx, true) - for _, r := range o.r.PoolPhotos { + isImagesDone, _ := publicreportPoolRelImagesCtx.Value(ctx) + if !isImagesDone && o.r.Images != nil { + ctx = publicreportPoolRelImagesCtx.WithValue(ctx, true) + for _, r := range o.r.Images { if r.o.alreadyPersisted { - m.R.PoolPhotos = append(m.R.PoolPhotos, r.o.Build()) + m.R.Images = append(m.R.Images, r.o.Build()) } else { rel0, err := r.o.CreateMany(ctx, exec, r.number) if err != nil { return err } - err = m.AttachPoolPhotos(ctx, exec, rel0...) + err = m.AttachImages(ctx, exec, rel0...) if err != nil { return err } @@ -1609,50 +1608,50 @@ func (m publicreportPoolMods) WithParentsCascading() PublicreportPoolMod { }) } -func (m publicreportPoolMods) WithPoolPhotos(number int, related *PublicreportPoolPhotoTemplate) PublicreportPoolMod { +func (m publicreportPoolMods) WithImages(number int, related *PublicreportImageTemplate) PublicreportPoolMod { return PublicreportPoolModFunc(func(ctx context.Context, o *PublicreportPoolTemplate) { - o.r.PoolPhotos = []*publicreportPoolRPoolPhotosR{{ + o.r.Images = []*publicreportPoolRImagesR{{ number: number, o: related, }} }) } -func (m publicreportPoolMods) WithNewPoolPhotos(number int, mods ...PublicreportPoolPhotoMod) PublicreportPoolMod { +func (m publicreportPoolMods) WithNewImages(number int, mods ...PublicreportImageMod) PublicreportPoolMod { return PublicreportPoolModFunc(func(ctx context.Context, o *PublicreportPoolTemplate) { - related := o.f.NewPublicreportPoolPhotoWithContext(ctx, mods...) - m.WithPoolPhotos(number, related).Apply(ctx, o) + related := o.f.NewPublicreportImageWithContext(ctx, mods...) + m.WithImages(number, related).Apply(ctx, o) }) } -func (m publicreportPoolMods) AddPoolPhotos(number int, related *PublicreportPoolPhotoTemplate) PublicreportPoolMod { +func (m publicreportPoolMods) AddImages(number int, related *PublicreportImageTemplate) PublicreportPoolMod { return PublicreportPoolModFunc(func(ctx context.Context, o *PublicreportPoolTemplate) { - o.r.PoolPhotos = append(o.r.PoolPhotos, &publicreportPoolRPoolPhotosR{ + o.r.Images = append(o.r.Images, &publicreportPoolRImagesR{ number: number, o: related, }) }) } -func (m publicreportPoolMods) AddNewPoolPhotos(number int, mods ...PublicreportPoolPhotoMod) PublicreportPoolMod { +func (m publicreportPoolMods) AddNewImages(number int, mods ...PublicreportImageMod) PublicreportPoolMod { return PublicreportPoolModFunc(func(ctx context.Context, o *PublicreportPoolTemplate) { - related := o.f.NewPublicreportPoolPhotoWithContext(ctx, mods...) - m.AddPoolPhotos(number, related).Apply(ctx, o) + related := o.f.NewPublicreportImageWithContext(ctx, mods...) + m.AddImages(number, related).Apply(ctx, o) }) } -func (m publicreportPoolMods) AddExistingPoolPhotos(existingModels ...*models.PublicreportPoolPhoto) PublicreportPoolMod { +func (m publicreportPoolMods) AddExistingImages(existingModels ...*models.PublicreportImage) PublicreportPoolMod { return PublicreportPoolModFunc(func(ctx context.Context, o *PublicreportPoolTemplate) { for _, em := range existingModels { - o.r.PoolPhotos = append(o.r.PoolPhotos, &publicreportPoolRPoolPhotosR{ - o: o.f.FromExistingPublicreportPoolPhoto(em), + o.r.Images = append(o.r.Images, &publicreportPoolRImagesR{ + o: o.f.FromExistingPublicreportImage(em), }) } }) } -func (m publicreportPoolMods) WithoutPoolPhotos() PublicreportPoolMod { +func (m publicreportPoolMods) WithoutImages() PublicreportPoolMod { return PublicreportPoolModFunc(func(ctx context.Context, o *PublicreportPoolTemplate) { - o.r.PoolPhotos = nil + o.r.Images = nil }) } diff --git a/db/factory/publicreport.pool_image.bob.go b/db/factory/publicreport.pool_image.bob.go new file mode 100644 index 00000000..e7af585c --- /dev/null +++ b/db/factory/publicreport.pool_image.bob.go @@ -0,0 +1,431 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package factory + +import ( + "context" + "testing" + + models "github.com/Gleipnir-Technology/nidus-sync/db/models" + "github.com/aarondl/opt/omit" + "github.com/jaswdr/faker/v2" + "github.com/stephenafamo/bob" +) + +type PublicreportPoolImageMod interface { + Apply(context.Context, *PublicreportPoolImageTemplate) +} + +type PublicreportPoolImageModFunc func(context.Context, *PublicreportPoolImageTemplate) + +func (f PublicreportPoolImageModFunc) Apply(ctx context.Context, n *PublicreportPoolImageTemplate) { + f(ctx, n) +} + +type PublicreportPoolImageModSlice []PublicreportPoolImageMod + +func (mods PublicreportPoolImageModSlice) Apply(ctx context.Context, n *PublicreportPoolImageTemplate) { + for _, f := range mods { + f.Apply(ctx, n) + } +} + +// PublicreportPoolImageTemplate is an object representing the database table. +// all columns are optional and should be set by mods +type PublicreportPoolImageTemplate struct { + ImageID func() int32 + PoolID func() int32 + + r publicreportPoolImageR + f *Factory + + alreadyPersisted bool +} + +type publicreportPoolImageR struct { + Image *publicreportPoolImageRImageR + Pool *publicreportPoolImageRPoolR +} + +type publicreportPoolImageRImageR struct { + o *PublicreportImageTemplate +} +type publicreportPoolImageRPoolR struct { + o *PublicreportPoolTemplate +} + +// Apply mods to the PublicreportPoolImageTemplate +func (o *PublicreportPoolImageTemplate) Apply(ctx context.Context, mods ...PublicreportPoolImageMod) { + for _, mod := range mods { + mod.Apply(ctx, o) + } +} + +// setModelRels creates and sets the relationships on *models.PublicreportPoolImage +// according to the relationships in the template. Nothing is inserted into the db +func (t PublicreportPoolImageTemplate) setModelRels(o *models.PublicreportPoolImage) { + if t.r.Image != nil { + rel := t.r.Image.o.Build() + o.ImageID = rel.ID // h2 + o.R.Image = rel + } + + if t.r.Pool != nil { + rel := t.r.Pool.o.Build() + o.PoolID = rel.ID // h2 + o.R.Pool = rel + } +} + +// BuildSetter returns an *models.PublicreportPoolImageSetter +// this does nothing with the relationship templates +func (o PublicreportPoolImageTemplate) BuildSetter() *models.PublicreportPoolImageSetter { + m := &models.PublicreportPoolImageSetter{} + + if o.ImageID != nil { + val := o.ImageID() + m.ImageID = omit.From(val) + } + if o.PoolID != nil { + val := o.PoolID() + m.PoolID = omit.From(val) + } + + return m +} + +// BuildManySetter returns an []*models.PublicreportPoolImageSetter +// this does nothing with the relationship templates +func (o PublicreportPoolImageTemplate) BuildManySetter(number int) []*models.PublicreportPoolImageSetter { + m := make([]*models.PublicreportPoolImageSetter, number) + + for i := range m { + m[i] = o.BuildSetter() + } + + return m +} + +// Build returns an *models.PublicreportPoolImage +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportPoolImageTemplate.Create +func (o PublicreportPoolImageTemplate) Build() *models.PublicreportPoolImage { + m := &models.PublicreportPoolImage{} + + if o.ImageID != nil { + m.ImageID = o.ImageID() + } + if o.PoolID != nil { + m.PoolID = o.PoolID() + } + + o.setModelRels(m) + + return m +} + +// BuildMany returns an models.PublicreportPoolImageSlice +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportPoolImageTemplate.CreateMany +func (o PublicreportPoolImageTemplate) BuildMany(number int) models.PublicreportPoolImageSlice { + m := make(models.PublicreportPoolImageSlice, number) + + for i := range m { + m[i] = o.Build() + } + + return m +} + +func ensureCreatablePublicreportPoolImage(m *models.PublicreportPoolImageSetter) { + if !(m.ImageID.IsValue()) { + val := random_int32(nil) + m.ImageID = omit.From(val) + } + if !(m.PoolID.IsValue()) { + val := random_int32(nil) + m.PoolID = omit.From(val) + } +} + +// insertOptRels creates and inserts any optional the relationships on *models.PublicreportPoolImage +// according to the relationships in the template. +// any required relationship should have already exist on the model +func (o *PublicreportPoolImageTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportPoolImage) error { + var err error + + return err +} + +// Create builds a publicreportPoolImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +func (o *PublicreportPoolImageTemplate) Create(ctx context.Context, exec bob.Executor) (*models.PublicreportPoolImage, error) { + var err error + opt := o.BuildSetter() + ensureCreatablePublicreportPoolImage(opt) + + if o.r.Image == nil { + PublicreportPoolImageMods.WithNewImage().Apply(ctx, o) + } + + var rel0 *models.PublicreportImage + + if o.r.Image.o.alreadyPersisted { + rel0 = o.r.Image.o.Build() + } else { + rel0, err = o.r.Image.o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + opt.ImageID = omit.From(rel0.ID) + + if o.r.Pool == nil { + PublicreportPoolImageMods.WithNewPool().Apply(ctx, o) + } + + var rel1 *models.PublicreportPool + + if o.r.Pool.o.alreadyPersisted { + rel1 = o.r.Pool.o.Build() + } else { + rel1, err = o.r.Pool.o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + opt.PoolID = omit.From(rel1.ID) + + m, err := models.PublicreportPoolImages.Insert(opt).One(ctx, exec) + if err != nil { + return nil, err + } + + m.R.Image = rel0 + m.R.Pool = rel1 + + if err := o.insertOptRels(ctx, exec, m); err != nil { + return nil, err + } + return m, err +} + +// MustCreate builds a publicreportPoolImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o *PublicreportPoolImageTemplate) MustCreate(ctx context.Context, exec bob.Executor) *models.PublicreportPoolImage { + m, err := o.Create(ctx, exec) + if err != nil { + panic(err) + } + return m +} + +// CreateOrFail builds a publicreportPoolImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o *PublicreportPoolImageTemplate) CreateOrFail(ctx context.Context, tb testing.TB, exec bob.Executor) *models.PublicreportPoolImage { + tb.Helper() + m, err := o.Create(ctx, exec) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// CreateMany builds multiple publicreportPoolImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +func (o PublicreportPoolImageTemplate) CreateMany(ctx context.Context, exec bob.Executor, number int) (models.PublicreportPoolImageSlice, error) { + var err error + m := make(models.PublicreportPoolImageSlice, number) + + for i := range m { + m[i], err = o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + return m, nil +} + +// MustCreateMany builds multiple publicreportPoolImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o PublicreportPoolImageTemplate) MustCreateMany(ctx context.Context, exec bob.Executor, number int) models.PublicreportPoolImageSlice { + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + panic(err) + } + return m +} + +// CreateManyOrFail builds multiple publicreportPoolImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o PublicreportPoolImageTemplate) CreateManyOrFail(ctx context.Context, tb testing.TB, exec bob.Executor, number int) models.PublicreportPoolImageSlice { + tb.Helper() + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// PublicreportPoolImage has methods that act as mods for the PublicreportPoolImageTemplate +var PublicreportPoolImageMods publicreportPoolImageMods + +type publicreportPoolImageMods struct{} + +func (m publicreportPoolImageMods) RandomizeAllColumns(f *faker.Faker) PublicreportPoolImageMod { + return PublicreportPoolImageModSlice{ + PublicreportPoolImageMods.RandomImageID(f), + PublicreportPoolImageMods.RandomPoolID(f), + } +} + +// Set the model columns to this value +func (m publicreportPoolImageMods) ImageID(val int32) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.ImageID = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportPoolImageMods) ImageIDFunc(f func() int32) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.ImageID = f + }) +} + +// Clear any values for the column +func (m publicreportPoolImageMods) UnsetImageID() PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.ImageID = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportPoolImageMods) RandomImageID(f *faker.Faker) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.ImageID = func() int32 { + return random_int32(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportPoolImageMods) PoolID(val int32) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.PoolID = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportPoolImageMods) PoolIDFunc(f func() int32) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.PoolID = f + }) +} + +// Clear any values for the column +func (m publicreportPoolImageMods) UnsetPoolID() PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.PoolID = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportPoolImageMods) RandomPoolID(f *faker.Faker) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(_ context.Context, o *PublicreportPoolImageTemplate) { + o.PoolID = func() int32 { + return random_int32(f) + } + }) +} + +func (m publicreportPoolImageMods) WithParentsCascading() PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + if isDone, _ := publicreportPoolImageWithParentsCascadingCtx.Value(ctx); isDone { + return + } + ctx = publicreportPoolImageWithParentsCascadingCtx.WithValue(ctx, true) + { + + related := o.f.NewPublicreportImageWithContext(ctx, PublicreportImageMods.WithParentsCascading()) + m.WithImage(related).Apply(ctx, o) + } + { + + related := o.f.NewPublicreportPoolWithContext(ctx, PublicreportPoolMods.WithParentsCascading()) + m.WithPool(related).Apply(ctx, o) + } + }) +} + +func (m publicreportPoolImageMods) WithImage(rel *PublicreportImageTemplate) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + o.r.Image = &publicreportPoolImageRImageR{ + o: rel, + } + }) +} + +func (m publicreportPoolImageMods) WithNewImage(mods ...PublicreportImageMod) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + related := o.f.NewPublicreportImageWithContext(ctx, mods...) + + m.WithImage(related).Apply(ctx, o) + }) +} + +func (m publicreportPoolImageMods) WithExistingImage(em *models.PublicreportImage) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + o.r.Image = &publicreportPoolImageRImageR{ + o: o.f.FromExistingPublicreportImage(em), + } + }) +} + +func (m publicreportPoolImageMods) WithoutImage() PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + o.r.Image = nil + }) +} + +func (m publicreportPoolImageMods) WithPool(rel *PublicreportPoolTemplate) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + o.r.Pool = &publicreportPoolImageRPoolR{ + o: rel, + } + }) +} + +func (m publicreportPoolImageMods) WithNewPool(mods ...PublicreportPoolMod) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + related := o.f.NewPublicreportPoolWithContext(ctx, mods...) + + m.WithPool(related).Apply(ctx, o) + }) +} + +func (m publicreportPoolImageMods) WithExistingPool(em *models.PublicreportPool) PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + o.r.Pool = &publicreportPoolImageRPoolR{ + o: o.f.FromExistingPublicreportPool(em), + } + }) +} + +func (m publicreportPoolImageMods) WithoutPool() PublicreportPoolImageMod { + return PublicreportPoolImageModFunc(func(ctx context.Context, o *PublicreportPoolImageTemplate) { + o.r.Pool = nil + }) +} diff --git a/db/factory/publicreport.pool_photo.bob.go b/db/factory/publicreport.pool_photo.bob.go deleted file mode 100644 index d41bd538..00000000 --- a/db/factory/publicreport.pool_photo.bob.go +++ /dev/null @@ -1,498 +0,0 @@ -// Code generated by BobGen psql v0.42.1. DO NOT EDIT. -// This file is meant to be re-generated in place and/or deleted at any time. - -package factory - -import ( - "context" - "testing" - - models "github.com/Gleipnir-Technology/nidus-sync/db/models" - "github.com/aarondl/opt/omit" - "github.com/google/uuid" - "github.com/jaswdr/faker/v2" - "github.com/stephenafamo/bob" -) - -type PublicreportPoolPhotoMod interface { - Apply(context.Context, *PublicreportPoolPhotoTemplate) -} - -type PublicreportPoolPhotoModFunc func(context.Context, *PublicreportPoolPhotoTemplate) - -func (f PublicreportPoolPhotoModFunc) Apply(ctx context.Context, n *PublicreportPoolPhotoTemplate) { - f(ctx, n) -} - -type PublicreportPoolPhotoModSlice []PublicreportPoolPhotoMod - -func (mods PublicreportPoolPhotoModSlice) Apply(ctx context.Context, n *PublicreportPoolPhotoTemplate) { - for _, f := range mods { - f.Apply(ctx, n) - } -} - -// PublicreportPoolPhotoTemplate is an object representing the database table. -// all columns are optional and should be set by mods -type PublicreportPoolPhotoTemplate struct { - ID func() int32 - Size func() int64 - Filename func() string - PoolID func() int32 - UUID func() uuid.UUID - - r publicreportPoolPhotoR - f *Factory - - alreadyPersisted bool -} - -type publicreportPoolPhotoR struct { - Pool *publicreportPoolPhotoRPoolR -} - -type publicreportPoolPhotoRPoolR struct { - o *PublicreportPoolTemplate -} - -// Apply mods to the PublicreportPoolPhotoTemplate -func (o *PublicreportPoolPhotoTemplate) Apply(ctx context.Context, mods ...PublicreportPoolPhotoMod) { - for _, mod := range mods { - mod.Apply(ctx, o) - } -} - -// setModelRels creates and sets the relationships on *models.PublicreportPoolPhoto -// according to the relationships in the template. Nothing is inserted into the db -func (t PublicreportPoolPhotoTemplate) setModelRels(o *models.PublicreportPoolPhoto) { - if t.r.Pool != nil { - rel := t.r.Pool.o.Build() - rel.R.PoolPhotos = append(rel.R.PoolPhotos, o) - o.PoolID = rel.ID // h2 - o.R.Pool = rel - } -} - -// BuildSetter returns an *models.PublicreportPoolPhotoSetter -// this does nothing with the relationship templates -func (o PublicreportPoolPhotoTemplate) BuildSetter() *models.PublicreportPoolPhotoSetter { - m := &models.PublicreportPoolPhotoSetter{} - - if o.ID != nil { - val := o.ID() - m.ID = omit.From(val) - } - if o.Size != nil { - val := o.Size() - m.Size = omit.From(val) - } - if o.Filename != nil { - val := o.Filename() - m.Filename = omit.From(val) - } - if o.PoolID != nil { - val := o.PoolID() - m.PoolID = omit.From(val) - } - if o.UUID != nil { - val := o.UUID() - m.UUID = omit.From(val) - } - - return m -} - -// BuildManySetter returns an []*models.PublicreportPoolPhotoSetter -// this does nothing with the relationship templates -func (o PublicreportPoolPhotoTemplate) BuildManySetter(number int) []*models.PublicreportPoolPhotoSetter { - m := make([]*models.PublicreportPoolPhotoSetter, number) - - for i := range m { - m[i] = o.BuildSetter() - } - - return m -} - -// Build returns an *models.PublicreportPoolPhoto -// Related objects are also created and placed in the .R field -// NOTE: Objects are not inserted into the database. Use PublicreportPoolPhotoTemplate.Create -func (o PublicreportPoolPhotoTemplate) Build() *models.PublicreportPoolPhoto { - m := &models.PublicreportPoolPhoto{} - - if o.ID != nil { - m.ID = o.ID() - } - if o.Size != nil { - m.Size = o.Size() - } - if o.Filename != nil { - m.Filename = o.Filename() - } - if o.PoolID != nil { - m.PoolID = o.PoolID() - } - if o.UUID != nil { - m.UUID = o.UUID() - } - - o.setModelRels(m) - - return m -} - -// BuildMany returns an models.PublicreportPoolPhotoSlice -// Related objects are also created and placed in the .R field -// NOTE: Objects are not inserted into the database. Use PublicreportPoolPhotoTemplate.CreateMany -func (o PublicreportPoolPhotoTemplate) BuildMany(number int) models.PublicreportPoolPhotoSlice { - m := make(models.PublicreportPoolPhotoSlice, number) - - for i := range m { - m[i] = o.Build() - } - - return m -} - -func ensureCreatablePublicreportPoolPhoto(m *models.PublicreportPoolPhotoSetter) { - if !(m.Size.IsValue()) { - val := random_int64(nil) - m.Size = omit.From(val) - } - if !(m.Filename.IsValue()) { - val := random_string(nil) - m.Filename = omit.From(val) - } - if !(m.PoolID.IsValue()) { - val := random_int32(nil) - m.PoolID = omit.From(val) - } - if !(m.UUID.IsValue()) { - val := random_uuid_UUID(nil) - m.UUID = omit.From(val) - } -} - -// insertOptRels creates and inserts any optional the relationships on *models.PublicreportPoolPhoto -// according to the relationships in the template. -// any required relationship should have already exist on the model -func (o *PublicreportPoolPhotoTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportPoolPhoto) error { - var err error - - return err -} - -// Create builds a publicreportPoolPhoto and inserts it into the database -// Relations objects are also inserted and placed in the .R field -func (o *PublicreportPoolPhotoTemplate) Create(ctx context.Context, exec bob.Executor) (*models.PublicreportPoolPhoto, error) { - var err error - opt := o.BuildSetter() - ensureCreatablePublicreportPoolPhoto(opt) - - if o.r.Pool == nil { - PublicreportPoolPhotoMods.WithNewPool().Apply(ctx, o) - } - - var rel0 *models.PublicreportPool - - if o.r.Pool.o.alreadyPersisted { - rel0 = o.r.Pool.o.Build() - } else { - rel0, err = o.r.Pool.o.Create(ctx, exec) - if err != nil { - return nil, err - } - } - - opt.PoolID = omit.From(rel0.ID) - - m, err := models.PublicreportPoolPhotos.Insert(opt).One(ctx, exec) - if err != nil { - return nil, err - } - - m.R.Pool = rel0 - - if err := o.insertOptRels(ctx, exec, m); err != nil { - return nil, err - } - return m, err -} - -// MustCreate builds a publicreportPoolPhoto and inserts it into the database -// Relations objects are also inserted and placed in the .R field -// panics if an error occurs -func (o *PublicreportPoolPhotoTemplate) MustCreate(ctx context.Context, exec bob.Executor) *models.PublicreportPoolPhoto { - m, err := o.Create(ctx, exec) - if err != nil { - panic(err) - } - return m -} - -// CreateOrFail builds a publicreportPoolPhoto and inserts it into the database -// Relations objects are also inserted and placed in the .R field -// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs -func (o *PublicreportPoolPhotoTemplate) CreateOrFail(ctx context.Context, tb testing.TB, exec bob.Executor) *models.PublicreportPoolPhoto { - tb.Helper() - m, err := o.Create(ctx, exec) - if err != nil { - tb.Fatal(err) - return nil - } - return m -} - -// CreateMany builds multiple publicreportPoolPhotos and inserts them into the database -// Relations objects are also inserted and placed in the .R field -func (o PublicreportPoolPhotoTemplate) CreateMany(ctx context.Context, exec bob.Executor, number int) (models.PublicreportPoolPhotoSlice, error) { - var err error - m := make(models.PublicreportPoolPhotoSlice, number) - - for i := range m { - m[i], err = o.Create(ctx, exec) - if err != nil { - return nil, err - } - } - - return m, nil -} - -// MustCreateMany builds multiple publicreportPoolPhotos and inserts them into the database -// Relations objects are also inserted and placed in the .R field -// panics if an error occurs -func (o PublicreportPoolPhotoTemplate) MustCreateMany(ctx context.Context, exec bob.Executor, number int) models.PublicreportPoolPhotoSlice { - m, err := o.CreateMany(ctx, exec, number) - if err != nil { - panic(err) - } - return m -} - -// CreateManyOrFail builds multiple publicreportPoolPhotos and inserts them into the database -// Relations objects are also inserted and placed in the .R field -// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs -func (o PublicreportPoolPhotoTemplate) CreateManyOrFail(ctx context.Context, tb testing.TB, exec bob.Executor, number int) models.PublicreportPoolPhotoSlice { - tb.Helper() - m, err := o.CreateMany(ctx, exec, number) - if err != nil { - tb.Fatal(err) - return nil - } - return m -} - -// PublicreportPoolPhoto has methods that act as mods for the PublicreportPoolPhotoTemplate -var PublicreportPoolPhotoMods publicreportPoolPhotoMods - -type publicreportPoolPhotoMods struct{} - -func (m publicreportPoolPhotoMods) RandomizeAllColumns(f *faker.Faker) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModSlice{ - PublicreportPoolPhotoMods.RandomID(f), - PublicreportPoolPhotoMods.RandomSize(f), - PublicreportPoolPhotoMods.RandomFilename(f), - PublicreportPoolPhotoMods.RandomPoolID(f), - PublicreportPoolPhotoMods.RandomUUID(f), - } -} - -// Set the model columns to this value -func (m publicreportPoolPhotoMods) ID(val int32) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.ID = func() int32 { return val } - }) -} - -// Set the Column from the function -func (m publicreportPoolPhotoMods) IDFunc(f func() int32) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.ID = f - }) -} - -// Clear any values for the column -func (m publicreportPoolPhotoMods) UnsetID() PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.ID = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportPoolPhotoMods) RandomID(f *faker.Faker) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.ID = func() int32 { - return random_int32(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportPoolPhotoMods) Size(val int64) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Size = func() int64 { return val } - }) -} - -// Set the Column from the function -func (m publicreportPoolPhotoMods) SizeFunc(f func() int64) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Size = f - }) -} - -// Clear any values for the column -func (m publicreportPoolPhotoMods) UnsetSize() PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Size = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportPoolPhotoMods) RandomSize(f *faker.Faker) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Size = func() int64 { - return random_int64(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportPoolPhotoMods) Filename(val string) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Filename = func() string { return val } - }) -} - -// Set the Column from the function -func (m publicreportPoolPhotoMods) FilenameFunc(f func() string) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Filename = f - }) -} - -// Clear any values for the column -func (m publicreportPoolPhotoMods) UnsetFilename() PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Filename = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportPoolPhotoMods) RandomFilename(f *faker.Faker) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.Filename = func() string { - return random_string(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportPoolPhotoMods) PoolID(val int32) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.PoolID = func() int32 { return val } - }) -} - -// Set the Column from the function -func (m publicreportPoolPhotoMods) PoolIDFunc(f func() int32) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.PoolID = f - }) -} - -// Clear any values for the column -func (m publicreportPoolPhotoMods) UnsetPoolID() PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.PoolID = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportPoolPhotoMods) RandomPoolID(f *faker.Faker) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.PoolID = func() int32 { - return random_int32(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportPoolPhotoMods) UUID(val uuid.UUID) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.UUID = func() uuid.UUID { return val } - }) -} - -// Set the Column from the function -func (m publicreportPoolPhotoMods) UUIDFunc(f func() uuid.UUID) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.UUID = f - }) -} - -// Clear any values for the column -func (m publicreportPoolPhotoMods) UnsetUUID() PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - 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 publicreportPoolPhotoMods) RandomUUID(f *faker.Faker) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(_ context.Context, o *PublicreportPoolPhotoTemplate) { - o.UUID = func() uuid.UUID { - return random_uuid_UUID(f) - } - }) -} - -func (m publicreportPoolPhotoMods) WithParentsCascading() PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(ctx context.Context, o *PublicreportPoolPhotoTemplate) { - if isDone, _ := publicreportPoolPhotoWithParentsCascadingCtx.Value(ctx); isDone { - return - } - ctx = publicreportPoolPhotoWithParentsCascadingCtx.WithValue(ctx, true) - { - - related := o.f.NewPublicreportPoolWithContext(ctx, PublicreportPoolMods.WithParentsCascading()) - m.WithPool(related).Apply(ctx, o) - } - }) -} - -func (m publicreportPoolPhotoMods) WithPool(rel *PublicreportPoolTemplate) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(ctx context.Context, o *PublicreportPoolPhotoTemplate) { - o.r.Pool = &publicreportPoolPhotoRPoolR{ - o: rel, - } - }) -} - -func (m publicreportPoolPhotoMods) WithNewPool(mods ...PublicreportPoolMod) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(ctx context.Context, o *PublicreportPoolPhotoTemplate) { - related := o.f.NewPublicreportPoolWithContext(ctx, mods...) - - m.WithPool(related).Apply(ctx, o) - }) -} - -func (m publicreportPoolPhotoMods) WithExistingPool(em *models.PublicreportPool) PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(ctx context.Context, o *PublicreportPoolPhotoTemplate) { - o.r.Pool = &publicreportPoolPhotoRPoolR{ - o: o.f.FromExistingPublicreportPool(em), - } - }) -} - -func (m publicreportPoolPhotoMods) WithoutPool() PublicreportPoolPhotoMod { - return PublicreportPoolPhotoModFunc(func(ctx context.Context, o *PublicreportPoolPhotoTemplate) { - o.r.Pool = nil - }) -} diff --git a/db/factory/publicreport.quick.bob.go b/db/factory/publicreport.quick.bob.go index 95a66d3a..9f372444 100644 --- a/db/factory/publicreport.quick.bob.go +++ b/db/factory/publicreport.quick.bob.go @@ -56,12 +56,12 @@ type PublicreportQuickTemplate struct { } type publicreportQuickR struct { - QuickPhotos []*publicreportQuickRQuickPhotosR + Images []*publicreportQuickRImagesR } -type publicreportQuickRQuickPhotosR struct { +type publicreportQuickRImagesR struct { number int - o *PublicreportQuickPhotoTemplate + o *PublicreportImageTemplate } // Apply mods to the PublicreportQuickTemplate @@ -74,17 +74,16 @@ func (o *PublicreportQuickTemplate) Apply(ctx context.Context, mods ...Publicrep // setModelRels creates and sets the relationships on *models.PublicreportQuick // according to the relationships in the template. Nothing is inserted into the db func (t PublicreportQuickTemplate) setModelRels(o *models.PublicreportQuick) { - if t.r.QuickPhotos != nil { - rel := models.PublicreportQuickPhotoSlice{} - for _, r := range t.r.QuickPhotos { + if t.r.Images != nil { + rel := models.PublicreportImageSlice{} + for _, r := range t.r.Images { related := r.o.BuildMany(r.number) for _, rel := range related { - rel.QuickID = o.ID // h2 - rel.R.Quick = o + rel.R.Quicks = append(rel.R.Quicks, o) } rel = append(rel, related...) } - o.R.QuickPhotos = rel + o.R.Images = rel } } @@ -241,19 +240,19 @@ func ensureCreatablePublicreportQuick(m *models.PublicreportQuickSetter) { func (o *PublicreportQuickTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportQuick) error { var err error - isQuickPhotosDone, _ := publicreportQuickRelQuickPhotosCtx.Value(ctx) - if !isQuickPhotosDone && o.r.QuickPhotos != nil { - ctx = publicreportQuickRelQuickPhotosCtx.WithValue(ctx, true) - for _, r := range o.r.QuickPhotos { + isImagesDone, _ := publicreportQuickRelImagesCtx.Value(ctx) + if !isImagesDone && o.r.Images != nil { + ctx = publicreportQuickRelImagesCtx.WithValue(ctx, true) + for _, r := range o.r.Images { if r.o.alreadyPersisted { - m.R.QuickPhotos = append(m.R.QuickPhotos, r.o.Build()) + m.R.Images = append(m.R.Images, r.o.Build()) } else { rel0, err := r.o.CreateMany(ctx, exec, r.number) if err != nil { return err } - err = m.AttachQuickPhotos(ctx, exec, rel0...) + err = m.AttachImages(ctx, exec, rel0...) if err != nil { return err } @@ -729,50 +728,50 @@ func (m publicreportQuickMods) WithParentsCascading() PublicreportQuickMod { }) } -func (m publicreportQuickMods) WithQuickPhotos(number int, related *PublicreportQuickPhotoTemplate) PublicreportQuickMod { +func (m publicreportQuickMods) WithImages(number int, related *PublicreportImageTemplate) PublicreportQuickMod { return PublicreportQuickModFunc(func(ctx context.Context, o *PublicreportQuickTemplate) { - o.r.QuickPhotos = []*publicreportQuickRQuickPhotosR{{ + o.r.Images = []*publicreportQuickRImagesR{{ number: number, o: related, }} }) } -func (m publicreportQuickMods) WithNewQuickPhotos(number int, mods ...PublicreportQuickPhotoMod) PublicreportQuickMod { +func (m publicreportQuickMods) WithNewImages(number int, mods ...PublicreportImageMod) PublicreportQuickMod { return PublicreportQuickModFunc(func(ctx context.Context, o *PublicreportQuickTemplate) { - related := o.f.NewPublicreportQuickPhotoWithContext(ctx, mods...) - m.WithQuickPhotos(number, related).Apply(ctx, o) + related := o.f.NewPublicreportImageWithContext(ctx, mods...) + m.WithImages(number, related).Apply(ctx, o) }) } -func (m publicreportQuickMods) AddQuickPhotos(number int, related *PublicreportQuickPhotoTemplate) PublicreportQuickMod { +func (m publicreportQuickMods) AddImages(number int, related *PublicreportImageTemplate) PublicreportQuickMod { return PublicreportQuickModFunc(func(ctx context.Context, o *PublicreportQuickTemplate) { - o.r.QuickPhotos = append(o.r.QuickPhotos, &publicreportQuickRQuickPhotosR{ + o.r.Images = append(o.r.Images, &publicreportQuickRImagesR{ number: number, o: related, }) }) } -func (m publicreportQuickMods) AddNewQuickPhotos(number int, mods ...PublicreportQuickPhotoMod) PublicreportQuickMod { +func (m publicreportQuickMods) AddNewImages(number int, mods ...PublicreportImageMod) PublicreportQuickMod { return PublicreportQuickModFunc(func(ctx context.Context, o *PublicreportQuickTemplate) { - related := o.f.NewPublicreportQuickPhotoWithContext(ctx, mods...) - m.AddQuickPhotos(number, related).Apply(ctx, o) + related := o.f.NewPublicreportImageWithContext(ctx, mods...) + m.AddImages(number, related).Apply(ctx, o) }) } -func (m publicreportQuickMods) AddExistingQuickPhotos(existingModels ...*models.PublicreportQuickPhoto) PublicreportQuickMod { +func (m publicreportQuickMods) AddExistingImages(existingModels ...*models.PublicreportImage) PublicreportQuickMod { return PublicreportQuickModFunc(func(ctx context.Context, o *PublicreportQuickTemplate) { for _, em := range existingModels { - o.r.QuickPhotos = append(o.r.QuickPhotos, &publicreportQuickRQuickPhotosR{ - o: o.f.FromExistingPublicreportQuickPhoto(em), + o.r.Images = append(o.r.Images, &publicreportQuickRImagesR{ + o: o.f.FromExistingPublicreportImage(em), }) } }) } -func (m publicreportQuickMods) WithoutQuickPhotos() PublicreportQuickMod { +func (m publicreportQuickMods) WithoutImages() PublicreportQuickMod { return PublicreportQuickModFunc(func(ctx context.Context, o *PublicreportQuickTemplate) { - o.r.QuickPhotos = nil + o.r.Images = nil }) } diff --git a/db/factory/publicreport.quick_image.bob.go b/db/factory/publicreport.quick_image.bob.go new file mode 100644 index 00000000..951dc333 --- /dev/null +++ b/db/factory/publicreport.quick_image.bob.go @@ -0,0 +1,431 @@ +// Code generated by BobGen psql v0.42.1. DO NOT EDIT. +// This file is meant to be re-generated in place and/or deleted at any time. + +package factory + +import ( + "context" + "testing" + + models "github.com/Gleipnir-Technology/nidus-sync/db/models" + "github.com/aarondl/opt/omit" + "github.com/jaswdr/faker/v2" + "github.com/stephenafamo/bob" +) + +type PublicreportQuickImageMod interface { + Apply(context.Context, *PublicreportQuickImageTemplate) +} + +type PublicreportQuickImageModFunc func(context.Context, *PublicreportQuickImageTemplate) + +func (f PublicreportQuickImageModFunc) Apply(ctx context.Context, n *PublicreportQuickImageTemplate) { + f(ctx, n) +} + +type PublicreportQuickImageModSlice []PublicreportQuickImageMod + +func (mods PublicreportQuickImageModSlice) Apply(ctx context.Context, n *PublicreportQuickImageTemplate) { + for _, f := range mods { + f.Apply(ctx, n) + } +} + +// PublicreportQuickImageTemplate is an object representing the database table. +// all columns are optional and should be set by mods +type PublicreportQuickImageTemplate struct { + ImageID func() int32 + QuickID func() int32 + + r publicreportQuickImageR + f *Factory + + alreadyPersisted bool +} + +type publicreportQuickImageR struct { + Image *publicreportQuickImageRImageR + Quick *publicreportQuickImageRQuickR +} + +type publicreportQuickImageRImageR struct { + o *PublicreportImageTemplate +} +type publicreportQuickImageRQuickR struct { + o *PublicreportQuickTemplate +} + +// Apply mods to the PublicreportQuickImageTemplate +func (o *PublicreportQuickImageTemplate) Apply(ctx context.Context, mods ...PublicreportQuickImageMod) { + for _, mod := range mods { + mod.Apply(ctx, o) + } +} + +// setModelRels creates and sets the relationships on *models.PublicreportQuickImage +// according to the relationships in the template. Nothing is inserted into the db +func (t PublicreportQuickImageTemplate) setModelRels(o *models.PublicreportQuickImage) { + if t.r.Image != nil { + rel := t.r.Image.o.Build() + o.ImageID = rel.ID // h2 + o.R.Image = rel + } + + if t.r.Quick != nil { + rel := t.r.Quick.o.Build() + o.QuickID = rel.ID // h2 + o.R.Quick = rel + } +} + +// BuildSetter returns an *models.PublicreportQuickImageSetter +// this does nothing with the relationship templates +func (o PublicreportQuickImageTemplate) BuildSetter() *models.PublicreportQuickImageSetter { + m := &models.PublicreportQuickImageSetter{} + + if o.ImageID != nil { + val := o.ImageID() + m.ImageID = omit.From(val) + } + if o.QuickID != nil { + val := o.QuickID() + m.QuickID = omit.From(val) + } + + return m +} + +// BuildManySetter returns an []*models.PublicreportQuickImageSetter +// this does nothing with the relationship templates +func (o PublicreportQuickImageTemplate) BuildManySetter(number int) []*models.PublicreportQuickImageSetter { + m := make([]*models.PublicreportQuickImageSetter, number) + + for i := range m { + m[i] = o.BuildSetter() + } + + return m +} + +// Build returns an *models.PublicreportQuickImage +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportQuickImageTemplate.Create +func (o PublicreportQuickImageTemplate) Build() *models.PublicreportQuickImage { + m := &models.PublicreportQuickImage{} + + if o.ImageID != nil { + m.ImageID = o.ImageID() + } + if o.QuickID != nil { + m.QuickID = o.QuickID() + } + + o.setModelRels(m) + + return m +} + +// BuildMany returns an models.PublicreportQuickImageSlice +// Related objects are also created and placed in the .R field +// NOTE: Objects are not inserted into the database. Use PublicreportQuickImageTemplate.CreateMany +func (o PublicreportQuickImageTemplate) BuildMany(number int) models.PublicreportQuickImageSlice { + m := make(models.PublicreportQuickImageSlice, number) + + for i := range m { + m[i] = o.Build() + } + + return m +} + +func ensureCreatablePublicreportQuickImage(m *models.PublicreportQuickImageSetter) { + if !(m.ImageID.IsValue()) { + val := random_int32(nil) + m.ImageID = omit.From(val) + } + if !(m.QuickID.IsValue()) { + val := random_int32(nil) + m.QuickID = omit.From(val) + } +} + +// insertOptRels creates and inserts any optional the relationships on *models.PublicreportQuickImage +// according to the relationships in the template. +// any required relationship should have already exist on the model +func (o *PublicreportQuickImageTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportQuickImage) error { + var err error + + return err +} + +// Create builds a publicreportQuickImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +func (o *PublicreportQuickImageTemplate) Create(ctx context.Context, exec bob.Executor) (*models.PublicreportQuickImage, error) { + var err error + opt := o.BuildSetter() + ensureCreatablePublicreportQuickImage(opt) + + if o.r.Image == nil { + PublicreportQuickImageMods.WithNewImage().Apply(ctx, o) + } + + var rel0 *models.PublicreportImage + + if o.r.Image.o.alreadyPersisted { + rel0 = o.r.Image.o.Build() + } else { + rel0, err = o.r.Image.o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + opt.ImageID = omit.From(rel0.ID) + + if o.r.Quick == nil { + PublicreportQuickImageMods.WithNewQuick().Apply(ctx, o) + } + + var rel1 *models.PublicreportQuick + + if o.r.Quick.o.alreadyPersisted { + rel1 = o.r.Quick.o.Build() + } else { + rel1, err = o.r.Quick.o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + opt.QuickID = omit.From(rel1.ID) + + m, err := models.PublicreportQuickImages.Insert(opt).One(ctx, exec) + if err != nil { + return nil, err + } + + m.R.Image = rel0 + m.R.Quick = rel1 + + if err := o.insertOptRels(ctx, exec, m); err != nil { + return nil, err + } + return m, err +} + +// MustCreate builds a publicreportQuickImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o *PublicreportQuickImageTemplate) MustCreate(ctx context.Context, exec bob.Executor) *models.PublicreportQuickImage { + m, err := o.Create(ctx, exec) + if err != nil { + panic(err) + } + return m +} + +// CreateOrFail builds a publicreportQuickImage and inserts it into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o *PublicreportQuickImageTemplate) CreateOrFail(ctx context.Context, tb testing.TB, exec bob.Executor) *models.PublicreportQuickImage { + tb.Helper() + m, err := o.Create(ctx, exec) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// CreateMany builds multiple publicreportQuickImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +func (o PublicreportQuickImageTemplate) CreateMany(ctx context.Context, exec bob.Executor, number int) (models.PublicreportQuickImageSlice, error) { + var err error + m := make(models.PublicreportQuickImageSlice, number) + + for i := range m { + m[i], err = o.Create(ctx, exec) + if err != nil { + return nil, err + } + } + + return m, nil +} + +// MustCreateMany builds multiple publicreportQuickImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// panics if an error occurs +func (o PublicreportQuickImageTemplate) MustCreateMany(ctx context.Context, exec bob.Executor, number int) models.PublicreportQuickImageSlice { + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + panic(err) + } + return m +} + +// CreateManyOrFail builds multiple publicreportQuickImages and inserts them into the database +// Relations objects are also inserted and placed in the .R field +// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs +func (o PublicreportQuickImageTemplate) CreateManyOrFail(ctx context.Context, tb testing.TB, exec bob.Executor, number int) models.PublicreportQuickImageSlice { + tb.Helper() + m, err := o.CreateMany(ctx, exec, number) + if err != nil { + tb.Fatal(err) + return nil + } + return m +} + +// PublicreportQuickImage has methods that act as mods for the PublicreportQuickImageTemplate +var PublicreportQuickImageMods publicreportQuickImageMods + +type publicreportQuickImageMods struct{} + +func (m publicreportQuickImageMods) RandomizeAllColumns(f *faker.Faker) PublicreportQuickImageMod { + return PublicreportQuickImageModSlice{ + PublicreportQuickImageMods.RandomImageID(f), + PublicreportQuickImageMods.RandomQuickID(f), + } +} + +// Set the model columns to this value +func (m publicreportQuickImageMods) ImageID(val int32) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.ImageID = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportQuickImageMods) ImageIDFunc(f func() int32) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.ImageID = f + }) +} + +// Clear any values for the column +func (m publicreportQuickImageMods) UnsetImageID() PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.ImageID = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportQuickImageMods) RandomImageID(f *faker.Faker) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.ImageID = func() int32 { + return random_int32(f) + } + }) +} + +// Set the model columns to this value +func (m publicreportQuickImageMods) QuickID(val int32) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.QuickID = func() int32 { return val } + }) +} + +// Set the Column from the function +func (m publicreportQuickImageMods) QuickIDFunc(f func() int32) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.QuickID = f + }) +} + +// Clear any values for the column +func (m publicreportQuickImageMods) UnsetQuickID() PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.QuickID = nil + }) +} + +// Generates a random value for the column using the given faker +// if faker is nil, a default faker is used +func (m publicreportQuickImageMods) RandomQuickID(f *faker.Faker) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(_ context.Context, o *PublicreportQuickImageTemplate) { + o.QuickID = func() int32 { + return random_int32(f) + } + }) +} + +func (m publicreportQuickImageMods) WithParentsCascading() PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + if isDone, _ := publicreportQuickImageWithParentsCascadingCtx.Value(ctx); isDone { + return + } + ctx = publicreportQuickImageWithParentsCascadingCtx.WithValue(ctx, true) + { + + related := o.f.NewPublicreportImageWithContext(ctx, PublicreportImageMods.WithParentsCascading()) + m.WithImage(related).Apply(ctx, o) + } + { + + related := o.f.NewPublicreportQuickWithContext(ctx, PublicreportQuickMods.WithParentsCascading()) + m.WithQuick(related).Apply(ctx, o) + } + }) +} + +func (m publicreportQuickImageMods) WithImage(rel *PublicreportImageTemplate) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + o.r.Image = &publicreportQuickImageRImageR{ + o: rel, + } + }) +} + +func (m publicreportQuickImageMods) WithNewImage(mods ...PublicreportImageMod) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + related := o.f.NewPublicreportImageWithContext(ctx, mods...) + + m.WithImage(related).Apply(ctx, o) + }) +} + +func (m publicreportQuickImageMods) WithExistingImage(em *models.PublicreportImage) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + o.r.Image = &publicreportQuickImageRImageR{ + o: o.f.FromExistingPublicreportImage(em), + } + }) +} + +func (m publicreportQuickImageMods) WithoutImage() PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + o.r.Image = nil + }) +} + +func (m publicreportQuickImageMods) WithQuick(rel *PublicreportQuickTemplate) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + o.r.Quick = &publicreportQuickImageRQuickR{ + o: rel, + } + }) +} + +func (m publicreportQuickImageMods) WithNewQuick(mods ...PublicreportQuickMod) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + related := o.f.NewPublicreportQuickWithContext(ctx, mods...) + + m.WithQuick(related).Apply(ctx, o) + }) +} + +func (m publicreportQuickImageMods) WithExistingQuick(em *models.PublicreportQuick) PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + o.r.Quick = &publicreportQuickImageRQuickR{ + o: o.f.FromExistingPublicreportQuick(em), + } + }) +} + +func (m publicreportQuickImageMods) WithoutQuick() PublicreportQuickImageMod { + return PublicreportQuickImageModFunc(func(ctx context.Context, o *PublicreportQuickImageTemplate) { + o.r.Quick = nil + }) +} diff --git a/db/factory/publicreport.quick_photo.bob.go b/db/factory/publicreport.quick_photo.bob.go deleted file mode 100644 index 4bd2bfb9..00000000 --- a/db/factory/publicreport.quick_photo.bob.go +++ /dev/null @@ -1,498 +0,0 @@ -// Code generated by BobGen psql v0.42.1. DO NOT EDIT. -// This file is meant to be re-generated in place and/or deleted at any time. - -package factory - -import ( - "context" - "testing" - - models "github.com/Gleipnir-Technology/nidus-sync/db/models" - "github.com/aarondl/opt/omit" - "github.com/google/uuid" - "github.com/jaswdr/faker/v2" - "github.com/stephenafamo/bob" -) - -type PublicreportQuickPhotoMod interface { - Apply(context.Context, *PublicreportQuickPhotoTemplate) -} - -type PublicreportQuickPhotoModFunc func(context.Context, *PublicreportQuickPhotoTemplate) - -func (f PublicreportQuickPhotoModFunc) Apply(ctx context.Context, n *PublicreportQuickPhotoTemplate) { - f(ctx, n) -} - -type PublicreportQuickPhotoModSlice []PublicreportQuickPhotoMod - -func (mods PublicreportQuickPhotoModSlice) Apply(ctx context.Context, n *PublicreportQuickPhotoTemplate) { - for _, f := range mods { - f.Apply(ctx, n) - } -} - -// PublicreportQuickPhotoTemplate is an object representing the database table. -// all columns are optional and should be set by mods -type PublicreportQuickPhotoTemplate struct { - ID func() int32 - Size func() int64 - Filename func() string - QuickID func() int32 - UUID func() uuid.UUID - - r publicreportQuickPhotoR - f *Factory - - alreadyPersisted bool -} - -type publicreportQuickPhotoR struct { - Quick *publicreportQuickPhotoRQuickR -} - -type publicreportQuickPhotoRQuickR struct { - o *PublicreportQuickTemplate -} - -// Apply mods to the PublicreportQuickPhotoTemplate -func (o *PublicreportQuickPhotoTemplate) Apply(ctx context.Context, mods ...PublicreportQuickPhotoMod) { - for _, mod := range mods { - mod.Apply(ctx, o) - } -} - -// setModelRels creates and sets the relationships on *models.PublicreportQuickPhoto -// according to the relationships in the template. Nothing is inserted into the db -func (t PublicreportQuickPhotoTemplate) setModelRels(o *models.PublicreportQuickPhoto) { - if t.r.Quick != nil { - rel := t.r.Quick.o.Build() - rel.R.QuickPhotos = append(rel.R.QuickPhotos, o) - o.QuickID = rel.ID // h2 - o.R.Quick = rel - } -} - -// BuildSetter returns an *models.PublicreportQuickPhotoSetter -// this does nothing with the relationship templates -func (o PublicreportQuickPhotoTemplate) BuildSetter() *models.PublicreportQuickPhotoSetter { - m := &models.PublicreportQuickPhotoSetter{} - - if o.ID != nil { - val := o.ID() - m.ID = omit.From(val) - } - if o.Size != nil { - val := o.Size() - m.Size = omit.From(val) - } - if o.Filename != nil { - val := o.Filename() - m.Filename = omit.From(val) - } - if o.QuickID != nil { - val := o.QuickID() - m.QuickID = omit.From(val) - } - if o.UUID != nil { - val := o.UUID() - m.UUID = omit.From(val) - } - - return m -} - -// BuildManySetter returns an []*models.PublicreportQuickPhotoSetter -// this does nothing with the relationship templates -func (o PublicreportQuickPhotoTemplate) BuildManySetter(number int) []*models.PublicreportQuickPhotoSetter { - m := make([]*models.PublicreportQuickPhotoSetter, number) - - for i := range m { - m[i] = o.BuildSetter() - } - - return m -} - -// Build returns an *models.PublicreportQuickPhoto -// Related objects are also created and placed in the .R field -// NOTE: Objects are not inserted into the database. Use PublicreportQuickPhotoTemplate.Create -func (o PublicreportQuickPhotoTemplate) Build() *models.PublicreportQuickPhoto { - m := &models.PublicreportQuickPhoto{} - - if o.ID != nil { - m.ID = o.ID() - } - if o.Size != nil { - m.Size = o.Size() - } - if o.Filename != nil { - m.Filename = o.Filename() - } - if o.QuickID != nil { - m.QuickID = o.QuickID() - } - if o.UUID != nil { - m.UUID = o.UUID() - } - - o.setModelRels(m) - - return m -} - -// BuildMany returns an models.PublicreportQuickPhotoSlice -// Related objects are also created and placed in the .R field -// NOTE: Objects are not inserted into the database. Use PublicreportQuickPhotoTemplate.CreateMany -func (o PublicreportQuickPhotoTemplate) BuildMany(number int) models.PublicreportQuickPhotoSlice { - m := make(models.PublicreportQuickPhotoSlice, number) - - for i := range m { - m[i] = o.Build() - } - - return m -} - -func ensureCreatablePublicreportQuickPhoto(m *models.PublicreportQuickPhotoSetter) { - if !(m.Size.IsValue()) { - val := random_int64(nil) - m.Size = omit.From(val) - } - if !(m.Filename.IsValue()) { - val := random_string(nil) - m.Filename = omit.From(val) - } - if !(m.QuickID.IsValue()) { - val := random_int32(nil) - m.QuickID = omit.From(val) - } - if !(m.UUID.IsValue()) { - val := random_uuid_UUID(nil) - m.UUID = omit.From(val) - } -} - -// insertOptRels creates and inserts any optional the relationships on *models.PublicreportQuickPhoto -// according to the relationships in the template. -// any required relationship should have already exist on the model -func (o *PublicreportQuickPhotoTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.PublicreportQuickPhoto) error { - var err error - - return err -} - -// Create builds a publicreportQuickPhoto and inserts it into the database -// Relations objects are also inserted and placed in the .R field -func (o *PublicreportQuickPhotoTemplate) Create(ctx context.Context, exec bob.Executor) (*models.PublicreportQuickPhoto, error) { - var err error - opt := o.BuildSetter() - ensureCreatablePublicreportQuickPhoto(opt) - - if o.r.Quick == nil { - PublicreportQuickPhotoMods.WithNewQuick().Apply(ctx, o) - } - - var rel0 *models.PublicreportQuick - - if o.r.Quick.o.alreadyPersisted { - rel0 = o.r.Quick.o.Build() - } else { - rel0, err = o.r.Quick.o.Create(ctx, exec) - if err != nil { - return nil, err - } - } - - opt.QuickID = omit.From(rel0.ID) - - m, err := models.PublicreportQuickPhotos.Insert(opt).One(ctx, exec) - if err != nil { - return nil, err - } - - m.R.Quick = rel0 - - if err := o.insertOptRels(ctx, exec, m); err != nil { - return nil, err - } - return m, err -} - -// MustCreate builds a publicreportQuickPhoto and inserts it into the database -// Relations objects are also inserted and placed in the .R field -// panics if an error occurs -func (o *PublicreportQuickPhotoTemplate) MustCreate(ctx context.Context, exec bob.Executor) *models.PublicreportQuickPhoto { - m, err := o.Create(ctx, exec) - if err != nil { - panic(err) - } - return m -} - -// CreateOrFail builds a publicreportQuickPhoto and inserts it into the database -// Relations objects are also inserted and placed in the .R field -// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs -func (o *PublicreportQuickPhotoTemplate) CreateOrFail(ctx context.Context, tb testing.TB, exec bob.Executor) *models.PublicreportQuickPhoto { - tb.Helper() - m, err := o.Create(ctx, exec) - if err != nil { - tb.Fatal(err) - return nil - } - return m -} - -// CreateMany builds multiple publicreportQuickPhotos and inserts them into the database -// Relations objects are also inserted and placed in the .R field -func (o PublicreportQuickPhotoTemplate) CreateMany(ctx context.Context, exec bob.Executor, number int) (models.PublicreportQuickPhotoSlice, error) { - var err error - m := make(models.PublicreportQuickPhotoSlice, number) - - for i := range m { - m[i], err = o.Create(ctx, exec) - if err != nil { - return nil, err - } - } - - return m, nil -} - -// MustCreateMany builds multiple publicreportQuickPhotos and inserts them into the database -// Relations objects are also inserted and placed in the .R field -// panics if an error occurs -func (o PublicreportQuickPhotoTemplate) MustCreateMany(ctx context.Context, exec bob.Executor, number int) models.PublicreportQuickPhotoSlice { - m, err := o.CreateMany(ctx, exec, number) - if err != nil { - panic(err) - } - return m -} - -// CreateManyOrFail builds multiple publicreportQuickPhotos and inserts them into the database -// Relations objects are also inserted and placed in the .R field -// It calls `tb.Fatal(err)` on the test/benchmark if an error occurs -func (o PublicreportQuickPhotoTemplate) CreateManyOrFail(ctx context.Context, tb testing.TB, exec bob.Executor, number int) models.PublicreportQuickPhotoSlice { - tb.Helper() - m, err := o.CreateMany(ctx, exec, number) - if err != nil { - tb.Fatal(err) - return nil - } - return m -} - -// PublicreportQuickPhoto has methods that act as mods for the PublicreportQuickPhotoTemplate -var PublicreportQuickPhotoMods publicreportQuickPhotoMods - -type publicreportQuickPhotoMods struct{} - -func (m publicreportQuickPhotoMods) RandomizeAllColumns(f *faker.Faker) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModSlice{ - PublicreportQuickPhotoMods.RandomID(f), - PublicreportQuickPhotoMods.RandomSize(f), - PublicreportQuickPhotoMods.RandomFilename(f), - PublicreportQuickPhotoMods.RandomQuickID(f), - PublicreportQuickPhotoMods.RandomUUID(f), - } -} - -// Set the model columns to this value -func (m publicreportQuickPhotoMods) ID(val int32) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.ID = func() int32 { return val } - }) -} - -// Set the Column from the function -func (m publicreportQuickPhotoMods) IDFunc(f func() int32) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.ID = f - }) -} - -// Clear any values for the column -func (m publicreportQuickPhotoMods) UnsetID() PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.ID = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportQuickPhotoMods) RandomID(f *faker.Faker) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.ID = func() int32 { - return random_int32(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportQuickPhotoMods) Size(val int64) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Size = func() int64 { return val } - }) -} - -// Set the Column from the function -func (m publicreportQuickPhotoMods) SizeFunc(f func() int64) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Size = f - }) -} - -// Clear any values for the column -func (m publicreportQuickPhotoMods) UnsetSize() PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Size = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportQuickPhotoMods) RandomSize(f *faker.Faker) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Size = func() int64 { - return random_int64(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportQuickPhotoMods) Filename(val string) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Filename = func() string { return val } - }) -} - -// Set the Column from the function -func (m publicreportQuickPhotoMods) FilenameFunc(f func() string) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Filename = f - }) -} - -// Clear any values for the column -func (m publicreportQuickPhotoMods) UnsetFilename() PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Filename = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportQuickPhotoMods) RandomFilename(f *faker.Faker) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.Filename = func() string { - return random_string(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportQuickPhotoMods) QuickID(val int32) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.QuickID = func() int32 { return val } - }) -} - -// Set the Column from the function -func (m publicreportQuickPhotoMods) QuickIDFunc(f func() int32) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.QuickID = f - }) -} - -// Clear any values for the column -func (m publicreportQuickPhotoMods) UnsetQuickID() PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.QuickID = nil - }) -} - -// Generates a random value for the column using the given faker -// if faker is nil, a default faker is used -func (m publicreportQuickPhotoMods) RandomQuickID(f *faker.Faker) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.QuickID = func() int32 { - return random_int32(f) - } - }) -} - -// Set the model columns to this value -func (m publicreportQuickPhotoMods) UUID(val uuid.UUID) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.UUID = func() uuid.UUID { return val } - }) -} - -// Set the Column from the function -func (m publicreportQuickPhotoMods) UUIDFunc(f func() uuid.UUID) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.UUID = f - }) -} - -// Clear any values for the column -func (m publicreportQuickPhotoMods) UnsetUUID() PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - 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 publicreportQuickPhotoMods) RandomUUID(f *faker.Faker) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(_ context.Context, o *PublicreportQuickPhotoTemplate) { - o.UUID = func() uuid.UUID { - return random_uuid_UUID(f) - } - }) -} - -func (m publicreportQuickPhotoMods) WithParentsCascading() PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(ctx context.Context, o *PublicreportQuickPhotoTemplate) { - if isDone, _ := publicreportQuickPhotoWithParentsCascadingCtx.Value(ctx); isDone { - return - } - ctx = publicreportQuickPhotoWithParentsCascadingCtx.WithValue(ctx, true) - { - - related := o.f.NewPublicreportQuickWithContext(ctx, PublicreportQuickMods.WithParentsCascading()) - m.WithQuick(related).Apply(ctx, o) - } - }) -} - -func (m publicreportQuickPhotoMods) WithQuick(rel *PublicreportQuickTemplate) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(ctx context.Context, o *PublicreportQuickPhotoTemplate) { - o.r.Quick = &publicreportQuickPhotoRQuickR{ - o: rel, - } - }) -} - -func (m publicreportQuickPhotoMods) WithNewQuick(mods ...PublicreportQuickMod) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(ctx context.Context, o *PublicreportQuickPhotoTemplate) { - related := o.f.NewPublicreportQuickWithContext(ctx, mods...) - - m.WithQuick(related).Apply(ctx, o) - }) -} - -func (m publicreportQuickPhotoMods) WithExistingQuick(em *models.PublicreportQuick) PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(ctx context.Context, o *PublicreportQuickPhotoTemplate) { - o.r.Quick = &publicreportQuickPhotoRQuickR{ - o: o.f.FromExistingPublicreportQuick(em), - } - }) -} - -func (m publicreportQuickPhotoMods) WithoutQuick() PublicreportQuickPhotoMod { - return PublicreportQuickPhotoModFunc(func(ctx context.Context, o *PublicreportQuickPhotoTemplate) { - o.r.Quick = nil - }) -} diff --git a/db/migrations/00035_photo_content_type.sql b/db/migrations/00035_photo_content_type.sql new file mode 100644 index 00000000..cafad2e5 --- /dev/null +++ b/db/migrations/00035_photo_content_type.sql @@ -0,0 +1,37 @@ +-- +goose Up +CREATE TABLE publicreport.image ( + id SERIAL, + content_type TEXT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE NOT NULL, + location GEOGRAPHY, + resolution_x INTEGER NOT NULL, + resolution_y INTEGER NOT NULL, + storage_uuid UUID NOT NULL, + storage_size BIGINT NOT NULL, + uploaded_filename TEXT NOT NULL, + PRIMARY KEY(id) +); +CREATE TABLE publicreport.image_exif ( + image_id INTEGER NOT NULL REFERENCES publicreport.image(id), + name TEXT NOT NULL, + value TEXT NOT NULL, + PRIMARY KEY(image_id, name, value) +); +CREATE TABLE publicreport.pool_image ( + image_id INTEGER NOT NULL REFERENCES publicreport.image(id), + pool_id INTEGER NOT NULL REFERENCES publicreport.pool(id), + PRIMARY KEY (image_id, pool_id) +); +CREATE TABLE publicreport.quick_image ( + image_id INTEGER NOT NULL REFERENCES publicreport.image(id), + quick_id INTEGER NOT NULL REFERENCES publicreport.quick(id), + PRIMARY KEY (image_id, quick_id) +); +DROP TABLE IF EXISTS publicreport.pool_photo; +DROP TABLE IF EXISTS publicreport.quick_photo; +-- +goose Down +DROP TABLE publicreport.quick_image; +DROP TABLE publicreport.pool_image; +DROP TABLE publicreport.image_exif; +DROP TABLE publicreport.image; +-- that's right, I'm not rebuilding the pool_photo or quick_photo tables because I'm lazy. diff --git a/db/models/bob_counts.bob.go b/db/models/bob_counts.bob.go index be17543e..de00d405 100644 --- a/db/models/bob_counts.bob.go +++ b/db/models/bob_counts.bob.go @@ -25,6 +25,7 @@ type preloadCounts struct { NoteAudio noteAudioCountPreloader NoteImage noteImageCountPreloader Organization organizationCountPreloader + PublicreportImage publicreportImageCountPreloader PublicreportPool publicreportPoolCountPreloader PublicreportQuick publicreportQuickCountPreloader User userCountPreloader @@ -36,6 +37,7 @@ func getPreloadCount() preloadCounts { NoteAudio: buildNoteAudioCountPreloader(), NoteImage: buildNoteImageCountPreloader(), Organization: buildOrganizationCountPreloader(), + PublicreportImage: buildPublicreportImageCountPreloader(), PublicreportPool: buildPublicreportPoolCountPreloader(), PublicreportQuick: buildPublicreportQuickCountPreloader(), User: buildUserCountPreloader(), @@ -47,6 +49,7 @@ type thenLoadCounts[Q orm.Loadable] struct { NoteAudio noteAudioCountThenLoader[Q] NoteImage noteImageCountThenLoader[Q] Organization organizationCountThenLoader[Q] + PublicreportImage publicreportImageCountThenLoader[Q] PublicreportPool publicreportPoolCountThenLoader[Q] PublicreportQuick publicreportQuickCountThenLoader[Q] User userCountThenLoader[Q] @@ -58,6 +61,7 @@ func getThenLoadCount[Q orm.Loadable]() thenLoadCounts[Q] { NoteAudio: buildNoteAudioCountThenLoader[Q](), NoteImage: buildNoteImageCountThenLoader[Q](), Organization: buildOrganizationCountThenLoader[Q](), + PublicreportImage: buildPublicreportImageCountThenLoader[Q](), PublicreportPool: buildPublicreportPoolCountThenLoader[Q](), PublicreportQuick: buildPublicreportQuickCountThenLoader[Q](), User: buildUserCountThenLoader[Q](), diff --git a/db/models/bob_joins.bob.go b/db/models/bob_joins.bob.go index ef21e961..f387e8d3 100644 --- a/db/models/bob_joins.bob.go +++ b/db/models/bob_joins.bob.go @@ -73,10 +73,12 @@ type joins[Q dialect.Joinable] struct { Notifications joinSet[notificationJoins[Q]] OauthTokens joinSet[oauthTokenJoins[Q]] Organizations joinSet[organizationJoins[Q]] + PublicreportImages joinSet[publicreportImageJoins[Q]] + PublicreportImageExifs joinSet[publicreportImageExifJoins[Q]] PublicreportPools joinSet[publicreportPoolJoins[Q]] - PublicreportPoolPhotos joinSet[publicreportPoolPhotoJoins[Q]] + PublicreportPoolImages joinSet[publicreportPoolImageJoins[Q]] PublicreportQuicks joinSet[publicreportQuickJoins[Q]] - PublicreportQuickPhotos joinSet[publicreportQuickPhotoJoins[Q]] + PublicreportQuickImages joinSet[publicreportQuickImageJoins[Q]] Users joinSet[userJoins[Q]] } @@ -131,10 +133,12 @@ func getJoins[Q dialect.Joinable]() joins[Q] { Notifications: buildJoinSet[notificationJoins[Q]](Notifications.Columns, buildNotificationJoins), OauthTokens: buildJoinSet[oauthTokenJoins[Q]](OauthTokens.Columns, buildOauthTokenJoins), Organizations: buildJoinSet[organizationJoins[Q]](Organizations.Columns, buildOrganizationJoins), + PublicreportImages: buildJoinSet[publicreportImageJoins[Q]](PublicreportImages.Columns, buildPublicreportImageJoins), + PublicreportImageExifs: buildJoinSet[publicreportImageExifJoins[Q]](PublicreportImageExifs.Columns, buildPublicreportImageExifJoins), PublicreportPools: buildJoinSet[publicreportPoolJoins[Q]](PublicreportPools.Columns, buildPublicreportPoolJoins), - PublicreportPoolPhotos: buildJoinSet[publicreportPoolPhotoJoins[Q]](PublicreportPoolPhotos.Columns, buildPublicreportPoolPhotoJoins), + PublicreportPoolImages: buildJoinSet[publicreportPoolImageJoins[Q]](PublicreportPoolImages.Columns, buildPublicreportPoolImageJoins), PublicreportQuicks: buildJoinSet[publicreportQuickJoins[Q]](PublicreportQuicks.Columns, buildPublicreportQuickJoins), - PublicreportQuickPhotos: buildJoinSet[publicreportQuickPhotoJoins[Q]](PublicreportQuickPhotos.Columns, buildPublicreportQuickPhotoJoins), + PublicreportQuickImages: buildJoinSet[publicreportQuickImageJoins[Q]](PublicreportQuickImages.Columns, buildPublicreportQuickImageJoins), Users: buildJoinSet[userJoins[Q]](Users.Columns, buildUserJoins), } } diff --git a/db/models/bob_loaders.bob.go b/db/models/bob_loaders.bob.go index 50d02a99..fe6d28c7 100644 --- a/db/models/bob_loaders.bob.go +++ b/db/models/bob_loaders.bob.go @@ -58,10 +58,12 @@ type preloaders struct { Notification notificationPreloader OauthToken oauthTokenPreloader Organization organizationPreloader + PublicreportImage publicreportImagePreloader + PublicreportImageExif publicreportImageExifPreloader PublicreportPool publicreportPoolPreloader - PublicreportPoolPhoto publicreportPoolPhotoPreloader + PublicreportPoolImage publicreportPoolImagePreloader PublicreportQuick publicreportQuickPreloader - PublicreportQuickPhoto publicreportQuickPhotoPreloader + PublicreportQuickImage publicreportQuickImagePreloader User userPreloader } @@ -108,10 +110,12 @@ func getPreloaders() preloaders { Notification: buildNotificationPreloader(), OauthToken: buildOauthTokenPreloader(), Organization: buildOrganizationPreloader(), + PublicreportImage: buildPublicreportImagePreloader(), + PublicreportImageExif: buildPublicreportImageExifPreloader(), PublicreportPool: buildPublicreportPoolPreloader(), - PublicreportPoolPhoto: buildPublicreportPoolPhotoPreloader(), + PublicreportPoolImage: buildPublicreportPoolImagePreloader(), PublicreportQuick: buildPublicreportQuickPreloader(), - PublicreportQuickPhoto: buildPublicreportQuickPhotoPreloader(), + PublicreportQuickImage: buildPublicreportQuickImagePreloader(), User: buildUserPreloader(), } } @@ -164,10 +168,12 @@ type thenLoaders[Q orm.Loadable] struct { Notification notificationThenLoader[Q] OauthToken oauthTokenThenLoader[Q] Organization organizationThenLoader[Q] + PublicreportImage publicreportImageThenLoader[Q] + PublicreportImageExif publicreportImageExifThenLoader[Q] PublicreportPool publicreportPoolThenLoader[Q] - PublicreportPoolPhoto publicreportPoolPhotoThenLoader[Q] + PublicreportPoolImage publicreportPoolImageThenLoader[Q] PublicreportQuick publicreportQuickThenLoader[Q] - PublicreportQuickPhoto publicreportQuickPhotoThenLoader[Q] + PublicreportQuickImage publicreportQuickImageThenLoader[Q] User userThenLoader[Q] } @@ -214,10 +220,12 @@ func getThenLoaders[Q orm.Loadable]() thenLoaders[Q] { Notification: buildNotificationThenLoader[Q](), OauthToken: buildOauthTokenThenLoader[Q](), Organization: buildOrganizationThenLoader[Q](), + PublicreportImage: buildPublicreportImageThenLoader[Q](), + PublicreportImageExif: buildPublicreportImageExifThenLoader[Q](), PublicreportPool: buildPublicreportPoolThenLoader[Q](), - PublicreportPoolPhoto: buildPublicreportPoolPhotoThenLoader[Q](), + PublicreportPoolImage: buildPublicreportPoolImageThenLoader[Q](), PublicreportQuick: buildPublicreportQuickThenLoader[Q](), - PublicreportQuickPhoto: buildPublicreportQuickPhotoThenLoader[Q](), + PublicreportQuickImage: buildPublicreportQuickImageThenLoader[Q](), User: buildUserThenLoader[Q](), } } diff --git a/db/models/bob_where.bob.go b/db/models/bob_where.bob.go index 046968ad..4b2c8b5a 100644 --- a/db/models/bob_where.bob.go +++ b/db/models/bob_where.bob.go @@ -61,11 +61,13 @@ func Where[Q psql.Filterable]() struct { Notifications notificationWhere[Q] OauthTokens oauthTokenWhere[Q] Organizations organizationWhere[Q] + PublicreportImages publicreportImageWhere[Q] + PublicreportImageExifs publicreportImageExifWhere[Q] PublicreportNuisances publicreportNuisanceWhere[Q] PublicreportPools publicreportPoolWhere[Q] - PublicreportPoolPhotos publicreportPoolPhotoWhere[Q] + PublicreportPoolImages publicreportPoolImageWhere[Q] PublicreportQuicks publicreportQuickWhere[Q] - PublicreportQuickPhotos publicreportQuickPhotoWhere[Q] + PublicreportQuickImages publicreportQuickImageWhere[Q] PublicreportReportLocations publicreportReportLocationWhere[Q] RasterColumns rasterColumnWhere[Q] RasterOverviews rasterOverviewWhere[Q] @@ -118,11 +120,13 @@ func Where[Q psql.Filterable]() struct { Notifications notificationWhere[Q] OauthTokens oauthTokenWhere[Q] Organizations organizationWhere[Q] + PublicreportImages publicreportImageWhere[Q] + PublicreportImageExifs publicreportImageExifWhere[Q] PublicreportNuisances publicreportNuisanceWhere[Q] PublicreportPools publicreportPoolWhere[Q] - PublicreportPoolPhotos publicreportPoolPhotoWhere[Q] + PublicreportPoolImages publicreportPoolImageWhere[Q] PublicreportQuicks publicreportQuickWhere[Q] - PublicreportQuickPhotos publicreportQuickPhotoWhere[Q] + PublicreportQuickImages publicreportQuickImageWhere[Q] PublicreportReportLocations publicreportReportLocationWhere[Q] RasterColumns rasterColumnWhere[Q] RasterOverviews rasterOverviewWhere[Q] @@ -174,11 +178,13 @@ func Where[Q psql.Filterable]() struct { Notifications: buildNotificationWhere[Q](Notifications.Columns), OauthTokens: buildOauthTokenWhere[Q](OauthTokens.Columns), Organizations: buildOrganizationWhere[Q](Organizations.Columns), + PublicreportImages: buildPublicreportImageWhere[Q](PublicreportImages.Columns), + PublicreportImageExifs: buildPublicreportImageExifWhere[Q](PublicreportImageExifs.Columns), PublicreportNuisances: buildPublicreportNuisanceWhere[Q](PublicreportNuisances.Columns), PublicreportPools: buildPublicreportPoolWhere[Q](PublicreportPools.Columns), - PublicreportPoolPhotos: buildPublicreportPoolPhotoWhere[Q](PublicreportPoolPhotos.Columns), + PublicreportPoolImages: buildPublicreportPoolImageWhere[Q](PublicreportPoolImages.Columns), PublicreportQuicks: buildPublicreportQuickWhere[Q](PublicreportQuicks.Columns), - PublicreportQuickPhotos: buildPublicreportQuickPhotoWhere[Q](PublicreportQuickPhotos.Columns), + PublicreportQuickImages: buildPublicreportQuickImageWhere[Q](PublicreportQuickImages.Columns), PublicreportReportLocations: buildPublicreportReportLocationWhere[Q](PublicreportReportLocations.Columns), RasterColumns: buildRasterColumnWhere[Q](RasterColumns.Columns), RasterOverviews: buildRasterOverviewWhere[Q](RasterOverviews.Columns), diff --git a/db/models/publicreport.image.bob.go b/db/models/publicreport.image.bob.go new file mode 100644 index 00000000..01aae3bd --- /dev/null +++ b/db/models/publicreport.image.bob.go @@ -0,0 +1,1440 @@ +// Code generated by BobGen psql v0.42.1. 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" + "strconv" + "time" + + "github.com/aarondl/opt/omit" + "github.com/google/uuid" + "github.com/stephenafamo/bob" + "github.com/stephenafamo/bob/dialect/psql" + "github.com/stephenafamo/bob/dialect/psql/dialect" + "github.com/stephenafamo/bob/dialect/psql/dm" + "github.com/stephenafamo/bob/dialect/psql/sm" + "github.com/stephenafamo/bob/dialect/psql/um" + "github.com/stephenafamo/bob/expr" + "github.com/stephenafamo/bob/mods" + "github.com/stephenafamo/bob/orm" + "github.com/stephenafamo/bob/types/pgtypes" + "github.com/stephenafamo/scan" +) + +// PublicreportImage is an object representing the database table. +type PublicreportImage struct { + ID int32 `db:"id,pk" ` + ContentType string `db:"content_type" ` + Created time.Time `db:"created" ` + 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" ` + + R publicreportImageR `db:"-" ` + + C publicreportImageC `db:"-" ` +} + +// PublicreportImageSlice is an alias for a slice of pointers to PublicreportImage. +// This should almost always be used instead of []*PublicreportImage. +type PublicreportImageSlice []*PublicreportImage + +// PublicreportImages contains methods to work with the image table +var PublicreportImages = psql.NewTablex[*PublicreportImage, PublicreportImageSlice, *PublicreportImageSetter]("publicreport", "image", buildPublicreportImageColumns("publicreport.image")) + +// PublicreportImagesQuery is a query on the image table +type PublicreportImagesQuery = *psql.ViewQuery[*PublicreportImage, PublicreportImageSlice] + +// publicreportImageR is where relationships are stored. +type publicreportImageR struct { + ImageExifs PublicreportImageExifSlice // publicreport.image_exif.image_exif_image_id_fkey + Pools PublicreportPoolSlice // publicreport.pool_image.pool_image_image_id_fkeypublicreport.pool_image.pool_image_pool_id_fkey + Quicks PublicreportQuickSlice // publicreport.quick_image.quick_image_image_id_fkeypublicreport.quick_image.quick_image_quick_id_fkey +} + +func buildPublicreportImageColumns(alias string) publicreportImageColumns { + return publicreportImageColumns{ + ColumnsExpr: expr.NewColumnsExpr( + "id", "content_type", "created", "resolution_x", "resolution_y", "storage_uuid", "storage_size", "uploaded_filename", + ).WithParent("publicreport.image"), + tableAlias: alias, + ID: psql.Quote(alias, "id"), + ContentType: psql.Quote(alias, "content_type"), + Created: psql.Quote(alias, "created"), + 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"), + } +} + +type publicreportImageColumns struct { + expr.ColumnsExpr + tableAlias string + ID psql.Expression + ContentType psql.Expression + Created psql.Expression + ResolutionX psql.Expression + ResolutionY psql.Expression + StorageUUID psql.Expression + StorageSize psql.Expression + UploadedFilename psql.Expression +} + +func (c publicreportImageColumns) Alias() string { + return c.tableAlias +} + +func (publicreportImageColumns) AliasedAs(alias string) publicreportImageColumns { + return buildPublicreportImageColumns(alias) +} + +// PublicreportImageSetter is used for insert/upsert/update operations +// All values are optional, and do not have to be set +// Generated columns are not included +type PublicreportImageSetter struct { + ID omit.Val[int32] `db:"id,pk" ` + ContentType omit.Val[string] `db:"content_type" ` + Created omit.Val[time.Time] `db:"created" ` + 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" ` +} + +func (s PublicreportImageSetter) SetColumns() []string { + vals := make([]string, 0, 8) + if s.ID.IsValue() { + vals = append(vals, "id") + } + if s.ContentType.IsValue() { + vals = append(vals, "content_type") + } + if s.Created.IsValue() { + vals = append(vals, "created") + } + if s.ResolutionX.IsValue() { + vals = append(vals, "resolution_x") + } + if s.ResolutionY.IsValue() { + vals = append(vals, "resolution_y") + } + if s.StorageUUID.IsValue() { + vals = append(vals, "storage_uuid") + } + if s.StorageSize.IsValue() { + vals = append(vals, "storage_size") + } + if s.UploadedFilename.IsValue() { + vals = append(vals, "uploaded_filename") + } + return vals +} + +func (s PublicreportImageSetter) Overwrite(t *PublicreportImage) { + if s.ID.IsValue() { + t.ID = s.ID.MustGet() + } + if s.ContentType.IsValue() { + t.ContentType = s.ContentType.MustGet() + } + if s.Created.IsValue() { + t.Created = s.Created.MustGet() + } + if s.ResolutionX.IsValue() { + t.ResolutionX = s.ResolutionX.MustGet() + } + if s.ResolutionY.IsValue() { + t.ResolutionY = s.ResolutionY.MustGet() + } + if s.StorageUUID.IsValue() { + t.StorageUUID = s.StorageUUID.MustGet() + } + if s.StorageSize.IsValue() { + t.StorageSize = s.StorageSize.MustGet() + } + if s.UploadedFilename.IsValue() { + t.UploadedFilename = s.UploadedFilename.MustGet() + } +} + +func (s *PublicreportImageSetter) Apply(q *dialect.InsertQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportImages.BeforeInsertHooks.RunHooks(ctx, exec, s) + }) + + q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + vals := make([]bob.Expression, 8) + if s.ID.IsValue() { + vals[0] = psql.Arg(s.ID.MustGet()) + } else { + vals[0] = psql.Raw("DEFAULT") + } + + if s.ContentType.IsValue() { + vals[1] = psql.Arg(s.ContentType.MustGet()) + } else { + vals[1] = psql.Raw("DEFAULT") + } + + if s.Created.IsValue() { + vals[2] = psql.Arg(s.Created.MustGet()) + } else { + vals[2] = psql.Raw("DEFAULT") + } + + if s.ResolutionX.IsValue() { + vals[3] = psql.Arg(s.ResolutionX.MustGet()) + } else { + vals[3] = psql.Raw("DEFAULT") + } + + if s.ResolutionY.IsValue() { + vals[4] = psql.Arg(s.ResolutionY.MustGet()) + } else { + vals[4] = psql.Raw("DEFAULT") + } + + if s.StorageUUID.IsValue() { + vals[5] = psql.Arg(s.StorageUUID.MustGet()) + } else { + vals[5] = psql.Raw("DEFAULT") + } + + if s.StorageSize.IsValue() { + vals[6] = psql.Arg(s.StorageSize.MustGet()) + } else { + vals[6] = psql.Raw("DEFAULT") + } + + if s.UploadedFilename.IsValue() { + vals[7] = psql.Arg(s.UploadedFilename.MustGet()) + } else { + vals[7] = psql.Raw("DEFAULT") + } + + return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") + })) +} + +func (s PublicreportImageSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return um.Set(s.Expressions()...) +} + +func (s PublicreportImageSetter) Expressions(prefix ...string) []bob.Expression { + exprs := make([]bob.Expression, 0, 8) + + if s.ID.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "id")...), + psql.Arg(s.ID), + }}) + } + + if s.ContentType.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "content_type")...), + psql.Arg(s.ContentType), + }}) + } + + if s.Created.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "created")...), + psql.Arg(s.Created), + }}) + } + + if s.ResolutionX.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "resolution_x")...), + psql.Arg(s.ResolutionX), + }}) + } + + if s.ResolutionY.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "resolution_y")...), + psql.Arg(s.ResolutionY), + }}) + } + + if s.StorageUUID.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "storage_uuid")...), + psql.Arg(s.StorageUUID), + }}) + } + + if s.StorageSize.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "storage_size")...), + psql.Arg(s.StorageSize), + }}) + } + + if s.UploadedFilename.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "uploaded_filename")...), + psql.Arg(s.UploadedFilename), + }}) + } + + return exprs +} + +// FindPublicreportImage retrieves a single record by primary key +// If cols is empty Find will return all columns. +func FindPublicreportImage(ctx context.Context, exec bob.Executor, IDPK int32, cols ...string) (*PublicreportImage, error) { + if len(cols) == 0 { + return PublicreportImages.Query( + sm.Where(PublicreportImages.Columns.ID.EQ(psql.Arg(IDPK))), + ).One(ctx, exec) + } + + return PublicreportImages.Query( + sm.Where(PublicreportImages.Columns.ID.EQ(psql.Arg(IDPK))), + sm.Columns(PublicreportImages.Columns.Only(cols...)), + ).One(ctx, exec) +} + +// PublicreportImageExists checks the presence of a single record by primary key +func PublicreportImageExists(ctx context.Context, exec bob.Executor, IDPK int32) (bool, error) { + return PublicreportImages.Query( + sm.Where(PublicreportImages.Columns.ID.EQ(psql.Arg(IDPK))), + ).Exists(ctx, exec) +} + +// AfterQueryHook is called after PublicreportImage is retrieved from the database +func (o *PublicreportImage) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportImages.AfterSelectHooks.RunHooks(ctx, exec, PublicreportImageSlice{o}) + case bob.QueryTypeInsert: + ctx, err = PublicreportImages.AfterInsertHooks.RunHooks(ctx, exec, PublicreportImageSlice{o}) + case bob.QueryTypeUpdate: + ctx, err = PublicreportImages.AfterUpdateHooks.RunHooks(ctx, exec, PublicreportImageSlice{o}) + case bob.QueryTypeDelete: + ctx, err = PublicreportImages.AfterDeleteHooks.RunHooks(ctx, exec, PublicreportImageSlice{o}) + } + + return err +} + +// primaryKeyVals returns the primary key values of the PublicreportImage +func (o *PublicreportImage) primaryKeyVals() bob.Expression { + return psql.Arg(o.ID) +} + +func (o *PublicreportImage) pkEQ() dialect.Expression { + return psql.Quote("publicreport.image", "id").EQ(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + return o.primaryKeyVals().WriteSQL(ctx, w, d, start) + })) +} + +// Update uses an executor to update the PublicreportImage +func (o *PublicreportImage) Update(ctx context.Context, exec bob.Executor, s *PublicreportImageSetter) error { + v, err := PublicreportImages.Update(s.UpdateMod(), um.Where(o.pkEQ())).One(ctx, exec) + if err != nil { + return err + } + + o.R = v.R + *o = *v + + return nil +} + +// Delete deletes a single PublicreportImage record with an executor +func (o *PublicreportImage) Delete(ctx context.Context, exec bob.Executor) error { + _, err := PublicreportImages.Delete(dm.Where(o.pkEQ())).Exec(ctx, exec) + return err +} + +// Reload refreshes the PublicreportImage using the executor +func (o *PublicreportImage) Reload(ctx context.Context, exec bob.Executor) error { + o2, err := PublicreportImages.Query( + sm.Where(PublicreportImages.Columns.ID.EQ(psql.Arg(o.ID))), + ).One(ctx, exec) + if err != nil { + return err + } + o2.R = o.R + *o = *o2 + + return nil +} + +// AfterQueryHook is called after PublicreportImageSlice is retrieved from the database +func (o PublicreportImageSlice) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportImages.AfterSelectHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeInsert: + ctx, err = PublicreportImages.AfterInsertHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeUpdate: + ctx, err = PublicreportImages.AfterUpdateHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeDelete: + ctx, err = PublicreportImages.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err +} + +func (o PublicreportImageSlice) pkIN() dialect.Expression { + if len(o) == 0 { + return psql.Raw("NULL") + } + + return psql.Quote("publicreport.image", "id").In(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + pkPairs := make([]bob.Expression, len(o)) + for i, row := range o { + pkPairs[i] = row.primaryKeyVals() + } + return bob.ExpressSlice(ctx, w, d, start, pkPairs, "", ", ", "") + })) +} + +// copyMatchingRows finds models in the given slice that have the same primary key +// then it first copies the existing relationships from the old model to the new model +// and then replaces the old model in the slice with the new model +func (o PublicreportImageSlice) copyMatchingRows(from ...*PublicreportImage) { + for i, old := range o { + for _, new := range from { + if new.ID != old.ID { + continue + } + new.R = old.R + o[i] = new + break + } + } +} + +// UpdateMod modifies an update query with "WHERE primary_key IN (o...)" +func (o PublicreportImageSlice) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return bob.ModFunc[*dialect.UpdateQuery](func(q *dialect.UpdateQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportImages.BeforeUpdateHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportImage: + o.copyMatchingRows(retrieved) + case []*PublicreportImage: + o.copyMatchingRows(retrieved...) + case PublicreportImageSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportImage or a slice of PublicreportImage + // then run the AfterUpdateHooks on the slice + _, err = PublicreportImages.AfterUpdateHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +// DeleteMod modifies an delete query with "WHERE primary_key IN (o...)" +func (o PublicreportImageSlice) DeleteMod() bob.Mod[*dialect.DeleteQuery] { + return bob.ModFunc[*dialect.DeleteQuery](func(q *dialect.DeleteQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportImages.BeforeDeleteHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportImage: + o.copyMatchingRows(retrieved) + case []*PublicreportImage: + o.copyMatchingRows(retrieved...) + case PublicreportImageSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportImage or a slice of PublicreportImage + // then run the AfterDeleteHooks on the slice + _, err = PublicreportImages.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +func (o PublicreportImageSlice) UpdateAll(ctx context.Context, exec bob.Executor, vals PublicreportImageSetter) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportImages.Update(vals.UpdateMod(), o.UpdateMod()).All(ctx, exec) + return err +} + +func (o PublicreportImageSlice) DeleteAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportImages.Delete(o.DeleteMod()).Exec(ctx, exec) + return err +} + +func (o PublicreportImageSlice) ReloadAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + o2, err := PublicreportImages.Query(sm.Where(o.pkIN())).All(ctx, exec) + if err != nil { + return err + } + + o.copyMatchingRows(o2...) + + return nil +} + +// ImageExifs starts a query for related objects on publicreport.image_exif +func (o *PublicreportImage) ImageExifs(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImageExifsQuery { + return PublicreportImageExifs.Query(append(mods, + sm.Where(PublicreportImageExifs.Columns.ImageID.EQ(psql.Arg(o.ID))), + )...) +} + +func (os PublicreportImageSlice) ImageExifs(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImageExifsQuery { + 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 PublicreportImageExifs.Query(append(mods, + sm.Where(psql.Group(PublicreportImageExifs.Columns.ImageID).OP("IN", PKArgExpr)), + )...) +} + +// Pools starts a query for related objects on publicreport.pool +func (o *PublicreportImage) Pools(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolsQuery { + return PublicreportPools.Query(append(mods, + sm.InnerJoin(PublicreportPoolImages.NameAs()).On( + PublicreportPools.Columns.ID.EQ(PublicreportPoolImages.Columns.PoolID)), + sm.Where(PublicreportPoolImages.Columns.ImageID.EQ(psql.Arg(o.ID))), + )...) +} + +func (os PublicreportImageSlice) Pools(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolsQuery { + 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 PublicreportPools.Query(append(mods, + sm.InnerJoin(PublicreportPoolImages.NameAs()).On( + PublicreportPools.Columns.ID.EQ(PublicreportPoolImages.Columns.PoolID), + ), + sm.Where(psql.Group(PublicreportPoolImages.Columns.ImageID).OP("IN", PKArgExpr)), + )...) +} + +// Quicks starts a query for related objects on publicreport.quick +func (o *PublicreportImage) Quicks(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuicksQuery { + return PublicreportQuicks.Query(append(mods, + sm.InnerJoin(PublicreportQuickImages.NameAs()).On( + PublicreportQuicks.Columns.ID.EQ(PublicreportQuickImages.Columns.QuickID)), + sm.Where(PublicreportQuickImages.Columns.ImageID.EQ(psql.Arg(o.ID))), + )...) +} + +func (os PublicreportImageSlice) Quicks(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuicksQuery { + 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 PublicreportQuicks.Query(append(mods, + sm.InnerJoin(PublicreportQuickImages.NameAs()).On( + PublicreportQuicks.Columns.ID.EQ(PublicreportQuickImages.Columns.QuickID), + ), + sm.Where(psql.Group(PublicreportQuickImages.Columns.ImageID).OP("IN", PKArgExpr)), + )...) +} + +func insertPublicreportImageImageExifs0(ctx context.Context, exec bob.Executor, publicreportImageExifs1 []*PublicreportImageExifSetter, publicreportImage0 *PublicreportImage) (PublicreportImageExifSlice, error) { + for i := range publicreportImageExifs1 { + publicreportImageExifs1[i].ImageID = omit.From(publicreportImage0.ID) + } + + ret, err := PublicreportImageExifs.Insert(bob.ToMods(publicreportImageExifs1...)).All(ctx, exec) + if err != nil { + return ret, fmt.Errorf("insertPublicreportImageImageExifs0: %w", err) + } + + return ret, nil +} + +func attachPublicreportImageImageExifs0(ctx context.Context, exec bob.Executor, count int, publicreportImageExifs1 PublicreportImageExifSlice, publicreportImage0 *PublicreportImage) (PublicreportImageExifSlice, error) { + setter := &PublicreportImageExifSetter{ + ImageID: omit.From(publicreportImage0.ID), + } + + err := publicreportImageExifs1.UpdateAll(ctx, exec, *setter) + if err != nil { + return nil, fmt.Errorf("attachPublicreportImageImageExifs0: %w", err) + } + + return publicreportImageExifs1, nil +} + +func (publicreportImage0 *PublicreportImage) InsertImageExifs(ctx context.Context, exec bob.Executor, related ...*PublicreportImageExifSetter) error { + if len(related) == 0 { + return nil + } + + var err error + + publicreportImageExifs1, err := insertPublicreportImageImageExifs0(ctx, exec, related, publicreportImage0) + if err != nil { + return err + } + + publicreportImage0.R.ImageExifs = append(publicreportImage0.R.ImageExifs, publicreportImageExifs1...) + + for _, rel := range publicreportImageExifs1 { + rel.R.Image = publicreportImage0 + } + return nil +} + +func (publicreportImage0 *PublicreportImage) AttachImageExifs(ctx context.Context, exec bob.Executor, related ...*PublicreportImageExif) error { + if len(related) == 0 { + return nil + } + + var err error + publicreportImageExifs1 := PublicreportImageExifSlice(related) + + _, err = attachPublicreportImageImageExifs0(ctx, exec, len(related), publicreportImageExifs1, publicreportImage0) + if err != nil { + return err + } + + publicreportImage0.R.ImageExifs = append(publicreportImage0.R.ImageExifs, publicreportImageExifs1...) + + for _, rel := range related { + rel.R.Image = publicreportImage0 + } + + return nil +} + +func attachPublicreportImagePools0(ctx context.Context, exec bob.Executor, count int, publicreportImage0 *PublicreportImage, publicreportPools2 PublicreportPoolSlice) (PublicreportPoolImageSlice, error) { + setters := make([]*PublicreportPoolImageSetter, count) + for i := range count { + setters[i] = &PublicreportPoolImageSetter{ + ImageID: omit.From(publicreportImage0.ID), + PoolID: omit.From(publicreportPools2[i].ID), + } + } + + publicreportPoolImages1, err := PublicreportPoolImages.Insert(bob.ToMods(setters...)).All(ctx, exec) + if err != nil { + return nil, fmt.Errorf("attachPublicreportImagePools0: %w", err) + } + + return publicreportPoolImages1, nil +} + +func (publicreportImage0 *PublicreportImage) InsertPools(ctx context.Context, exec bob.Executor, related ...*PublicreportPoolSetter) error { + if len(related) == 0 { + return nil + } + + var err error + + inserted, err := PublicreportPools.Insert(bob.ToMods(related...)).All(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + publicreportPools2 := PublicreportPoolSlice(inserted) + + _, err = attachPublicreportImagePools0(ctx, exec, len(related), publicreportImage0, publicreportPools2) + if err != nil { + return err + } + + publicreportImage0.R.Pools = append(publicreportImage0.R.Pools, publicreportPools2...) + + for _, rel := range publicreportPools2 { + rel.R.Images = append(rel.R.Images, publicreportImage0) + } + return nil +} + +func (publicreportImage0 *PublicreportImage) AttachPools(ctx context.Context, exec bob.Executor, related ...*PublicreportPool) error { + if len(related) == 0 { + return nil + } + + var err error + publicreportPools2 := PublicreportPoolSlice(related) + + _, err = attachPublicreportImagePools0(ctx, exec, len(related), publicreportImage0, publicreportPools2) + if err != nil { + return err + } + + publicreportImage0.R.Pools = append(publicreportImage0.R.Pools, publicreportPools2...) + + for _, rel := range related { + rel.R.Images = append(rel.R.Images, publicreportImage0) + } + + return nil +} + +func attachPublicreportImageQuicks0(ctx context.Context, exec bob.Executor, count int, publicreportImage0 *PublicreportImage, publicreportQuicks2 PublicreportQuickSlice) (PublicreportQuickImageSlice, error) { + setters := make([]*PublicreportQuickImageSetter, count) + for i := range count { + setters[i] = &PublicreportQuickImageSetter{ + ImageID: omit.From(publicreportImage0.ID), + QuickID: omit.From(publicreportQuicks2[i].ID), + } + } + + publicreportQuickImages1, err := PublicreportQuickImages.Insert(bob.ToMods(setters...)).All(ctx, exec) + if err != nil { + return nil, fmt.Errorf("attachPublicreportImageQuicks0: %w", err) + } + + return publicreportQuickImages1, nil +} + +func (publicreportImage0 *PublicreportImage) InsertQuicks(ctx context.Context, exec bob.Executor, related ...*PublicreportQuickSetter) error { + if len(related) == 0 { + return nil + } + + var err error + + inserted, err := PublicreportQuicks.Insert(bob.ToMods(related...)).All(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + publicreportQuicks2 := PublicreportQuickSlice(inserted) + + _, err = attachPublicreportImageQuicks0(ctx, exec, len(related), publicreportImage0, publicreportQuicks2) + if err != nil { + return err + } + + publicreportImage0.R.Quicks = append(publicreportImage0.R.Quicks, publicreportQuicks2...) + + for _, rel := range publicreportQuicks2 { + rel.R.Images = append(rel.R.Images, publicreportImage0) + } + return nil +} + +func (publicreportImage0 *PublicreportImage) AttachQuicks(ctx context.Context, exec bob.Executor, related ...*PublicreportQuick) error { + if len(related) == 0 { + return nil + } + + var err error + publicreportQuicks2 := PublicreportQuickSlice(related) + + _, err = attachPublicreportImageQuicks0(ctx, exec, len(related), publicreportImage0, publicreportQuicks2) + if err != nil { + return err + } + + publicreportImage0.R.Quicks = append(publicreportImage0.R.Quicks, publicreportQuicks2...) + + for _, rel := range related { + rel.R.Images = append(rel.R.Images, publicreportImage0) + } + + return nil +} + +type publicreportImageWhere[Q psql.Filterable] struct { + ID psql.WhereMod[Q, int32] + ContentType psql.WhereMod[Q, string] + Created psql.WhereMod[Q, time.Time] + 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] +} + +func (publicreportImageWhere[Q]) AliasedAs(alias string) publicreportImageWhere[Q] { + return buildPublicreportImageWhere[Q](buildPublicreportImageColumns(alias)) +} + +func buildPublicreportImageWhere[Q psql.Filterable](cols publicreportImageColumns) publicreportImageWhere[Q] { + return publicreportImageWhere[Q]{ + ID: psql.Where[Q, int32](cols.ID), + ContentType: psql.Where[Q, string](cols.ContentType), + Created: psql.Where[Q, time.Time](cols.Created), + 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), + } +} + +func (o *PublicreportImage) Preload(name string, retrieved any) error { + if o == nil { + return nil + } + + switch name { + case "ImageExifs": + rels, ok := retrieved.(PublicreportImageExifSlice) + if !ok { + return fmt.Errorf("publicreportImage cannot load %T as %q", retrieved, name) + } + + o.R.ImageExifs = rels + + for _, rel := range rels { + if rel != nil { + rel.R.Image = o + } + } + return nil + case "Pools": + rels, ok := retrieved.(PublicreportPoolSlice) + if !ok { + return fmt.Errorf("publicreportImage cannot load %T as %q", retrieved, name) + } + + o.R.Pools = rels + + for _, rel := range rels { + if rel != nil { + rel.R.Images = PublicreportImageSlice{o} + } + } + return nil + case "Quicks": + rels, ok := retrieved.(PublicreportQuickSlice) + if !ok { + return fmt.Errorf("publicreportImage cannot load %T as %q", retrieved, name) + } + + o.R.Quicks = rels + + for _, rel := range rels { + if rel != nil { + rel.R.Images = PublicreportImageSlice{o} + } + } + return nil + default: + return fmt.Errorf("publicreportImage has no relationship %q", name) + } +} + +type publicreportImagePreloader struct{} + +func buildPublicreportImagePreloader() publicreportImagePreloader { + return publicreportImagePreloader{} +} + +type publicreportImageThenLoader[Q orm.Loadable] struct { + ImageExifs func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Pools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Quicks func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] +} + +func buildPublicreportImageThenLoader[Q orm.Loadable]() publicreportImageThenLoader[Q] { + type ImageExifsLoadInterface interface { + LoadImageExifs(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + type PoolsLoadInterface interface { + LoadPools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + type QuicksLoadInterface interface { + LoadQuicks(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + + return publicreportImageThenLoader[Q]{ + ImageExifs: thenLoadBuilder[Q]( + "ImageExifs", + func(ctx context.Context, exec bob.Executor, retrieved ImageExifsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadImageExifs(ctx, exec, mods...) + }, + ), + Pools: thenLoadBuilder[Q]( + "Pools", + func(ctx context.Context, exec bob.Executor, retrieved PoolsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadPools(ctx, exec, mods...) + }, + ), + Quicks: thenLoadBuilder[Q]( + "Quicks", + func(ctx context.Context, exec bob.Executor, retrieved QuicksLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadQuicks(ctx, exec, mods...) + }, + ), + } +} + +// LoadImageExifs loads the publicreportImage's ImageExifs into the .R struct +func (o *PublicreportImage) LoadImageExifs(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.ImageExifs = nil + + related, err := o.ImageExifs(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, rel := range related { + rel.R.Image = o + } + + o.R.ImageExifs = related + return nil +} + +// LoadImageExifs loads the publicreportImage's ImageExifs into the .R struct +func (os PublicreportImageSlice) LoadImageExifs(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if len(os) == 0 { + return nil + } + + publicreportImageExifs, err := os.ImageExifs(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, o := range os { + if o == nil { + continue + } + + o.R.ImageExifs = nil + } + + for _, o := range os { + if o == nil { + continue + } + + for _, rel := range publicreportImageExifs { + + if !(o.ID == rel.ImageID) { + continue + } + + rel.R.Image = o + + o.R.ImageExifs = append(o.R.ImageExifs, rel) + } + } + + return nil +} + +// LoadPools loads the publicreportImage's Pools into the .R struct +func (o *PublicreportImage) LoadPools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.Pools = nil + + related, err := o.Pools(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, rel := range related { + rel.R.Images = PublicreportImageSlice{o} + } + + o.R.Pools = related + return nil +} + +// LoadPools loads the publicreportImage's Pools into the .R struct +func (os PublicreportImageSlice) LoadPools(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(PublicreportPools.Columns)) + } + + q := os.Pools(append( + mods, + sm.Columns(PublicreportPoolImages.Columns.ImageID.As("related_publicreport.image.ID")), + )...) + + IDSlice := []int32{} + + mapper := scan.Mod(scan.StructMapper[*PublicreportPool](), 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_publicreport.image.ID", &IDSlice[len(IDSlice)-1]) + + return nil, nil + }, + func(any, any) error { + return nil + } + }) + + publicreportPools, err := bob.Allx[bob.SliceTransformer[*PublicreportPool, PublicreportPoolSlice]](ctx, exec, q, mapper) + if err != nil { + return err + } + + for _, o := range os { + o.R.Pools = nil + } + + for _, o := range os { + for i, rel := range publicreportPools { + if !(o.ID == IDSlice[i]) { + continue + } + + rel.R.Images = append(rel.R.Images, o) + + o.R.Pools = append(o.R.Pools, rel) + } + } + + return nil +} + +// LoadQuicks loads the publicreportImage's Quicks into the .R struct +func (o *PublicreportImage) LoadQuicks(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.Quicks = nil + + related, err := o.Quicks(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, rel := range related { + rel.R.Images = PublicreportImageSlice{o} + } + + o.R.Quicks = related + return nil +} + +// LoadQuicks loads the publicreportImage's Quicks into the .R struct +func (os PublicreportImageSlice) LoadQuicks(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(PublicreportQuicks.Columns)) + } + + q := os.Quicks(append( + mods, + sm.Columns(PublicreportQuickImages.Columns.ImageID.As("related_publicreport.image.ID")), + )...) + + IDSlice := []int32{} + + mapper := scan.Mod(scan.StructMapper[*PublicreportQuick](), 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_publicreport.image.ID", &IDSlice[len(IDSlice)-1]) + + return nil, nil + }, + func(any, any) error { + return nil + } + }) + + publicreportQuicks, err := bob.Allx[bob.SliceTransformer[*PublicreportQuick, PublicreportQuickSlice]](ctx, exec, q, mapper) + if err != nil { + return err + } + + for _, o := range os { + o.R.Quicks = nil + } + + for _, o := range os { + for i, rel := range publicreportQuicks { + if !(o.ID == IDSlice[i]) { + continue + } + + rel.R.Images = append(rel.R.Images, o) + + o.R.Quicks = append(o.R.Quicks, rel) + } + } + + return nil +} + +// publicreportImageC is where relationship counts are stored. +type publicreportImageC struct { + ImageExifs *int64 + Pools *int64 + Quicks *int64 +} + +// PreloadCount sets a count in the C struct by name +func (o *PublicreportImage) PreloadCount(name string, count int64) error { + if o == nil { + return nil + } + + switch name { + case "ImageExifs": + o.C.ImageExifs = &count + case "Pools": + o.C.Pools = &count + case "Quicks": + o.C.Quicks = &count + } + return nil +} + +type publicreportImageCountPreloader struct { + ImageExifs func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader + Pools func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader + Quicks func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader +} + +func buildPublicreportImageCountPreloader() publicreportImageCountPreloader { + return publicreportImageCountPreloader{ + ImageExifs: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader { + return countPreloader[*PublicreportImage]("ImageExifs", func(parent string) bob.Expression { + // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk) + if parent == "" { + parent = PublicreportImages.Alias() + } + + subqueryMods := []bob.Mod[*dialect.SelectQuery]{ + sm.Columns(psql.Raw("count(*)")), + + sm.From(PublicreportImageExifs.Name()), + sm.Where(psql.Quote(PublicreportImageExifs.Alias(), "image_id").EQ(psql.Quote(parent, "id"))), + } + subqueryMods = append(subqueryMods, mods...) + return psql.Group(psql.Select(subqueryMods...).Expression) + }) + }, + Pools: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader { + return countPreloader[*PublicreportImage]("Pools", func(parent string) bob.Expression { + // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk) + if parent == "" { + parent = PublicreportImages.Alias() + } + + subqueryMods := []bob.Mod[*dialect.SelectQuery]{ + sm.Columns(psql.Raw("count(*)")), + + sm.From(PublicreportPoolImages.Name()), + sm.Where(psql.Quote(PublicreportPoolImages.Alias(), "image_id").EQ(psql.Quote(parent, "id"))), + sm.InnerJoin(PublicreportPools.Name()).On( + psql.Quote(PublicreportPools.Alias(), "id").EQ(psql.Quote(PublicreportPoolImages.Alias(), "pool_id")), + ), + } + subqueryMods = append(subqueryMods, mods...) + return psql.Group(psql.Select(subqueryMods...).Expression) + }) + }, + Quicks: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader { + return countPreloader[*PublicreportImage]("Quicks", func(parent string) bob.Expression { + // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk) + if parent == "" { + parent = PublicreportImages.Alias() + } + + subqueryMods := []bob.Mod[*dialect.SelectQuery]{ + sm.Columns(psql.Raw("count(*)")), + + sm.From(PublicreportQuickImages.Name()), + sm.Where(psql.Quote(PublicreportQuickImages.Alias(), "image_id").EQ(psql.Quote(parent, "id"))), + sm.InnerJoin(PublicreportQuicks.Name()).On( + psql.Quote(PublicreportQuicks.Alias(), "id").EQ(psql.Quote(PublicreportQuickImages.Alias(), "quick_id")), + ), + } + subqueryMods = append(subqueryMods, mods...) + return psql.Group(psql.Select(subqueryMods...).Expression) + }) + }, + } +} + +type publicreportImageCountThenLoader[Q orm.Loadable] struct { + ImageExifs func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Pools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Quicks func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] +} + +func buildPublicreportImageCountThenLoader[Q orm.Loadable]() publicreportImageCountThenLoader[Q] { + type ImageExifsCountInterface interface { + LoadCountImageExifs(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + type PoolsCountInterface interface { + LoadCountPools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + type QuicksCountInterface interface { + LoadCountQuicks(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + + return publicreportImageCountThenLoader[Q]{ + ImageExifs: countThenLoadBuilder[Q]( + "ImageExifs", + func(ctx context.Context, exec bob.Executor, retrieved ImageExifsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadCountImageExifs(ctx, exec, mods...) + }, + ), + Pools: countThenLoadBuilder[Q]( + "Pools", + func(ctx context.Context, exec bob.Executor, retrieved PoolsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadCountPools(ctx, exec, mods...) + }, + ), + Quicks: countThenLoadBuilder[Q]( + "Quicks", + func(ctx context.Context, exec bob.Executor, retrieved QuicksCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadCountQuicks(ctx, exec, mods...) + }, + ), + } +} + +// LoadCountImageExifs loads the count of ImageExifs into the C struct +func (o *PublicreportImage) LoadCountImageExifs(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + count, err := o.ImageExifs(mods...).Count(ctx, exec) + if err != nil { + return err + } + + o.C.ImageExifs = &count + return nil +} + +// LoadCountImageExifs loads the count of ImageExifs for a slice +func (os PublicreportImageSlice) LoadCountImageExifs(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.LoadCountImageExifs(ctx, exec, mods...); err != nil { + return err + } + } + + return nil +} + +// LoadCountPools loads the count of Pools into the C struct +func (o *PublicreportImage) LoadCountPools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + count, err := o.Pools(mods...).Count(ctx, exec) + if err != nil { + return err + } + + o.C.Pools = &count + return nil +} + +// LoadCountPools loads the count of Pools for a slice +func (os PublicreportImageSlice) LoadCountPools(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.LoadCountPools(ctx, exec, mods...); err != nil { + return err + } + } + + return nil +} + +// LoadCountQuicks loads the count of Quicks into the C struct +func (o *PublicreportImage) LoadCountQuicks(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + count, err := o.Quicks(mods...).Count(ctx, exec) + if err != nil { + return err + } + + o.C.Quicks = &count + return nil +} + +// LoadCountQuicks loads the count of Quicks for a slice +func (os PublicreportImageSlice) LoadCountQuicks(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.LoadCountQuicks(ctx, exec, mods...); err != nil { + return err + } + } + + return nil +} + +type publicreportImageJoins[Q dialect.Joinable] struct { + typ string + ImageExifs modAs[Q, publicreportImageExifColumns] + Pools modAs[Q, publicreportPoolColumns] + Quicks modAs[Q, publicreportQuickColumns] +} + +func (j publicreportImageJoins[Q]) aliasedAs(alias string) publicreportImageJoins[Q] { + return buildPublicreportImageJoins[Q](buildPublicreportImageColumns(alias), j.typ) +} + +func buildPublicreportImageJoins[Q dialect.Joinable](cols publicreportImageColumns, typ string) publicreportImageJoins[Q] { + return publicreportImageJoins[Q]{ + typ: typ, + ImageExifs: modAs[Q, publicreportImageExifColumns]{ + c: PublicreportImageExifs.Columns, + f: func(to publicreportImageExifColumns) bob.Mod[Q] { + mods := make(mods.QueryMods[Q], 0, 1) + + { + mods = append(mods, dialect.Join[Q](typ, PublicreportImageExifs.Name().As(to.Alias())).On( + to.ImageID.EQ(cols.ID), + )) + } + + return mods + }, + }, + Pools: modAs[Q, publicreportPoolColumns]{ + c: PublicreportPools.Columns, + f: func(to publicreportPoolColumns) bob.Mod[Q] { + random := strconv.FormatInt(randInt(), 10) + mods := make(mods.QueryMods[Q], 0, 2) + + { + to := PublicreportPoolImages.Columns.AliasedAs(PublicreportPoolImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportPoolImages.Name().As(to.Alias())).On( + to.ImageID.EQ(cols.ID), + )) + } + { + cols := PublicreportPoolImages.Columns.AliasedAs(PublicreportPoolImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportPools.Name().As(to.Alias())).On( + to.ID.EQ(cols.PoolID), + )) + } + + return mods + }, + }, + Quicks: modAs[Q, publicreportQuickColumns]{ + c: PublicreportQuicks.Columns, + f: func(to publicreportQuickColumns) bob.Mod[Q] { + random := strconv.FormatInt(randInt(), 10) + mods := make(mods.QueryMods[Q], 0, 2) + + { + to := PublicreportQuickImages.Columns.AliasedAs(PublicreportQuickImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportQuickImages.Name().As(to.Alias())).On( + to.ImageID.EQ(cols.ID), + )) + } + { + cols := PublicreportQuickImages.Columns.AliasedAs(PublicreportQuickImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportQuicks.Name().As(to.Alias())).On( + to.ID.EQ(cols.QuickID), + )) + } + + return mods + }, + }, + } +} diff --git a/db/models/publicreport.image_exif.bob.go b/db/models/publicreport.image_exif.bob.go new file mode 100644 index 00000000..bc4ac461 --- /dev/null +++ b/db/models/publicreport.image_exif.bob.go @@ -0,0 +1,645 @@ +// Code generated by BobGen psql v0.42.1. 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/aarondl/opt/omit" + "github.com/stephenafamo/bob" + "github.com/stephenafamo/bob/dialect/psql" + "github.com/stephenafamo/bob/dialect/psql/dialect" + "github.com/stephenafamo/bob/dialect/psql/dm" + "github.com/stephenafamo/bob/dialect/psql/sm" + "github.com/stephenafamo/bob/dialect/psql/um" + "github.com/stephenafamo/bob/expr" + "github.com/stephenafamo/bob/mods" + "github.com/stephenafamo/bob/orm" + "github.com/stephenafamo/bob/types/pgtypes" +) + +// PublicreportImageExif is an object representing the database table. +type PublicreportImageExif struct { + ImageID int32 `db:"image_id,pk" ` + Name string `db:"name,pk" ` + Value string `db:"value,pk" ` + + R publicreportImageExifR `db:"-" ` +} + +// PublicreportImageExifSlice is an alias for a slice of pointers to PublicreportImageExif. +// This should almost always be used instead of []*PublicreportImageExif. +type PublicreportImageExifSlice []*PublicreportImageExif + +// PublicreportImageExifs contains methods to work with the image_exif table +var PublicreportImageExifs = psql.NewTablex[*PublicreportImageExif, PublicreportImageExifSlice, *PublicreportImageExifSetter]("publicreport", "image_exif", buildPublicreportImageExifColumns("publicreport.image_exif")) + +// PublicreportImageExifsQuery is a query on the image_exif table +type PublicreportImageExifsQuery = *psql.ViewQuery[*PublicreportImageExif, PublicreportImageExifSlice] + +// publicreportImageExifR is where relationships are stored. +type publicreportImageExifR struct { + Image *PublicreportImage // publicreport.image_exif.image_exif_image_id_fkey +} + +func buildPublicreportImageExifColumns(alias string) publicreportImageExifColumns { + return publicreportImageExifColumns{ + ColumnsExpr: expr.NewColumnsExpr( + "image_id", "name", "value", + ).WithParent("publicreport.image_exif"), + tableAlias: alias, + ImageID: psql.Quote(alias, "image_id"), + Name: psql.Quote(alias, "name"), + Value: psql.Quote(alias, "value"), + } +} + +type publicreportImageExifColumns struct { + expr.ColumnsExpr + tableAlias string + ImageID psql.Expression + Name psql.Expression + Value psql.Expression +} + +func (c publicreportImageExifColumns) Alias() string { + return c.tableAlias +} + +func (publicreportImageExifColumns) AliasedAs(alias string) publicreportImageExifColumns { + return buildPublicreportImageExifColumns(alias) +} + +// PublicreportImageExifSetter is used for insert/upsert/update operations +// All values are optional, and do not have to be set +// Generated columns are not included +type PublicreportImageExifSetter struct { + ImageID omit.Val[int32] `db:"image_id,pk" ` + Name omit.Val[string] `db:"name,pk" ` + Value omit.Val[string] `db:"value,pk" ` +} + +func (s PublicreportImageExifSetter) SetColumns() []string { + vals := make([]string, 0, 3) + if s.ImageID.IsValue() { + vals = append(vals, "image_id") + } + if s.Name.IsValue() { + vals = append(vals, "name") + } + if s.Value.IsValue() { + vals = append(vals, "value") + } + return vals +} + +func (s PublicreportImageExifSetter) Overwrite(t *PublicreportImageExif) { + if s.ImageID.IsValue() { + t.ImageID = s.ImageID.MustGet() + } + if s.Name.IsValue() { + t.Name = s.Name.MustGet() + } + if s.Value.IsValue() { + t.Value = s.Value.MustGet() + } +} + +func (s *PublicreportImageExifSetter) Apply(q *dialect.InsertQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportImageExifs.BeforeInsertHooks.RunHooks(ctx, exec, s) + }) + + 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.ImageID.IsValue() { + vals[0] = psql.Arg(s.ImageID.MustGet()) + } else { + vals[0] = psql.Raw("DEFAULT") + } + + if s.Name.IsValue() { + vals[1] = psql.Arg(s.Name.MustGet()) + } else { + vals[1] = psql.Raw("DEFAULT") + } + + if s.Value.IsValue() { + vals[2] = psql.Arg(s.Value.MustGet()) + } else { + vals[2] = psql.Raw("DEFAULT") + } + + return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") + })) +} + +func (s PublicreportImageExifSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return um.Set(s.Expressions()...) +} + +func (s PublicreportImageExifSetter) Expressions(prefix ...string) []bob.Expression { + exprs := make([]bob.Expression, 0, 3) + + if s.ImageID.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "image_id")...), + psql.Arg(s.ImageID), + }}) + } + + if s.Name.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "name")...), + psql.Arg(s.Name), + }}) + } + + if s.Value.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "value")...), + psql.Arg(s.Value), + }}) + } + + return exprs +} + +// FindPublicreportImageExif retrieves a single record by primary key +// If cols is empty Find will return all columns. +func FindPublicreportImageExif(ctx context.Context, exec bob.Executor, ImageIDPK int32, NamePK string, ValuePK string, cols ...string) (*PublicreportImageExif, error) { + if len(cols) == 0 { + return PublicreportImageExifs.Query( + sm.Where(PublicreportImageExifs.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportImageExifs.Columns.Name.EQ(psql.Arg(NamePK))), + sm.Where(PublicreportImageExifs.Columns.Value.EQ(psql.Arg(ValuePK))), + ).One(ctx, exec) + } + + return PublicreportImageExifs.Query( + sm.Where(PublicreportImageExifs.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportImageExifs.Columns.Name.EQ(psql.Arg(NamePK))), + sm.Where(PublicreportImageExifs.Columns.Value.EQ(psql.Arg(ValuePK))), + sm.Columns(PublicreportImageExifs.Columns.Only(cols...)), + ).One(ctx, exec) +} + +// PublicreportImageExifExists checks the presence of a single record by primary key +func PublicreportImageExifExists(ctx context.Context, exec bob.Executor, ImageIDPK int32, NamePK string, ValuePK string) (bool, error) { + return PublicreportImageExifs.Query( + sm.Where(PublicreportImageExifs.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportImageExifs.Columns.Name.EQ(psql.Arg(NamePK))), + sm.Where(PublicreportImageExifs.Columns.Value.EQ(psql.Arg(ValuePK))), + ).Exists(ctx, exec) +} + +// AfterQueryHook is called after PublicreportImageExif is retrieved from the database +func (o *PublicreportImageExif) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportImageExifs.AfterSelectHooks.RunHooks(ctx, exec, PublicreportImageExifSlice{o}) + case bob.QueryTypeInsert: + ctx, err = PublicreportImageExifs.AfterInsertHooks.RunHooks(ctx, exec, PublicreportImageExifSlice{o}) + case bob.QueryTypeUpdate: + ctx, err = PublicreportImageExifs.AfterUpdateHooks.RunHooks(ctx, exec, PublicreportImageExifSlice{o}) + case bob.QueryTypeDelete: + ctx, err = PublicreportImageExifs.AfterDeleteHooks.RunHooks(ctx, exec, PublicreportImageExifSlice{o}) + } + + return err +} + +// primaryKeyVals returns the primary key values of the PublicreportImageExif +func (o *PublicreportImageExif) primaryKeyVals() bob.Expression { + return psql.ArgGroup( + o.ImageID, + o.Name, + o.Value, + ) +} + +func (o *PublicreportImageExif) pkEQ() dialect.Expression { + return psql.Group(psql.Quote("publicreport.image_exif", "image_id"), psql.Quote("publicreport.image_exif", "name"), psql.Quote("publicreport.image_exif", "value")).EQ(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + return o.primaryKeyVals().WriteSQL(ctx, w, d, start) + })) +} + +// Update uses an executor to update the PublicreportImageExif +func (o *PublicreportImageExif) Update(ctx context.Context, exec bob.Executor, s *PublicreportImageExifSetter) error { + v, err := PublicreportImageExifs.Update(s.UpdateMod(), um.Where(o.pkEQ())).One(ctx, exec) + if err != nil { + return err + } + + o.R = v.R + *o = *v + + return nil +} + +// Delete deletes a single PublicreportImageExif record with an executor +func (o *PublicreportImageExif) Delete(ctx context.Context, exec bob.Executor) error { + _, err := PublicreportImageExifs.Delete(dm.Where(o.pkEQ())).Exec(ctx, exec) + return err +} + +// Reload refreshes the PublicreportImageExif using the executor +func (o *PublicreportImageExif) Reload(ctx context.Context, exec bob.Executor) error { + o2, err := PublicreportImageExifs.Query( + sm.Where(PublicreportImageExifs.Columns.ImageID.EQ(psql.Arg(o.ImageID))), + sm.Where(PublicreportImageExifs.Columns.Name.EQ(psql.Arg(o.Name))), + sm.Where(PublicreportImageExifs.Columns.Value.EQ(psql.Arg(o.Value))), + ).One(ctx, exec) + if err != nil { + return err + } + o2.R = o.R + *o = *o2 + + return nil +} + +// AfterQueryHook is called after PublicreportImageExifSlice is retrieved from the database +func (o PublicreportImageExifSlice) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportImageExifs.AfterSelectHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeInsert: + ctx, err = PublicreportImageExifs.AfterInsertHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeUpdate: + ctx, err = PublicreportImageExifs.AfterUpdateHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeDelete: + ctx, err = PublicreportImageExifs.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err +} + +func (o PublicreportImageExifSlice) pkIN() dialect.Expression { + if len(o) == 0 { + return psql.Raw("NULL") + } + + return psql.Group(psql.Quote("publicreport.image_exif", "image_id"), psql.Quote("publicreport.image_exif", "name"), psql.Quote("publicreport.image_exif", "value")).In(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + pkPairs := make([]bob.Expression, len(o)) + for i, row := range o { + pkPairs[i] = row.primaryKeyVals() + } + return bob.ExpressSlice(ctx, w, d, start, pkPairs, "", ", ", "") + })) +} + +// copyMatchingRows finds models in the given slice that have the same primary key +// then it first copies the existing relationships from the old model to the new model +// and then replaces the old model in the slice with the new model +func (o PublicreportImageExifSlice) copyMatchingRows(from ...*PublicreportImageExif) { + for i, old := range o { + for _, new := range from { + if new.ImageID != old.ImageID { + continue + } + if new.Name != old.Name { + continue + } + if new.Value != old.Value { + continue + } + new.R = old.R + o[i] = new + break + } + } +} + +// UpdateMod modifies an update query with "WHERE primary_key IN (o...)" +func (o PublicreportImageExifSlice) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return bob.ModFunc[*dialect.UpdateQuery](func(q *dialect.UpdateQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportImageExifs.BeforeUpdateHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportImageExif: + o.copyMatchingRows(retrieved) + case []*PublicreportImageExif: + o.copyMatchingRows(retrieved...) + case PublicreportImageExifSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportImageExif or a slice of PublicreportImageExif + // then run the AfterUpdateHooks on the slice + _, err = PublicreportImageExifs.AfterUpdateHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +// DeleteMod modifies an delete query with "WHERE primary_key IN (o...)" +func (o PublicreportImageExifSlice) DeleteMod() bob.Mod[*dialect.DeleteQuery] { + return bob.ModFunc[*dialect.DeleteQuery](func(q *dialect.DeleteQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportImageExifs.BeforeDeleteHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportImageExif: + o.copyMatchingRows(retrieved) + case []*PublicreportImageExif: + o.copyMatchingRows(retrieved...) + case PublicreportImageExifSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportImageExif or a slice of PublicreportImageExif + // then run the AfterDeleteHooks on the slice + _, err = PublicreportImageExifs.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +func (o PublicreportImageExifSlice) UpdateAll(ctx context.Context, exec bob.Executor, vals PublicreportImageExifSetter) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportImageExifs.Update(vals.UpdateMod(), o.UpdateMod()).All(ctx, exec) + return err +} + +func (o PublicreportImageExifSlice) DeleteAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportImageExifs.Delete(o.DeleteMod()).Exec(ctx, exec) + return err +} + +func (o PublicreportImageExifSlice) ReloadAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + o2, err := PublicreportImageExifs.Query(sm.Where(o.pkIN())).All(ctx, exec) + if err != nil { + return err + } + + o.copyMatchingRows(o2...) + + return nil +} + +// Image starts a query for related objects on publicreport.image +func (o *PublicreportImageExif) Image(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + return PublicreportImages.Query(append(mods, + sm.Where(PublicreportImages.Columns.ID.EQ(psql.Arg(o.ImageID))), + )...) +} + +func (os PublicreportImageExifSlice) Image(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + pkImageID := make(pgtypes.Array[int32], 0, len(os)) + for _, o := range os { + if o == nil { + continue + } + pkImageID = append(pkImageID, o.ImageID) + } + PKArgExpr := psql.Select(sm.Columns( + psql.F("unnest", psql.Cast(psql.Arg(pkImageID), "integer[]")), + )) + + return PublicreportImages.Query(append(mods, + sm.Where(psql.Group(PublicreportImages.Columns.ID).OP("IN", PKArgExpr)), + )...) +} + +func attachPublicreportImageExifImage0(ctx context.Context, exec bob.Executor, count int, publicreportImageExif0 *PublicreportImageExif, publicreportImage1 *PublicreportImage) (*PublicreportImageExif, error) { + setter := &PublicreportImageExifSetter{ + ImageID: omit.From(publicreportImage1.ID), + } + + err := publicreportImageExif0.Update(ctx, exec, setter) + if err != nil { + return nil, fmt.Errorf("attachPublicreportImageExifImage0: %w", err) + } + + return publicreportImageExif0, nil +} + +func (publicreportImageExif0 *PublicreportImageExif) InsertImage(ctx context.Context, exec bob.Executor, related *PublicreportImageSetter) error { + var err error + + publicreportImage1, err := PublicreportImages.Insert(related).One(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + + _, err = attachPublicreportImageExifImage0(ctx, exec, 1, publicreportImageExif0, publicreportImage1) + if err != nil { + return err + } + + publicreportImageExif0.R.Image = publicreportImage1 + + publicreportImage1.R.ImageExifs = append(publicreportImage1.R.ImageExifs, publicreportImageExif0) + + return nil +} + +func (publicreportImageExif0 *PublicreportImageExif) AttachImage(ctx context.Context, exec bob.Executor, publicreportImage1 *PublicreportImage) error { + var err error + + _, err = attachPublicreportImageExifImage0(ctx, exec, 1, publicreportImageExif0, publicreportImage1) + if err != nil { + return err + } + + publicreportImageExif0.R.Image = publicreportImage1 + + publicreportImage1.R.ImageExifs = append(publicreportImage1.R.ImageExifs, publicreportImageExif0) + + return nil +} + +type publicreportImageExifWhere[Q psql.Filterable] struct { + ImageID psql.WhereMod[Q, int32] + Name psql.WhereMod[Q, string] + Value psql.WhereMod[Q, string] +} + +func (publicreportImageExifWhere[Q]) AliasedAs(alias string) publicreportImageExifWhere[Q] { + return buildPublicreportImageExifWhere[Q](buildPublicreportImageExifColumns(alias)) +} + +func buildPublicreportImageExifWhere[Q psql.Filterable](cols publicreportImageExifColumns) publicreportImageExifWhere[Q] { + return publicreportImageExifWhere[Q]{ + ImageID: psql.Where[Q, int32](cols.ImageID), + Name: psql.Where[Q, string](cols.Name), + Value: psql.Where[Q, string](cols.Value), + } +} + +func (o *PublicreportImageExif) Preload(name string, retrieved any) error { + if o == nil { + return nil + } + + switch name { + case "Image": + rel, ok := retrieved.(*PublicreportImage) + if !ok { + return fmt.Errorf("publicreportImageExif cannot load %T as %q", retrieved, name) + } + + o.R.Image = rel + + if rel != nil { + rel.R.ImageExifs = PublicreportImageExifSlice{o} + } + return nil + default: + return fmt.Errorf("publicreportImageExif has no relationship %q", name) + } +} + +type publicreportImageExifPreloader struct { + Image func(...psql.PreloadOption) psql.Preloader +} + +func buildPublicreportImageExifPreloader() publicreportImageExifPreloader { + return publicreportImageExifPreloader{ + Image: func(opts ...psql.PreloadOption) psql.Preloader { + return psql.Preload[*PublicreportImage, PublicreportImageSlice](psql.PreloadRel{ + Name: "Image", + Sides: []psql.PreloadSide{ + { + From: PublicreportImageExifs, + To: PublicreportImages, + FromColumns: []string{"image_id"}, + ToColumns: []string{"id"}, + }, + }, + }, PublicreportImages.Columns.Names(), opts...) + }, + } +} + +type publicreportImageExifThenLoader[Q orm.Loadable] struct { + Image func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] +} + +func buildPublicreportImageExifThenLoader[Q orm.Loadable]() publicreportImageExifThenLoader[Q] { + type ImageLoadInterface interface { + LoadImage(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + + return publicreportImageExifThenLoader[Q]{ + Image: thenLoadBuilder[Q]( + "Image", + func(ctx context.Context, exec bob.Executor, retrieved ImageLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadImage(ctx, exec, mods...) + }, + ), + } +} + +// LoadImage loads the publicreportImageExif's Image into the .R struct +func (o *PublicreportImageExif) LoadImage(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.Image = nil + + related, err := o.Image(mods...).One(ctx, exec) + if err != nil { + return err + } + + related.R.ImageExifs = PublicreportImageExifSlice{o} + + o.R.Image = related + return nil +} + +// LoadImage loads the publicreportImageExif's Image into the .R struct +func (os PublicreportImageExifSlice) LoadImage(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if len(os) == 0 { + return nil + } + + publicreportImages, err := os.Image(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, o := range os { + if o == nil { + continue + } + + for _, rel := range publicreportImages { + + if !(o.ImageID == rel.ID) { + continue + } + + rel.R.ImageExifs = append(rel.R.ImageExifs, o) + + o.R.Image = rel + break + } + } + + return nil +} + +type publicreportImageExifJoins[Q dialect.Joinable] struct { + typ string + Image modAs[Q, publicreportImageColumns] +} + +func (j publicreportImageExifJoins[Q]) aliasedAs(alias string) publicreportImageExifJoins[Q] { + return buildPublicreportImageExifJoins[Q](buildPublicreportImageExifColumns(alias), j.typ) +} + +func buildPublicreportImageExifJoins[Q dialect.Joinable](cols publicreportImageExifColumns, typ string) publicreportImageExifJoins[Q] { + return publicreportImageExifJoins[Q]{ + typ: typ, + Image: modAs[Q, publicreportImageColumns]{ + c: PublicreportImages.Columns, + f: func(to publicreportImageColumns) bob.Mod[Q] { + mods := make(mods.QueryMods[Q], 0, 1) + + { + mods = append(mods, dialect.Join[Q](typ, PublicreportImages.Name().As(to.Alias())).On( + to.ID.EQ(cols.ImageID), + )) + } + + return mods + }, + }, + } +} diff --git a/db/models/publicreport.pool.bob.go b/db/models/publicreport.pool.bob.go index 350af417..0a5a9d8e 100644 --- a/db/models/publicreport.pool.bob.go +++ b/db/models/publicreport.pool.bob.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "io" + "strconv" "time" enums "github.com/Gleipnir-Technology/nidus-sync/db/enums" @@ -23,6 +24,7 @@ import ( "github.com/stephenafamo/bob/mods" "github.com/stephenafamo/bob/orm" "github.com/stephenafamo/bob/types/pgtypes" + "github.com/stephenafamo/scan" ) // PublicreportPool is an object representing the database table. @@ -75,7 +77,7 @@ type PublicreportPoolsQuery = *psql.ViewQuery[*PublicreportPool, PublicreportPoo // publicreportPoolR is where relationships are stored. type publicreportPoolR struct { - PoolPhotos PublicreportPoolPhotoSlice // publicreport.pool_photo.pool_photo_pool_id_fkey + Images PublicreportImageSlice // publicreport.pool_image.pool_image_image_id_fkeypublicreport.pool_image.pool_image_pool_id_fkey } func buildPublicreportPoolColumns(alias string) publicreportPoolColumns { @@ -1018,14 +1020,16 @@ func (o PublicreportPoolSlice) ReloadAll(ctx context.Context, exec bob.Executor) return nil } -// PoolPhotos starts a query for related objects on publicreport.pool_photo -func (o *PublicreportPool) PoolPhotos(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolPhotosQuery { - return PublicreportPoolPhotos.Query(append(mods, - sm.Where(PublicreportPoolPhotos.Columns.PoolID.EQ(psql.Arg(o.ID))), +// Images starts a query for related objects on publicreport.image +func (o *PublicreportPool) Images(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + return PublicreportImages.Query(append(mods, + sm.InnerJoin(PublicreportPoolImages.NameAs()).On( + PublicreportImages.Columns.ID.EQ(PublicreportPoolImages.Columns.ImageID)), + sm.Where(PublicreportPoolImages.Columns.PoolID.EQ(psql.Arg(o.ID))), )...) } -func (os PublicreportPoolSlice) PoolPhotos(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolPhotosQuery { +func (os PublicreportPoolSlice) Images(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { pkID := make(pgtypes.Array[int32], 0, len(os)) for _, o := range os { if o == nil { @@ -1037,74 +1041,74 @@ func (os PublicreportPoolSlice) PoolPhotos(mods ...bob.Mod[*dialect.SelectQuery] psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")), )) - return PublicreportPoolPhotos.Query(append(mods, - sm.Where(psql.Group(PublicreportPoolPhotos.Columns.PoolID).OP("IN", PKArgExpr)), + return PublicreportImages.Query(append(mods, + sm.InnerJoin(PublicreportPoolImages.NameAs()).On( + PublicreportImages.Columns.ID.EQ(PublicreportPoolImages.Columns.ImageID), + ), + sm.Where(psql.Group(PublicreportPoolImages.Columns.PoolID).OP("IN", PKArgExpr)), )...) } -func insertPublicreportPoolPoolPhotos0(ctx context.Context, exec bob.Executor, publicreportPoolPhotos1 []*PublicreportPoolPhotoSetter, publicreportPool0 *PublicreportPool) (PublicreportPoolPhotoSlice, error) { - for i := range publicreportPoolPhotos1 { - publicreportPoolPhotos1[i].PoolID = omit.From(publicreportPool0.ID) +func attachPublicreportPoolImages0(ctx context.Context, exec bob.Executor, count int, publicreportPool0 *PublicreportPool, publicreportImages2 PublicreportImageSlice) (PublicreportPoolImageSlice, error) { + setters := make([]*PublicreportPoolImageSetter, count) + for i := range count { + setters[i] = &PublicreportPoolImageSetter{ + PoolID: omit.From(publicreportPool0.ID), + ImageID: omit.From(publicreportImages2[i].ID), + } } - ret, err := PublicreportPoolPhotos.Insert(bob.ToMods(publicreportPoolPhotos1...)).All(ctx, exec) + publicreportPoolImages1, err := PublicreportPoolImages.Insert(bob.ToMods(setters...)).All(ctx, exec) if err != nil { - return ret, fmt.Errorf("insertPublicreportPoolPoolPhotos0: %w", err) + return nil, fmt.Errorf("attachPublicreportPoolImages0: %w", err) } - return ret, nil + return publicreportPoolImages1, nil } -func attachPublicreportPoolPoolPhotos0(ctx context.Context, exec bob.Executor, count int, publicreportPoolPhotos1 PublicreportPoolPhotoSlice, publicreportPool0 *PublicreportPool) (PublicreportPoolPhotoSlice, error) { - setter := &PublicreportPoolPhotoSetter{ - PoolID: omit.From(publicreportPool0.ID), - } - - err := publicreportPoolPhotos1.UpdateAll(ctx, exec, *setter) - if err != nil { - return nil, fmt.Errorf("attachPublicreportPoolPoolPhotos0: %w", err) - } - - return publicreportPoolPhotos1, nil -} - -func (publicreportPool0 *PublicreportPool) InsertPoolPhotos(ctx context.Context, exec bob.Executor, related ...*PublicreportPoolPhotoSetter) error { +func (publicreportPool0 *PublicreportPool) InsertImages(ctx context.Context, exec bob.Executor, related ...*PublicreportImageSetter) error { if len(related) == 0 { return nil } var err error - publicreportPoolPhotos1, err := insertPublicreportPoolPoolPhotos0(ctx, exec, related, publicreportPool0) + inserted, err := PublicreportImages.Insert(bob.ToMods(related...)).All(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + publicreportImages2 := PublicreportImageSlice(inserted) + + _, err = attachPublicreportPoolImages0(ctx, exec, len(related), publicreportPool0, publicreportImages2) if err != nil { return err } - publicreportPool0.R.PoolPhotos = append(publicreportPool0.R.PoolPhotos, publicreportPoolPhotos1...) + publicreportPool0.R.Images = append(publicreportPool0.R.Images, publicreportImages2...) - for _, rel := range publicreportPoolPhotos1 { - rel.R.Pool = publicreportPool0 + for _, rel := range publicreportImages2 { + rel.R.Pools = append(rel.R.Pools, publicreportPool0) } return nil } -func (publicreportPool0 *PublicreportPool) AttachPoolPhotos(ctx context.Context, exec bob.Executor, related ...*PublicreportPoolPhoto) error { +func (publicreportPool0 *PublicreportPool) AttachImages(ctx context.Context, exec bob.Executor, related ...*PublicreportImage) error { if len(related) == 0 { return nil } var err error - publicreportPoolPhotos1 := PublicreportPoolPhotoSlice(related) + publicreportImages2 := PublicreportImageSlice(related) - _, err = attachPublicreportPoolPoolPhotos0(ctx, exec, len(related), publicreportPoolPhotos1, publicreportPool0) + _, err = attachPublicreportPoolImages0(ctx, exec, len(related), publicreportPool0, publicreportImages2) if err != nil { return err } - publicreportPool0.R.PoolPhotos = append(publicreportPool0.R.PoolPhotos, publicreportPoolPhotos1...) + publicreportPool0.R.Images = append(publicreportPool0.R.Images, publicreportImages2...) for _, rel := range related { - rel.R.Pool = publicreportPool0 + rel.R.Pools = append(rel.R.Pools, publicreportPool0) } return nil @@ -1188,17 +1192,17 @@ func (o *PublicreportPool) Preload(name string, retrieved any) error { } switch name { - case "PoolPhotos": - rels, ok := retrieved.(PublicreportPoolPhotoSlice) + case "Images": + rels, ok := retrieved.(PublicreportImageSlice) if !ok { return fmt.Errorf("publicreportPool cannot load %T as %q", retrieved, name) } - o.R.PoolPhotos = rels + o.R.Images = rels for _, rel := range rels { if rel != nil { - rel.R.Pool = o + rel.R.Pools = PublicreportPoolSlice{o} } } return nil @@ -1214,79 +1218,99 @@ func buildPublicreportPoolPreloader() publicreportPoolPreloader { } type publicreportPoolThenLoader[Q orm.Loadable] struct { - PoolPhotos func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Images func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] } func buildPublicreportPoolThenLoader[Q orm.Loadable]() publicreportPoolThenLoader[Q] { - type PoolPhotosLoadInterface interface { - LoadPoolPhotos(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + type ImagesLoadInterface interface { + LoadImages(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error } return publicreportPoolThenLoader[Q]{ - PoolPhotos: thenLoadBuilder[Q]( - "PoolPhotos", - func(ctx context.Context, exec bob.Executor, retrieved PoolPhotosLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { - return retrieved.LoadPoolPhotos(ctx, exec, mods...) + Images: thenLoadBuilder[Q]( + "Images", + func(ctx context.Context, exec bob.Executor, retrieved ImagesLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadImages(ctx, exec, mods...) }, ), } } -// LoadPoolPhotos loads the publicreportPool's PoolPhotos into the .R struct -func (o *PublicreportPool) LoadPoolPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadImages loads the publicreportPool's Images into the .R struct +func (o *PublicreportPool) LoadImages(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { if o == nil { return nil } // Reset the relationship - o.R.PoolPhotos = nil + o.R.Images = nil - related, err := o.PoolPhotos(mods...).All(ctx, exec) + related, err := o.Images(mods...).All(ctx, exec) if err != nil { return err } for _, rel := range related { - rel.R.Pool = o + rel.R.Pools = PublicreportPoolSlice{o} } - o.R.PoolPhotos = related + o.R.Images = related return nil } -// LoadPoolPhotos loads the publicreportPool's PoolPhotos into the .R struct -func (os PublicreportPoolSlice) LoadPoolPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadImages loads the publicreportPool's Images into the .R struct +func (os PublicreportPoolSlice) LoadImages(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { if len(os) == 0 { return nil } - publicreportPoolPhotos, err := os.PoolPhotos(mods...).All(ctx, exec) + // 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(PublicreportImages.Columns)) + } + + q := os.Images(append( + mods, + sm.Columns(PublicreportPoolImages.Columns.PoolID.As("related_publicreport.pool.ID")), + )...) + + IDSlice := []int32{} + + mapper := scan.Mod(scan.StructMapper[*PublicreportImage](), 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_publicreport.pool.ID", &IDSlice[len(IDSlice)-1]) + + return nil, nil + }, + func(any, any) error { + return nil + } + }) + + publicreportImages, err := bob.Allx[bob.SliceTransformer[*PublicreportImage, PublicreportImageSlice]](ctx, exec, q, mapper) if err != nil { return err } for _, o := range os { - if o == nil { - continue - } - - o.R.PoolPhotos = nil + o.R.Images = nil } for _, o := range os { - if o == nil { - continue - } - - for _, rel := range publicreportPoolPhotos { - - if !(o.ID == rel.PoolID) { + for i, rel := range publicreportImages { + if !(o.ID == IDSlice[i]) { continue } - rel.R.Pool = o + rel.R.Pools = append(rel.R.Pools, o) - o.R.PoolPhotos = append(o.R.PoolPhotos, rel) + o.R.Images = append(o.R.Images, rel) } } @@ -1295,7 +1319,7 @@ func (os PublicreportPoolSlice) LoadPoolPhotos(ctx context.Context, exec bob.Exe // publicreportPoolC is where relationship counts are stored. type publicreportPoolC struct { - PoolPhotos *int64 + Images *int64 } // PreloadCount sets a count in the C struct by name @@ -1305,20 +1329,20 @@ func (o *PublicreportPool) PreloadCount(name string, count int64) error { } switch name { - case "PoolPhotos": - o.C.PoolPhotos = &count + case "Images": + o.C.Images = &count } return nil } type publicreportPoolCountPreloader struct { - PoolPhotos func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader + Images func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader } func buildPublicreportPoolCountPreloader() publicreportPoolCountPreloader { return publicreportPoolCountPreloader{ - PoolPhotos: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader { - return countPreloader[*PublicreportPool]("PoolPhotos", func(parent string) bob.Expression { + Images: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader { + return countPreloader[*PublicreportPool]("Images", func(parent string) bob.Expression { // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk) if parent == "" { parent = PublicreportPools.Alias() @@ -1327,8 +1351,11 @@ func buildPublicreportPoolCountPreloader() publicreportPoolCountPreloader { subqueryMods := []bob.Mod[*dialect.SelectQuery]{ sm.Columns(psql.Raw("count(*)")), - sm.From(PublicreportPoolPhotos.Name()), - sm.Where(psql.Quote(PublicreportPoolPhotos.Alias(), "pool_id").EQ(psql.Quote(parent, "id"))), + sm.From(PublicreportPoolImages.Name()), + sm.Where(psql.Quote(PublicreportPoolImages.Alias(), "pool_id").EQ(psql.Quote(parent, "id"))), + sm.InnerJoin(PublicreportImages.Name()).On( + psql.Quote(PublicreportImages.Alias(), "id").EQ(psql.Quote(PublicreportPoolImages.Alias(), "image_id")), + ), } subqueryMods = append(subqueryMods, mods...) return psql.Group(psql.Select(subqueryMods...).Expression) @@ -1338,47 +1365,47 @@ func buildPublicreportPoolCountPreloader() publicreportPoolCountPreloader { } type publicreportPoolCountThenLoader[Q orm.Loadable] struct { - PoolPhotos func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Images func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] } func buildPublicreportPoolCountThenLoader[Q orm.Loadable]() publicreportPoolCountThenLoader[Q] { - type PoolPhotosCountInterface interface { - LoadCountPoolPhotos(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + type ImagesCountInterface interface { + LoadCountImages(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error } return publicreportPoolCountThenLoader[Q]{ - PoolPhotos: countThenLoadBuilder[Q]( - "PoolPhotos", - func(ctx context.Context, exec bob.Executor, retrieved PoolPhotosCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { - return retrieved.LoadCountPoolPhotos(ctx, exec, mods...) + Images: countThenLoadBuilder[Q]( + "Images", + func(ctx context.Context, exec bob.Executor, retrieved ImagesCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadCountImages(ctx, exec, mods...) }, ), } } -// LoadCountPoolPhotos loads the count of PoolPhotos into the C struct -func (o *PublicreportPool) LoadCountPoolPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadCountImages loads the count of Images into the C struct +func (o *PublicreportPool) LoadCountImages(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { if o == nil { return nil } - count, err := o.PoolPhotos(mods...).Count(ctx, exec) + count, err := o.Images(mods...).Count(ctx, exec) if err != nil { return err } - o.C.PoolPhotos = &count + o.C.Images = &count return nil } -// LoadCountPoolPhotos loads the count of PoolPhotos for a slice -func (os PublicreportPoolSlice) LoadCountPoolPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadCountImages loads the count of Images for a slice +func (os PublicreportPoolSlice) LoadCountImages(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.LoadCountPoolPhotos(ctx, exec, mods...); err != nil { + if err := o.LoadCountImages(ctx, exec, mods...); err != nil { return err } } @@ -1387,8 +1414,8 @@ func (os PublicreportPoolSlice) LoadCountPoolPhotos(ctx context.Context, exec bo } type publicreportPoolJoins[Q dialect.Joinable] struct { - typ string - PoolPhotos modAs[Q, publicreportPoolPhotoColumns] + typ string + Images modAs[Q, publicreportImageColumns] } func (j publicreportPoolJoins[Q]) aliasedAs(alias string) publicreportPoolJoins[Q] { @@ -1398,16 +1425,24 @@ func (j publicreportPoolJoins[Q]) aliasedAs(alias string) publicreportPoolJoins[ func buildPublicreportPoolJoins[Q dialect.Joinable](cols publicreportPoolColumns, typ string) publicreportPoolJoins[Q] { return publicreportPoolJoins[Q]{ typ: typ, - PoolPhotos: modAs[Q, publicreportPoolPhotoColumns]{ - c: PublicreportPoolPhotos.Columns, - f: func(to publicreportPoolPhotoColumns) bob.Mod[Q] { - mods := make(mods.QueryMods[Q], 0, 1) + Images: modAs[Q, publicreportImageColumns]{ + c: PublicreportImages.Columns, + f: func(to publicreportImageColumns) bob.Mod[Q] { + random := strconv.FormatInt(randInt(), 10) + mods := make(mods.QueryMods[Q], 0, 2) { - mods = append(mods, dialect.Join[Q](typ, PublicreportPoolPhotos.Name().As(to.Alias())).On( + to := PublicreportPoolImages.Columns.AliasedAs(PublicreportPoolImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportPoolImages.Name().As(to.Alias())).On( to.PoolID.EQ(cols.ID), )) } + { + cols := PublicreportPoolImages.Columns.AliasedAs(PublicreportPoolImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportImages.Name().As(to.Alias())).On( + to.ID.EQ(cols.ImageID), + )) + } return mods }, diff --git a/db/models/publicreport.pool_image.bob.go b/db/models/publicreport.pool_image.bob.go new file mode 100644 index 00000000..3547232d --- /dev/null +++ b/db/models/publicreport.pool_image.bob.go @@ -0,0 +1,766 @@ +// Code generated by BobGen psql v0.42.1. 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/aarondl/opt/omit" + "github.com/stephenafamo/bob" + "github.com/stephenafamo/bob/dialect/psql" + "github.com/stephenafamo/bob/dialect/psql/dialect" + "github.com/stephenafamo/bob/dialect/psql/dm" + "github.com/stephenafamo/bob/dialect/psql/sm" + "github.com/stephenafamo/bob/dialect/psql/um" + "github.com/stephenafamo/bob/expr" + "github.com/stephenafamo/bob/mods" + "github.com/stephenafamo/bob/orm" + "github.com/stephenafamo/bob/types/pgtypes" +) + +// PublicreportPoolImage is an object representing the database table. +type PublicreportPoolImage struct { + ImageID int32 `db:"image_id,pk" ` + PoolID int32 `db:"pool_id,pk" ` + + R publicreportPoolImageR `db:"-" ` +} + +// PublicreportPoolImageSlice is an alias for a slice of pointers to PublicreportPoolImage. +// This should almost always be used instead of []*PublicreportPoolImage. +type PublicreportPoolImageSlice []*PublicreportPoolImage + +// PublicreportPoolImages contains methods to work with the pool_image table +var PublicreportPoolImages = psql.NewTablex[*PublicreportPoolImage, PublicreportPoolImageSlice, *PublicreportPoolImageSetter]("publicreport", "pool_image", buildPublicreportPoolImageColumns("publicreport.pool_image")) + +// PublicreportPoolImagesQuery is a query on the pool_image table +type PublicreportPoolImagesQuery = *psql.ViewQuery[*PublicreportPoolImage, PublicreportPoolImageSlice] + +// publicreportPoolImageR is where relationships are stored. +type publicreportPoolImageR struct { + Image *PublicreportImage // publicreport.pool_image.pool_image_image_id_fkey + Pool *PublicreportPool // publicreport.pool_image.pool_image_pool_id_fkey +} + +func buildPublicreportPoolImageColumns(alias string) publicreportPoolImageColumns { + return publicreportPoolImageColumns{ + ColumnsExpr: expr.NewColumnsExpr( + "image_id", "pool_id", + ).WithParent("publicreport.pool_image"), + tableAlias: alias, + ImageID: psql.Quote(alias, "image_id"), + PoolID: psql.Quote(alias, "pool_id"), + } +} + +type publicreportPoolImageColumns struct { + expr.ColumnsExpr + tableAlias string + ImageID psql.Expression + PoolID psql.Expression +} + +func (c publicreportPoolImageColumns) Alias() string { + return c.tableAlias +} + +func (publicreportPoolImageColumns) AliasedAs(alias string) publicreportPoolImageColumns { + return buildPublicreportPoolImageColumns(alias) +} + +// PublicreportPoolImageSetter is used for insert/upsert/update operations +// All values are optional, and do not have to be set +// Generated columns are not included +type PublicreportPoolImageSetter struct { + ImageID omit.Val[int32] `db:"image_id,pk" ` + PoolID omit.Val[int32] `db:"pool_id,pk" ` +} + +func (s PublicreportPoolImageSetter) SetColumns() []string { + vals := make([]string, 0, 2) + if s.ImageID.IsValue() { + vals = append(vals, "image_id") + } + if s.PoolID.IsValue() { + vals = append(vals, "pool_id") + } + return vals +} + +func (s PublicreportPoolImageSetter) Overwrite(t *PublicreportPoolImage) { + if s.ImageID.IsValue() { + t.ImageID = s.ImageID.MustGet() + } + if s.PoolID.IsValue() { + t.PoolID = s.PoolID.MustGet() + } +} + +func (s *PublicreportPoolImageSetter) Apply(q *dialect.InsertQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportPoolImages.BeforeInsertHooks.RunHooks(ctx, exec, s) + }) + + 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.ImageID.IsValue() { + vals[0] = psql.Arg(s.ImageID.MustGet()) + } else { + vals[0] = psql.Raw("DEFAULT") + } + + if s.PoolID.IsValue() { + vals[1] = psql.Arg(s.PoolID.MustGet()) + } else { + vals[1] = psql.Raw("DEFAULT") + } + + return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") + })) +} + +func (s PublicreportPoolImageSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return um.Set(s.Expressions()...) +} + +func (s PublicreportPoolImageSetter) Expressions(prefix ...string) []bob.Expression { + exprs := make([]bob.Expression, 0, 2) + + if s.ImageID.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "image_id")...), + psql.Arg(s.ImageID), + }}) + } + + if s.PoolID.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "pool_id")...), + psql.Arg(s.PoolID), + }}) + } + + return exprs +} + +// FindPublicreportPoolImage retrieves a single record by primary key +// If cols is empty Find will return all columns. +func FindPublicreportPoolImage(ctx context.Context, exec bob.Executor, ImageIDPK int32, PoolIDPK int32, cols ...string) (*PublicreportPoolImage, error) { + if len(cols) == 0 { + return PublicreportPoolImages.Query( + sm.Where(PublicreportPoolImages.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportPoolImages.Columns.PoolID.EQ(psql.Arg(PoolIDPK))), + ).One(ctx, exec) + } + + return PublicreportPoolImages.Query( + sm.Where(PublicreportPoolImages.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportPoolImages.Columns.PoolID.EQ(psql.Arg(PoolIDPK))), + sm.Columns(PublicreportPoolImages.Columns.Only(cols...)), + ).One(ctx, exec) +} + +// PublicreportPoolImageExists checks the presence of a single record by primary key +func PublicreportPoolImageExists(ctx context.Context, exec bob.Executor, ImageIDPK int32, PoolIDPK int32) (bool, error) { + return PublicreportPoolImages.Query( + sm.Where(PublicreportPoolImages.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportPoolImages.Columns.PoolID.EQ(psql.Arg(PoolIDPK))), + ).Exists(ctx, exec) +} + +// AfterQueryHook is called after PublicreportPoolImage is retrieved from the database +func (o *PublicreportPoolImage) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportPoolImages.AfterSelectHooks.RunHooks(ctx, exec, PublicreportPoolImageSlice{o}) + case bob.QueryTypeInsert: + ctx, err = PublicreportPoolImages.AfterInsertHooks.RunHooks(ctx, exec, PublicreportPoolImageSlice{o}) + case bob.QueryTypeUpdate: + ctx, err = PublicreportPoolImages.AfterUpdateHooks.RunHooks(ctx, exec, PublicreportPoolImageSlice{o}) + case bob.QueryTypeDelete: + ctx, err = PublicreportPoolImages.AfterDeleteHooks.RunHooks(ctx, exec, PublicreportPoolImageSlice{o}) + } + + return err +} + +// primaryKeyVals returns the primary key values of the PublicreportPoolImage +func (o *PublicreportPoolImage) primaryKeyVals() bob.Expression { + return psql.ArgGroup( + o.ImageID, + o.PoolID, + ) +} + +func (o *PublicreportPoolImage) pkEQ() dialect.Expression { + return psql.Group(psql.Quote("publicreport.pool_image", "image_id"), psql.Quote("publicreport.pool_image", "pool_id")).EQ(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + return o.primaryKeyVals().WriteSQL(ctx, w, d, start) + })) +} + +// Update uses an executor to update the PublicreportPoolImage +func (o *PublicreportPoolImage) Update(ctx context.Context, exec bob.Executor, s *PublicreportPoolImageSetter) error { + v, err := PublicreportPoolImages.Update(s.UpdateMod(), um.Where(o.pkEQ())).One(ctx, exec) + if err != nil { + return err + } + + o.R = v.R + *o = *v + + return nil +} + +// Delete deletes a single PublicreportPoolImage record with an executor +func (o *PublicreportPoolImage) Delete(ctx context.Context, exec bob.Executor) error { + _, err := PublicreportPoolImages.Delete(dm.Where(o.pkEQ())).Exec(ctx, exec) + return err +} + +// Reload refreshes the PublicreportPoolImage using the executor +func (o *PublicreportPoolImage) Reload(ctx context.Context, exec bob.Executor) error { + o2, err := PublicreportPoolImages.Query( + sm.Where(PublicreportPoolImages.Columns.ImageID.EQ(psql.Arg(o.ImageID))), + sm.Where(PublicreportPoolImages.Columns.PoolID.EQ(psql.Arg(o.PoolID))), + ).One(ctx, exec) + if err != nil { + return err + } + o2.R = o.R + *o = *o2 + + return nil +} + +// AfterQueryHook is called after PublicreportPoolImageSlice is retrieved from the database +func (o PublicreportPoolImageSlice) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportPoolImages.AfterSelectHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeInsert: + ctx, err = PublicreportPoolImages.AfterInsertHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeUpdate: + ctx, err = PublicreportPoolImages.AfterUpdateHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeDelete: + ctx, err = PublicreportPoolImages.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err +} + +func (o PublicreportPoolImageSlice) pkIN() dialect.Expression { + if len(o) == 0 { + return psql.Raw("NULL") + } + + return psql.Group(psql.Quote("publicreport.pool_image", "image_id"), psql.Quote("publicreport.pool_image", "pool_id")).In(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + pkPairs := make([]bob.Expression, len(o)) + for i, row := range o { + pkPairs[i] = row.primaryKeyVals() + } + return bob.ExpressSlice(ctx, w, d, start, pkPairs, "", ", ", "") + })) +} + +// copyMatchingRows finds models in the given slice that have the same primary key +// then it first copies the existing relationships from the old model to the new model +// and then replaces the old model in the slice with the new model +func (o PublicreportPoolImageSlice) copyMatchingRows(from ...*PublicreportPoolImage) { + for i, old := range o { + for _, new := range from { + if new.ImageID != old.ImageID { + continue + } + if new.PoolID != old.PoolID { + continue + } + new.R = old.R + o[i] = new + break + } + } +} + +// UpdateMod modifies an update query with "WHERE primary_key IN (o...)" +func (o PublicreportPoolImageSlice) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return bob.ModFunc[*dialect.UpdateQuery](func(q *dialect.UpdateQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportPoolImages.BeforeUpdateHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportPoolImage: + o.copyMatchingRows(retrieved) + case []*PublicreportPoolImage: + o.copyMatchingRows(retrieved...) + case PublicreportPoolImageSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportPoolImage or a slice of PublicreportPoolImage + // then run the AfterUpdateHooks on the slice + _, err = PublicreportPoolImages.AfterUpdateHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +// DeleteMod modifies an delete query with "WHERE primary_key IN (o...)" +func (o PublicreportPoolImageSlice) DeleteMod() bob.Mod[*dialect.DeleteQuery] { + return bob.ModFunc[*dialect.DeleteQuery](func(q *dialect.DeleteQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportPoolImages.BeforeDeleteHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportPoolImage: + o.copyMatchingRows(retrieved) + case []*PublicreportPoolImage: + o.copyMatchingRows(retrieved...) + case PublicreportPoolImageSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportPoolImage or a slice of PublicreportPoolImage + // then run the AfterDeleteHooks on the slice + _, err = PublicreportPoolImages.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +func (o PublicreportPoolImageSlice) UpdateAll(ctx context.Context, exec bob.Executor, vals PublicreportPoolImageSetter) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportPoolImages.Update(vals.UpdateMod(), o.UpdateMod()).All(ctx, exec) + return err +} + +func (o PublicreportPoolImageSlice) DeleteAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportPoolImages.Delete(o.DeleteMod()).Exec(ctx, exec) + return err +} + +func (o PublicreportPoolImageSlice) ReloadAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + o2, err := PublicreportPoolImages.Query(sm.Where(o.pkIN())).All(ctx, exec) + if err != nil { + return err + } + + o.copyMatchingRows(o2...) + + return nil +} + +// Image starts a query for related objects on publicreport.image +func (o *PublicreportPoolImage) Image(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + return PublicreportImages.Query(append(mods, + sm.Where(PublicreportImages.Columns.ID.EQ(psql.Arg(o.ImageID))), + )...) +} + +func (os PublicreportPoolImageSlice) Image(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + pkImageID := make(pgtypes.Array[int32], 0, len(os)) + for _, o := range os { + if o == nil { + continue + } + pkImageID = append(pkImageID, o.ImageID) + } + PKArgExpr := psql.Select(sm.Columns( + psql.F("unnest", psql.Cast(psql.Arg(pkImageID), "integer[]")), + )) + + return PublicreportImages.Query(append(mods, + sm.Where(psql.Group(PublicreportImages.Columns.ID).OP("IN", PKArgExpr)), + )...) +} + +// Pool starts a query for related objects on publicreport.pool +func (o *PublicreportPoolImage) Pool(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolsQuery { + return PublicreportPools.Query(append(mods, + sm.Where(PublicreportPools.Columns.ID.EQ(psql.Arg(o.PoolID))), + )...) +} + +func (os PublicreportPoolImageSlice) Pool(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolsQuery { + pkPoolID := make(pgtypes.Array[int32], 0, len(os)) + for _, o := range os { + if o == nil { + continue + } + pkPoolID = append(pkPoolID, o.PoolID) + } + PKArgExpr := psql.Select(sm.Columns( + psql.F("unnest", psql.Cast(psql.Arg(pkPoolID), "integer[]")), + )) + + return PublicreportPools.Query(append(mods, + sm.Where(psql.Group(PublicreportPools.Columns.ID).OP("IN", PKArgExpr)), + )...) +} + +func attachPublicreportPoolImageImage0(ctx context.Context, exec bob.Executor, count int, publicreportPoolImage0 *PublicreportPoolImage, publicreportImage1 *PublicreportImage) (*PublicreportPoolImage, error) { + setter := &PublicreportPoolImageSetter{ + ImageID: omit.From(publicreportImage1.ID), + } + + err := publicreportPoolImage0.Update(ctx, exec, setter) + if err != nil { + return nil, fmt.Errorf("attachPublicreportPoolImageImage0: %w", err) + } + + return publicreportPoolImage0, nil +} + +func (publicreportPoolImage0 *PublicreportPoolImage) InsertImage(ctx context.Context, exec bob.Executor, related *PublicreportImageSetter) error { + var err error + + publicreportImage1, err := PublicreportImages.Insert(related).One(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + + _, err = attachPublicreportPoolImageImage0(ctx, exec, 1, publicreportPoolImage0, publicreportImage1) + if err != nil { + return err + } + + publicreportPoolImage0.R.Image = publicreportImage1 + + return nil +} + +func (publicreportPoolImage0 *PublicreportPoolImage) AttachImage(ctx context.Context, exec bob.Executor, publicreportImage1 *PublicreportImage) error { + var err error + + _, err = attachPublicreportPoolImageImage0(ctx, exec, 1, publicreportPoolImage0, publicreportImage1) + if err != nil { + return err + } + + publicreportPoolImage0.R.Image = publicreportImage1 + + return nil +} + +func attachPublicreportPoolImagePool0(ctx context.Context, exec bob.Executor, count int, publicreportPoolImage0 *PublicreportPoolImage, publicreportPool1 *PublicreportPool) (*PublicreportPoolImage, error) { + setter := &PublicreportPoolImageSetter{ + PoolID: omit.From(publicreportPool1.ID), + } + + err := publicreportPoolImage0.Update(ctx, exec, setter) + if err != nil { + return nil, fmt.Errorf("attachPublicreportPoolImagePool0: %w", err) + } + + return publicreportPoolImage0, nil +} + +func (publicreportPoolImage0 *PublicreportPoolImage) InsertPool(ctx context.Context, exec bob.Executor, related *PublicreportPoolSetter) error { + var err error + + publicreportPool1, err := PublicreportPools.Insert(related).One(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + + _, err = attachPublicreportPoolImagePool0(ctx, exec, 1, publicreportPoolImage0, publicreportPool1) + if err != nil { + return err + } + + publicreportPoolImage0.R.Pool = publicreportPool1 + + return nil +} + +func (publicreportPoolImage0 *PublicreportPoolImage) AttachPool(ctx context.Context, exec bob.Executor, publicreportPool1 *PublicreportPool) error { + var err error + + _, err = attachPublicreportPoolImagePool0(ctx, exec, 1, publicreportPoolImage0, publicreportPool1) + if err != nil { + return err + } + + publicreportPoolImage0.R.Pool = publicreportPool1 + + return nil +} + +type publicreportPoolImageWhere[Q psql.Filterable] struct { + ImageID psql.WhereMod[Q, int32] + PoolID psql.WhereMod[Q, int32] +} + +func (publicreportPoolImageWhere[Q]) AliasedAs(alias string) publicreportPoolImageWhere[Q] { + return buildPublicreportPoolImageWhere[Q](buildPublicreportPoolImageColumns(alias)) +} + +func buildPublicreportPoolImageWhere[Q psql.Filterable](cols publicreportPoolImageColumns) publicreportPoolImageWhere[Q] { + return publicreportPoolImageWhere[Q]{ + ImageID: psql.Where[Q, int32](cols.ImageID), + PoolID: psql.Where[Q, int32](cols.PoolID), + } +} + +func (o *PublicreportPoolImage) Preload(name string, retrieved any) error { + if o == nil { + return nil + } + + switch name { + case "Image": + rel, ok := retrieved.(*PublicreportImage) + if !ok { + return fmt.Errorf("publicreportPoolImage cannot load %T as %q", retrieved, name) + } + + o.R.Image = rel + + return nil + case "Pool": + rel, ok := retrieved.(*PublicreportPool) + if !ok { + return fmt.Errorf("publicreportPoolImage cannot load %T as %q", retrieved, name) + } + + o.R.Pool = rel + + return nil + default: + return fmt.Errorf("publicreportPoolImage has no relationship %q", name) + } +} + +type publicreportPoolImagePreloader struct { + Image func(...psql.PreloadOption) psql.Preloader + Pool func(...psql.PreloadOption) psql.Preloader +} + +func buildPublicreportPoolImagePreloader() publicreportPoolImagePreloader { + return publicreportPoolImagePreloader{ + Image: func(opts ...psql.PreloadOption) psql.Preloader { + return psql.Preload[*PublicreportImage, PublicreportImageSlice](psql.PreloadRel{ + Name: "Image", + Sides: []psql.PreloadSide{ + { + From: PublicreportPoolImages, + To: PublicreportImages, + FromColumns: []string{"image_id"}, + ToColumns: []string{"id"}, + }, + }, + }, PublicreportImages.Columns.Names(), opts...) + }, + Pool: func(opts ...psql.PreloadOption) psql.Preloader { + return psql.Preload[*PublicreportPool, PublicreportPoolSlice](psql.PreloadRel{ + Name: "Pool", + Sides: []psql.PreloadSide{ + { + From: PublicreportPoolImages, + To: PublicreportPools, + FromColumns: []string{"pool_id"}, + ToColumns: []string{"id"}, + }, + }, + }, PublicreportPools.Columns.Names(), opts...) + }, + } +} + +type publicreportPoolImageThenLoader[Q orm.Loadable] struct { + Image func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Pool func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] +} + +func buildPublicreportPoolImageThenLoader[Q orm.Loadable]() publicreportPoolImageThenLoader[Q] { + type ImageLoadInterface interface { + LoadImage(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + type PoolLoadInterface interface { + LoadPool(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + + return publicreportPoolImageThenLoader[Q]{ + Image: thenLoadBuilder[Q]( + "Image", + func(ctx context.Context, exec bob.Executor, retrieved ImageLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadImage(ctx, exec, mods...) + }, + ), + Pool: thenLoadBuilder[Q]( + "Pool", + func(ctx context.Context, exec bob.Executor, retrieved PoolLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadPool(ctx, exec, mods...) + }, + ), + } +} + +// LoadImage loads the publicreportPoolImage's Image into the .R struct +func (o *PublicreportPoolImage) LoadImage(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.Image = nil + + related, err := o.Image(mods...).One(ctx, exec) + if err != nil { + return err + } + + o.R.Image = related + return nil +} + +// LoadImage loads the publicreportPoolImage's Image into the .R struct +func (os PublicreportPoolImageSlice) LoadImage(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if len(os) == 0 { + return nil + } + + publicreportImages, err := os.Image(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, o := range os { + if o == nil { + continue + } + + for _, rel := range publicreportImages { + + if !(o.ImageID == rel.ID) { + continue + } + + o.R.Image = rel + break + } + } + + return nil +} + +// LoadPool loads the publicreportPoolImage's Pool into the .R struct +func (o *PublicreportPoolImage) LoadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.Pool = nil + + related, err := o.Pool(mods...).One(ctx, exec) + if err != nil { + return err + } + + o.R.Pool = related + return nil +} + +// LoadPool loads the publicreportPoolImage's Pool into the .R struct +func (os PublicreportPoolImageSlice) LoadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if len(os) == 0 { + return nil + } + + publicreportPools, err := os.Pool(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, o := range os { + if o == nil { + continue + } + + for _, rel := range publicreportPools { + + if !(o.PoolID == rel.ID) { + continue + } + + o.R.Pool = rel + break + } + } + + return nil +} + +type publicreportPoolImageJoins[Q dialect.Joinable] struct { + typ string + Image modAs[Q, publicreportImageColumns] + Pool modAs[Q, publicreportPoolColumns] +} + +func (j publicreportPoolImageJoins[Q]) aliasedAs(alias string) publicreportPoolImageJoins[Q] { + return buildPublicreportPoolImageJoins[Q](buildPublicreportPoolImageColumns(alias), j.typ) +} + +func buildPublicreportPoolImageJoins[Q dialect.Joinable](cols publicreportPoolImageColumns, typ string) publicreportPoolImageJoins[Q] { + return publicreportPoolImageJoins[Q]{ + typ: typ, + Image: modAs[Q, publicreportImageColumns]{ + c: PublicreportImages.Columns, + f: func(to publicreportImageColumns) bob.Mod[Q] { + mods := make(mods.QueryMods[Q], 0, 1) + + { + mods = append(mods, dialect.Join[Q](typ, PublicreportImages.Name().As(to.Alias())).On( + to.ID.EQ(cols.ImageID), + )) + } + + return mods + }, + }, + Pool: modAs[Q, publicreportPoolColumns]{ + c: PublicreportPools.Columns, + f: func(to publicreportPoolColumns) bob.Mod[Q] { + mods := make(mods.QueryMods[Q], 0, 1) + + { + mods = append(mods, dialect.Join[Q](typ, PublicreportPools.Name().As(to.Alias())).On( + to.ID.EQ(cols.PoolID), + )) + } + + return mods + }, + }, + } +} diff --git a/db/models/publicreport.pool_photo.bob.go b/db/models/publicreport.pool_photo.bob.go deleted file mode 100644 index 1240a0e3..00000000 --- a/db/models/publicreport.pool_photo.bob.go +++ /dev/null @@ -1,678 +0,0 @@ -// Code generated by BobGen psql v0.42.1. 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/aarondl/opt/omit" - "github.com/google/uuid" - "github.com/stephenafamo/bob" - "github.com/stephenafamo/bob/dialect/psql" - "github.com/stephenafamo/bob/dialect/psql/dialect" - "github.com/stephenafamo/bob/dialect/psql/dm" - "github.com/stephenafamo/bob/dialect/psql/sm" - "github.com/stephenafamo/bob/dialect/psql/um" - "github.com/stephenafamo/bob/expr" - "github.com/stephenafamo/bob/mods" - "github.com/stephenafamo/bob/orm" - "github.com/stephenafamo/bob/types/pgtypes" -) - -// PublicreportPoolPhoto is an object representing the database table. -type PublicreportPoolPhoto struct { - ID int32 `db:"id,pk" ` - Size int64 `db:"size" ` - Filename string `db:"filename" ` - PoolID int32 `db:"pool_id" ` - UUID uuid.UUID `db:"uuid" ` - - R publicreportPoolPhotoR `db:"-" ` -} - -// PublicreportPoolPhotoSlice is an alias for a slice of pointers to PublicreportPoolPhoto. -// This should almost always be used instead of []*PublicreportPoolPhoto. -type PublicreportPoolPhotoSlice []*PublicreportPoolPhoto - -// PublicreportPoolPhotos contains methods to work with the pool_photo table -var PublicreportPoolPhotos = psql.NewTablex[*PublicreportPoolPhoto, PublicreportPoolPhotoSlice, *PublicreportPoolPhotoSetter]("publicreport", "pool_photo", buildPublicreportPoolPhotoColumns("publicreport.pool_photo")) - -// PublicreportPoolPhotosQuery is a query on the pool_photo table -type PublicreportPoolPhotosQuery = *psql.ViewQuery[*PublicreportPoolPhoto, PublicreportPoolPhotoSlice] - -// publicreportPoolPhotoR is where relationships are stored. -type publicreportPoolPhotoR struct { - Pool *PublicreportPool // publicreport.pool_photo.pool_photo_pool_id_fkey -} - -func buildPublicreportPoolPhotoColumns(alias string) publicreportPoolPhotoColumns { - return publicreportPoolPhotoColumns{ - ColumnsExpr: expr.NewColumnsExpr( - "id", "size", "filename", "pool_id", "uuid", - ).WithParent("publicreport.pool_photo"), - tableAlias: alias, - ID: psql.Quote(alias, "id"), - Size: psql.Quote(alias, "size"), - Filename: psql.Quote(alias, "filename"), - PoolID: psql.Quote(alias, "pool_id"), - UUID: psql.Quote(alias, "uuid"), - } -} - -type publicreportPoolPhotoColumns struct { - expr.ColumnsExpr - tableAlias string - ID psql.Expression - Size psql.Expression - Filename psql.Expression - PoolID psql.Expression - UUID psql.Expression -} - -func (c publicreportPoolPhotoColumns) Alias() string { - return c.tableAlias -} - -func (publicreportPoolPhotoColumns) AliasedAs(alias string) publicreportPoolPhotoColumns { - return buildPublicreportPoolPhotoColumns(alias) -} - -// PublicreportPoolPhotoSetter is used for insert/upsert/update operations -// All values are optional, and do not have to be set -// Generated columns are not included -type PublicreportPoolPhotoSetter struct { - ID omit.Val[int32] `db:"id,pk" ` - Size omit.Val[int64] `db:"size" ` - Filename omit.Val[string] `db:"filename" ` - PoolID omit.Val[int32] `db:"pool_id" ` - UUID omit.Val[uuid.UUID] `db:"uuid" ` -} - -func (s PublicreportPoolPhotoSetter) SetColumns() []string { - vals := make([]string, 0, 5) - if s.ID.IsValue() { - vals = append(vals, "id") - } - if s.Size.IsValue() { - vals = append(vals, "size") - } - if s.Filename.IsValue() { - vals = append(vals, "filename") - } - if s.PoolID.IsValue() { - vals = append(vals, "pool_id") - } - if s.UUID.IsValue() { - vals = append(vals, "uuid") - } - return vals -} - -func (s PublicreportPoolPhotoSetter) Overwrite(t *PublicreportPoolPhoto) { - if s.ID.IsValue() { - t.ID = s.ID.MustGet() - } - if s.Size.IsValue() { - t.Size = s.Size.MustGet() - } - if s.Filename.IsValue() { - t.Filename = s.Filename.MustGet() - } - if s.PoolID.IsValue() { - t.PoolID = s.PoolID.MustGet() - } - if s.UUID.IsValue() { - t.UUID = s.UUID.MustGet() - } -} - -func (s *PublicreportPoolPhotoSetter) Apply(q *dialect.InsertQuery) { - q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { - return PublicreportPoolPhotos.BeforeInsertHooks.RunHooks(ctx, exec, s) - }) - - q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { - vals := make([]bob.Expression, 5) - if s.ID.IsValue() { - vals[0] = psql.Arg(s.ID.MustGet()) - } else { - vals[0] = psql.Raw("DEFAULT") - } - - if s.Size.IsValue() { - vals[1] = psql.Arg(s.Size.MustGet()) - } else { - vals[1] = psql.Raw("DEFAULT") - } - - if s.Filename.IsValue() { - vals[2] = psql.Arg(s.Filename.MustGet()) - } else { - vals[2] = psql.Raw("DEFAULT") - } - - if s.PoolID.IsValue() { - vals[3] = psql.Arg(s.PoolID.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, "", ", ", "") - })) -} - -func (s PublicreportPoolPhotoSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] { - return um.Set(s.Expressions()...) -} - -func (s PublicreportPoolPhotoSetter) Expressions(prefix ...string) []bob.Expression { - exprs := make([]bob.Expression, 0, 5) - - if s.ID.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "id")...), - psql.Arg(s.ID), - }}) - } - - if s.Size.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "size")...), - psql.Arg(s.Size), - }}) - } - - if s.Filename.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "filename")...), - psql.Arg(s.Filename), - }}) - } - - if s.PoolID.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "pool_id")...), - psql.Arg(s.PoolID), - }}) - } - - if s.UUID.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "uuid")...), - psql.Arg(s.UUID), - }}) - } - - return exprs -} - -// FindPublicreportPoolPhoto retrieves a single record by primary key -// If cols is empty Find will return all columns. -func FindPublicreportPoolPhoto(ctx context.Context, exec bob.Executor, IDPK int32, cols ...string) (*PublicreportPoolPhoto, error) { - if len(cols) == 0 { - return PublicreportPoolPhotos.Query( - sm.Where(PublicreportPoolPhotos.Columns.ID.EQ(psql.Arg(IDPK))), - ).One(ctx, exec) - } - - return PublicreportPoolPhotos.Query( - sm.Where(PublicreportPoolPhotos.Columns.ID.EQ(psql.Arg(IDPK))), - sm.Columns(PublicreportPoolPhotos.Columns.Only(cols...)), - ).One(ctx, exec) -} - -// PublicreportPoolPhotoExists checks the presence of a single record by primary key -func PublicreportPoolPhotoExists(ctx context.Context, exec bob.Executor, IDPK int32) (bool, error) { - return PublicreportPoolPhotos.Query( - sm.Where(PublicreportPoolPhotos.Columns.ID.EQ(psql.Arg(IDPK))), - ).Exists(ctx, exec) -} - -// AfterQueryHook is called after PublicreportPoolPhoto is retrieved from the database -func (o *PublicreportPoolPhoto) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { - var err error - - switch queryType { - case bob.QueryTypeSelect: - ctx, err = PublicreportPoolPhotos.AfterSelectHooks.RunHooks(ctx, exec, PublicreportPoolPhotoSlice{o}) - case bob.QueryTypeInsert: - ctx, err = PublicreportPoolPhotos.AfterInsertHooks.RunHooks(ctx, exec, PublicreportPoolPhotoSlice{o}) - case bob.QueryTypeUpdate: - ctx, err = PublicreportPoolPhotos.AfterUpdateHooks.RunHooks(ctx, exec, PublicreportPoolPhotoSlice{o}) - case bob.QueryTypeDelete: - ctx, err = PublicreportPoolPhotos.AfterDeleteHooks.RunHooks(ctx, exec, PublicreportPoolPhotoSlice{o}) - } - - return err -} - -// primaryKeyVals returns the primary key values of the PublicreportPoolPhoto -func (o *PublicreportPoolPhoto) primaryKeyVals() bob.Expression { - return psql.Arg(o.ID) -} - -func (o *PublicreportPoolPhoto) pkEQ() dialect.Expression { - return psql.Quote("publicreport.pool_photo", "id").EQ(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { - return o.primaryKeyVals().WriteSQL(ctx, w, d, start) - })) -} - -// Update uses an executor to update the PublicreportPoolPhoto -func (o *PublicreportPoolPhoto) Update(ctx context.Context, exec bob.Executor, s *PublicreportPoolPhotoSetter) error { - v, err := PublicreportPoolPhotos.Update(s.UpdateMod(), um.Where(o.pkEQ())).One(ctx, exec) - if err != nil { - return err - } - - o.R = v.R - *o = *v - - return nil -} - -// Delete deletes a single PublicreportPoolPhoto record with an executor -func (o *PublicreportPoolPhoto) Delete(ctx context.Context, exec bob.Executor) error { - _, err := PublicreportPoolPhotos.Delete(dm.Where(o.pkEQ())).Exec(ctx, exec) - return err -} - -// Reload refreshes the PublicreportPoolPhoto using the executor -func (o *PublicreportPoolPhoto) Reload(ctx context.Context, exec bob.Executor) error { - o2, err := PublicreportPoolPhotos.Query( - sm.Where(PublicreportPoolPhotos.Columns.ID.EQ(psql.Arg(o.ID))), - ).One(ctx, exec) - if err != nil { - return err - } - o2.R = o.R - *o = *o2 - - return nil -} - -// AfterQueryHook is called after PublicreportPoolPhotoSlice is retrieved from the database -func (o PublicreportPoolPhotoSlice) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { - var err error - - switch queryType { - case bob.QueryTypeSelect: - ctx, err = PublicreportPoolPhotos.AfterSelectHooks.RunHooks(ctx, exec, o) - case bob.QueryTypeInsert: - ctx, err = PublicreportPoolPhotos.AfterInsertHooks.RunHooks(ctx, exec, o) - case bob.QueryTypeUpdate: - ctx, err = PublicreportPoolPhotos.AfterUpdateHooks.RunHooks(ctx, exec, o) - case bob.QueryTypeDelete: - ctx, err = PublicreportPoolPhotos.AfterDeleteHooks.RunHooks(ctx, exec, o) - } - - return err -} - -func (o PublicreportPoolPhotoSlice) pkIN() dialect.Expression { - if len(o) == 0 { - return psql.Raw("NULL") - } - - return psql.Quote("publicreport.pool_photo", "id").In(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { - pkPairs := make([]bob.Expression, len(o)) - for i, row := range o { - pkPairs[i] = row.primaryKeyVals() - } - return bob.ExpressSlice(ctx, w, d, start, pkPairs, "", ", ", "") - })) -} - -// copyMatchingRows finds models in the given slice that have the same primary key -// then it first copies the existing relationships from the old model to the new model -// and then replaces the old model in the slice with the new model -func (o PublicreportPoolPhotoSlice) copyMatchingRows(from ...*PublicreportPoolPhoto) { - for i, old := range o { - for _, new := range from { - if new.ID != old.ID { - continue - } - new.R = old.R - o[i] = new - break - } - } -} - -// UpdateMod modifies an update query with "WHERE primary_key IN (o...)" -func (o PublicreportPoolPhotoSlice) UpdateMod() bob.Mod[*dialect.UpdateQuery] { - return bob.ModFunc[*dialect.UpdateQuery](func(q *dialect.UpdateQuery) { - q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { - return PublicreportPoolPhotos.BeforeUpdateHooks.RunHooks(ctx, exec, o) - }) - - q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { - var err error - switch retrieved := retrieved.(type) { - case *PublicreportPoolPhoto: - o.copyMatchingRows(retrieved) - case []*PublicreportPoolPhoto: - o.copyMatchingRows(retrieved...) - case PublicreportPoolPhotoSlice: - o.copyMatchingRows(retrieved...) - default: - // If the retrieved value is not a PublicreportPoolPhoto or a slice of PublicreportPoolPhoto - // then run the AfterUpdateHooks on the slice - _, err = PublicreportPoolPhotos.AfterUpdateHooks.RunHooks(ctx, exec, o) - } - - return err - })) - - q.AppendWhere(o.pkIN()) - }) -} - -// DeleteMod modifies an delete query with "WHERE primary_key IN (o...)" -func (o PublicreportPoolPhotoSlice) DeleteMod() bob.Mod[*dialect.DeleteQuery] { - return bob.ModFunc[*dialect.DeleteQuery](func(q *dialect.DeleteQuery) { - q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { - return PublicreportPoolPhotos.BeforeDeleteHooks.RunHooks(ctx, exec, o) - }) - - q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { - var err error - switch retrieved := retrieved.(type) { - case *PublicreportPoolPhoto: - o.copyMatchingRows(retrieved) - case []*PublicreportPoolPhoto: - o.copyMatchingRows(retrieved...) - case PublicreportPoolPhotoSlice: - o.copyMatchingRows(retrieved...) - default: - // If the retrieved value is not a PublicreportPoolPhoto or a slice of PublicreportPoolPhoto - // then run the AfterDeleteHooks on the slice - _, err = PublicreportPoolPhotos.AfterDeleteHooks.RunHooks(ctx, exec, o) - } - - return err - })) - - q.AppendWhere(o.pkIN()) - }) -} - -func (o PublicreportPoolPhotoSlice) UpdateAll(ctx context.Context, exec bob.Executor, vals PublicreportPoolPhotoSetter) error { - if len(o) == 0 { - return nil - } - - _, err := PublicreportPoolPhotos.Update(vals.UpdateMod(), o.UpdateMod()).All(ctx, exec) - return err -} - -func (o PublicreportPoolPhotoSlice) DeleteAll(ctx context.Context, exec bob.Executor) error { - if len(o) == 0 { - return nil - } - - _, err := PublicreportPoolPhotos.Delete(o.DeleteMod()).Exec(ctx, exec) - return err -} - -func (o PublicreportPoolPhotoSlice) ReloadAll(ctx context.Context, exec bob.Executor) error { - if len(o) == 0 { - return nil - } - - o2, err := PublicreportPoolPhotos.Query(sm.Where(o.pkIN())).All(ctx, exec) - if err != nil { - return err - } - - o.copyMatchingRows(o2...) - - return nil -} - -// Pool starts a query for related objects on publicreport.pool -func (o *PublicreportPoolPhoto) Pool(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolsQuery { - return PublicreportPools.Query(append(mods, - sm.Where(PublicreportPools.Columns.ID.EQ(psql.Arg(o.PoolID))), - )...) -} - -func (os PublicreportPoolPhotoSlice) Pool(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportPoolsQuery { - pkPoolID := make(pgtypes.Array[int32], 0, len(os)) - for _, o := range os { - if o == nil { - continue - } - pkPoolID = append(pkPoolID, o.PoolID) - } - PKArgExpr := psql.Select(sm.Columns( - psql.F("unnest", psql.Cast(psql.Arg(pkPoolID), "integer[]")), - )) - - return PublicreportPools.Query(append(mods, - sm.Where(psql.Group(PublicreportPools.Columns.ID).OP("IN", PKArgExpr)), - )...) -} - -func attachPublicreportPoolPhotoPool0(ctx context.Context, exec bob.Executor, count int, publicreportPoolPhoto0 *PublicreportPoolPhoto, publicreportPool1 *PublicreportPool) (*PublicreportPoolPhoto, error) { - setter := &PublicreportPoolPhotoSetter{ - PoolID: omit.From(publicreportPool1.ID), - } - - err := publicreportPoolPhoto0.Update(ctx, exec, setter) - if err != nil { - return nil, fmt.Errorf("attachPublicreportPoolPhotoPool0: %w", err) - } - - return publicreportPoolPhoto0, nil -} - -func (publicreportPoolPhoto0 *PublicreportPoolPhoto) InsertPool(ctx context.Context, exec bob.Executor, related *PublicreportPoolSetter) error { - var err error - - publicreportPool1, err := PublicreportPools.Insert(related).One(ctx, exec) - if err != nil { - return fmt.Errorf("inserting related objects: %w", err) - } - - _, err = attachPublicreportPoolPhotoPool0(ctx, exec, 1, publicreportPoolPhoto0, publicreportPool1) - if err != nil { - return err - } - - publicreportPoolPhoto0.R.Pool = publicreportPool1 - - publicreportPool1.R.PoolPhotos = append(publicreportPool1.R.PoolPhotos, publicreportPoolPhoto0) - - return nil -} - -func (publicreportPoolPhoto0 *PublicreportPoolPhoto) AttachPool(ctx context.Context, exec bob.Executor, publicreportPool1 *PublicreportPool) error { - var err error - - _, err = attachPublicreportPoolPhotoPool0(ctx, exec, 1, publicreportPoolPhoto0, publicreportPool1) - if err != nil { - return err - } - - publicreportPoolPhoto0.R.Pool = publicreportPool1 - - publicreportPool1.R.PoolPhotos = append(publicreportPool1.R.PoolPhotos, publicreportPoolPhoto0) - - return nil -} - -type publicreportPoolPhotoWhere[Q psql.Filterable] struct { - ID psql.WhereMod[Q, int32] - Size psql.WhereMod[Q, int64] - Filename psql.WhereMod[Q, string] - PoolID psql.WhereMod[Q, int32] - UUID psql.WhereMod[Q, uuid.UUID] -} - -func (publicreportPoolPhotoWhere[Q]) AliasedAs(alias string) publicreportPoolPhotoWhere[Q] { - return buildPublicreportPoolPhotoWhere[Q](buildPublicreportPoolPhotoColumns(alias)) -} - -func buildPublicreportPoolPhotoWhere[Q psql.Filterable](cols publicreportPoolPhotoColumns) publicreportPoolPhotoWhere[Q] { - return publicreportPoolPhotoWhere[Q]{ - ID: psql.Where[Q, int32](cols.ID), - Size: psql.Where[Q, int64](cols.Size), - Filename: psql.Where[Q, string](cols.Filename), - PoolID: psql.Where[Q, int32](cols.PoolID), - UUID: psql.Where[Q, uuid.UUID](cols.UUID), - } -} - -func (o *PublicreportPoolPhoto) Preload(name string, retrieved any) error { - if o == nil { - return nil - } - - switch name { - case "Pool": - rel, ok := retrieved.(*PublicreportPool) - if !ok { - return fmt.Errorf("publicreportPoolPhoto cannot load %T as %q", retrieved, name) - } - - o.R.Pool = rel - - if rel != nil { - rel.R.PoolPhotos = PublicreportPoolPhotoSlice{o} - } - return nil - default: - return fmt.Errorf("publicreportPoolPhoto has no relationship %q", name) - } -} - -type publicreportPoolPhotoPreloader struct { - Pool func(...psql.PreloadOption) psql.Preloader -} - -func buildPublicreportPoolPhotoPreloader() publicreportPoolPhotoPreloader { - return publicreportPoolPhotoPreloader{ - Pool: func(opts ...psql.PreloadOption) psql.Preloader { - return psql.Preload[*PublicreportPool, PublicreportPoolSlice](psql.PreloadRel{ - Name: "Pool", - Sides: []psql.PreloadSide{ - { - From: PublicreportPoolPhotos, - To: PublicreportPools, - FromColumns: []string{"pool_id"}, - ToColumns: []string{"id"}, - }, - }, - }, PublicreportPools.Columns.Names(), opts...) - }, - } -} - -type publicreportPoolPhotoThenLoader[Q orm.Loadable] struct { - Pool func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] -} - -func buildPublicreportPoolPhotoThenLoader[Q orm.Loadable]() publicreportPoolPhotoThenLoader[Q] { - type PoolLoadInterface interface { - LoadPool(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error - } - - return publicreportPoolPhotoThenLoader[Q]{ - Pool: thenLoadBuilder[Q]( - "Pool", - func(ctx context.Context, exec bob.Executor, retrieved PoolLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { - return retrieved.LoadPool(ctx, exec, mods...) - }, - ), - } -} - -// LoadPool loads the publicreportPoolPhoto's Pool into the .R struct -func (o *PublicreportPoolPhoto) LoadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { - if o == nil { - return nil - } - - // Reset the relationship - o.R.Pool = nil - - related, err := o.Pool(mods...).One(ctx, exec) - if err != nil { - return err - } - - related.R.PoolPhotos = PublicreportPoolPhotoSlice{o} - - o.R.Pool = related - return nil -} - -// LoadPool loads the publicreportPoolPhoto's Pool into the .R struct -func (os PublicreportPoolPhotoSlice) LoadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { - if len(os) == 0 { - return nil - } - - publicreportPools, err := os.Pool(mods...).All(ctx, exec) - if err != nil { - return err - } - - for _, o := range os { - if o == nil { - continue - } - - for _, rel := range publicreportPools { - - if !(o.PoolID == rel.ID) { - continue - } - - rel.R.PoolPhotos = append(rel.R.PoolPhotos, o) - - o.R.Pool = rel - break - } - } - - return nil -} - -type publicreportPoolPhotoJoins[Q dialect.Joinable] struct { - typ string - Pool modAs[Q, publicreportPoolColumns] -} - -func (j publicreportPoolPhotoJoins[Q]) aliasedAs(alias string) publicreportPoolPhotoJoins[Q] { - return buildPublicreportPoolPhotoJoins[Q](buildPublicreportPoolPhotoColumns(alias), j.typ) -} - -func buildPublicreportPoolPhotoJoins[Q dialect.Joinable](cols publicreportPoolPhotoColumns, typ string) publicreportPoolPhotoJoins[Q] { - return publicreportPoolPhotoJoins[Q]{ - typ: typ, - Pool: modAs[Q, publicreportPoolColumns]{ - c: PublicreportPools.Columns, - f: func(to publicreportPoolColumns) bob.Mod[Q] { - mods := make(mods.QueryMods[Q], 0, 1) - - { - mods = append(mods, dialect.Join[Q](typ, PublicreportPools.Name().As(to.Alias())).On( - to.ID.EQ(cols.PoolID), - )) - } - - return mods - }, - }, - } -} diff --git a/db/models/publicreport.quick.bob.go b/db/models/publicreport.quick.bob.go index 5cec372c..c6514bb6 100644 --- a/db/models/publicreport.quick.bob.go +++ b/db/models/publicreport.quick.bob.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "io" + "strconv" "time" enums "github.com/Gleipnir-Technology/nidus-sync/db/enums" @@ -23,6 +24,7 @@ import ( "github.com/stephenafamo/bob/mods" "github.com/stephenafamo/bob/orm" "github.com/stephenafamo/bob/types/pgtypes" + "github.com/stephenafamo/scan" ) // PublicreportQuick is an object representing the database table. @@ -55,7 +57,7 @@ type PublicreportQuicksQuery = *psql.ViewQuery[*PublicreportQuick, PublicreportQ // publicreportQuickR is where relationships are stored. type publicreportQuickR struct { - QuickPhotos PublicreportQuickPhotoSlice // publicreport.quick_photo.quick_photo_quick_id_fkey + Images PublicreportImageSlice // publicreport.quick_image.quick_image_image_id_fkeypublicreport.quick_image.quick_image_quick_id_fkey } func buildPublicreportQuickColumns(alias string) publicreportQuickColumns { @@ -558,14 +560,16 @@ func (o PublicreportQuickSlice) ReloadAll(ctx context.Context, exec bob.Executor return nil } -// QuickPhotos starts a query for related objects on publicreport.quick_photo -func (o *PublicreportQuick) QuickPhotos(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuickPhotosQuery { - return PublicreportQuickPhotos.Query(append(mods, - sm.Where(PublicreportQuickPhotos.Columns.QuickID.EQ(psql.Arg(o.ID))), +// Images starts a query for related objects on publicreport.image +func (o *PublicreportQuick) Images(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + return PublicreportImages.Query(append(mods, + sm.InnerJoin(PublicreportQuickImages.NameAs()).On( + PublicreportImages.Columns.ID.EQ(PublicreportQuickImages.Columns.ImageID)), + sm.Where(PublicreportQuickImages.Columns.QuickID.EQ(psql.Arg(o.ID))), )...) } -func (os PublicreportQuickSlice) QuickPhotos(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuickPhotosQuery { +func (os PublicreportQuickSlice) Images(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { pkID := make(pgtypes.Array[int32], 0, len(os)) for _, o := range os { if o == nil { @@ -577,74 +581,74 @@ func (os PublicreportQuickSlice) QuickPhotos(mods ...bob.Mod[*dialect.SelectQuer psql.F("unnest", psql.Cast(psql.Arg(pkID), "integer[]")), )) - return PublicreportQuickPhotos.Query(append(mods, - sm.Where(psql.Group(PublicreportQuickPhotos.Columns.QuickID).OP("IN", PKArgExpr)), + return PublicreportImages.Query(append(mods, + sm.InnerJoin(PublicreportQuickImages.NameAs()).On( + PublicreportImages.Columns.ID.EQ(PublicreportQuickImages.Columns.ImageID), + ), + sm.Where(psql.Group(PublicreportQuickImages.Columns.QuickID).OP("IN", PKArgExpr)), )...) } -func insertPublicreportQuickQuickPhotos0(ctx context.Context, exec bob.Executor, publicreportQuickPhotos1 []*PublicreportQuickPhotoSetter, publicreportQuick0 *PublicreportQuick) (PublicreportQuickPhotoSlice, error) { - for i := range publicreportQuickPhotos1 { - publicreportQuickPhotos1[i].QuickID = omit.From(publicreportQuick0.ID) +func attachPublicreportQuickImages0(ctx context.Context, exec bob.Executor, count int, publicreportQuick0 *PublicreportQuick, publicreportImages2 PublicreportImageSlice) (PublicreportQuickImageSlice, error) { + setters := make([]*PublicreportQuickImageSetter, count) + for i := range count { + setters[i] = &PublicreportQuickImageSetter{ + QuickID: omit.From(publicreportQuick0.ID), + ImageID: omit.From(publicreportImages2[i].ID), + } } - ret, err := PublicreportQuickPhotos.Insert(bob.ToMods(publicreportQuickPhotos1...)).All(ctx, exec) + publicreportQuickImages1, err := PublicreportQuickImages.Insert(bob.ToMods(setters...)).All(ctx, exec) if err != nil { - return ret, fmt.Errorf("insertPublicreportQuickQuickPhotos0: %w", err) + return nil, fmt.Errorf("attachPublicreportQuickImages0: %w", err) } - return ret, nil + return publicreportQuickImages1, nil } -func attachPublicreportQuickQuickPhotos0(ctx context.Context, exec bob.Executor, count int, publicreportQuickPhotos1 PublicreportQuickPhotoSlice, publicreportQuick0 *PublicreportQuick) (PublicreportQuickPhotoSlice, error) { - setter := &PublicreportQuickPhotoSetter{ - QuickID: omit.From(publicreportQuick0.ID), - } - - err := publicreportQuickPhotos1.UpdateAll(ctx, exec, *setter) - if err != nil { - return nil, fmt.Errorf("attachPublicreportQuickQuickPhotos0: %w", err) - } - - return publicreportQuickPhotos1, nil -} - -func (publicreportQuick0 *PublicreportQuick) InsertQuickPhotos(ctx context.Context, exec bob.Executor, related ...*PublicreportQuickPhotoSetter) error { +func (publicreportQuick0 *PublicreportQuick) InsertImages(ctx context.Context, exec bob.Executor, related ...*PublicreportImageSetter) error { if len(related) == 0 { return nil } var err error - publicreportQuickPhotos1, err := insertPublicreportQuickQuickPhotos0(ctx, exec, related, publicreportQuick0) + inserted, err := PublicreportImages.Insert(bob.ToMods(related...)).All(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + publicreportImages2 := PublicreportImageSlice(inserted) + + _, err = attachPublicreportQuickImages0(ctx, exec, len(related), publicreportQuick0, publicreportImages2) if err != nil { return err } - publicreportQuick0.R.QuickPhotos = append(publicreportQuick0.R.QuickPhotos, publicreportQuickPhotos1...) + publicreportQuick0.R.Images = append(publicreportQuick0.R.Images, publicreportImages2...) - for _, rel := range publicreportQuickPhotos1 { - rel.R.Quick = publicreportQuick0 + for _, rel := range publicreportImages2 { + rel.R.Quicks = append(rel.R.Quicks, publicreportQuick0) } return nil } -func (publicreportQuick0 *PublicreportQuick) AttachQuickPhotos(ctx context.Context, exec bob.Executor, related ...*PublicreportQuickPhoto) error { +func (publicreportQuick0 *PublicreportQuick) AttachImages(ctx context.Context, exec bob.Executor, related ...*PublicreportImage) error { if len(related) == 0 { return nil } var err error - publicreportQuickPhotos1 := PublicreportQuickPhotoSlice(related) + publicreportImages2 := PublicreportImageSlice(related) - _, err = attachPublicreportQuickQuickPhotos0(ctx, exec, len(related), publicreportQuickPhotos1, publicreportQuick0) + _, err = attachPublicreportQuickImages0(ctx, exec, len(related), publicreportQuick0, publicreportImages2) if err != nil { return err } - publicreportQuick0.R.QuickPhotos = append(publicreportQuick0.R.QuickPhotos, publicreportQuickPhotos1...) + publicreportQuick0.R.Images = append(publicreportQuick0.R.Images, publicreportImages2...) for _, rel := range related { - rel.R.Quick = publicreportQuick0 + rel.R.Quicks = append(rel.R.Quicks, publicreportQuick0) } return nil @@ -688,17 +692,17 @@ func (o *PublicreportQuick) Preload(name string, retrieved any) error { } switch name { - case "QuickPhotos": - rels, ok := retrieved.(PublicreportQuickPhotoSlice) + case "Images": + rels, ok := retrieved.(PublicreportImageSlice) if !ok { return fmt.Errorf("publicreportQuick cannot load %T as %q", retrieved, name) } - o.R.QuickPhotos = rels + o.R.Images = rels for _, rel := range rels { if rel != nil { - rel.R.Quick = o + rel.R.Quicks = PublicreportQuickSlice{o} } } return nil @@ -714,79 +718,99 @@ func buildPublicreportQuickPreloader() publicreportQuickPreloader { } type publicreportQuickThenLoader[Q orm.Loadable] struct { - QuickPhotos func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Images func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] } func buildPublicreportQuickThenLoader[Q orm.Loadable]() publicreportQuickThenLoader[Q] { - type QuickPhotosLoadInterface interface { - LoadQuickPhotos(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + type ImagesLoadInterface interface { + LoadImages(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error } return publicreportQuickThenLoader[Q]{ - QuickPhotos: thenLoadBuilder[Q]( - "QuickPhotos", - func(ctx context.Context, exec bob.Executor, retrieved QuickPhotosLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { - return retrieved.LoadQuickPhotos(ctx, exec, mods...) + Images: thenLoadBuilder[Q]( + "Images", + func(ctx context.Context, exec bob.Executor, retrieved ImagesLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadImages(ctx, exec, mods...) }, ), } } -// LoadQuickPhotos loads the publicreportQuick's QuickPhotos into the .R struct -func (o *PublicreportQuick) LoadQuickPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadImages loads the publicreportQuick's Images into the .R struct +func (o *PublicreportQuick) LoadImages(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { if o == nil { return nil } // Reset the relationship - o.R.QuickPhotos = nil + o.R.Images = nil - related, err := o.QuickPhotos(mods...).All(ctx, exec) + related, err := o.Images(mods...).All(ctx, exec) if err != nil { return err } for _, rel := range related { - rel.R.Quick = o + rel.R.Quicks = PublicreportQuickSlice{o} } - o.R.QuickPhotos = related + o.R.Images = related return nil } -// LoadQuickPhotos loads the publicreportQuick's QuickPhotos into the .R struct -func (os PublicreportQuickSlice) LoadQuickPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadImages loads the publicreportQuick's Images into the .R struct +func (os PublicreportQuickSlice) LoadImages(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { if len(os) == 0 { return nil } - publicreportQuickPhotos, err := os.QuickPhotos(mods...).All(ctx, exec) + // 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(PublicreportImages.Columns)) + } + + q := os.Images(append( + mods, + sm.Columns(PublicreportQuickImages.Columns.QuickID.As("related_publicreport.quick.ID")), + )...) + + IDSlice := []int32{} + + mapper := scan.Mod(scan.StructMapper[*PublicreportImage](), 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_publicreport.quick.ID", &IDSlice[len(IDSlice)-1]) + + return nil, nil + }, + func(any, any) error { + return nil + } + }) + + publicreportImages, err := bob.Allx[bob.SliceTransformer[*PublicreportImage, PublicreportImageSlice]](ctx, exec, q, mapper) if err != nil { return err } for _, o := range os { - if o == nil { - continue - } - - o.R.QuickPhotos = nil + o.R.Images = nil } for _, o := range os { - if o == nil { - continue - } - - for _, rel := range publicreportQuickPhotos { - - if !(o.ID == rel.QuickID) { + for i, rel := range publicreportImages { + if !(o.ID == IDSlice[i]) { continue } - rel.R.Quick = o + rel.R.Quicks = append(rel.R.Quicks, o) - o.R.QuickPhotos = append(o.R.QuickPhotos, rel) + o.R.Images = append(o.R.Images, rel) } } @@ -795,7 +819,7 @@ func (os PublicreportQuickSlice) LoadQuickPhotos(ctx context.Context, exec bob.E // publicreportQuickC is where relationship counts are stored. type publicreportQuickC struct { - QuickPhotos *int64 + Images *int64 } // PreloadCount sets a count in the C struct by name @@ -805,20 +829,20 @@ func (o *PublicreportQuick) PreloadCount(name string, count int64) error { } switch name { - case "QuickPhotos": - o.C.QuickPhotos = &count + case "Images": + o.C.Images = &count } return nil } type publicreportQuickCountPreloader struct { - QuickPhotos func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader + Images func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader } func buildPublicreportQuickCountPreloader() publicreportQuickCountPreloader { return publicreportQuickCountPreloader{ - QuickPhotos: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader { - return countPreloader[*PublicreportQuick]("QuickPhotos", func(parent string) bob.Expression { + Images: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader { + return countPreloader[*PublicreportQuick]("Images", func(parent string) bob.Expression { // Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk) if parent == "" { parent = PublicreportQuicks.Alias() @@ -827,8 +851,11 @@ func buildPublicreportQuickCountPreloader() publicreportQuickCountPreloader { subqueryMods := []bob.Mod[*dialect.SelectQuery]{ sm.Columns(psql.Raw("count(*)")), - sm.From(PublicreportQuickPhotos.Name()), - sm.Where(psql.Quote(PublicreportQuickPhotos.Alias(), "quick_id").EQ(psql.Quote(parent, "id"))), + sm.From(PublicreportQuickImages.Name()), + sm.Where(psql.Quote(PublicreportQuickImages.Alias(), "quick_id").EQ(psql.Quote(parent, "id"))), + sm.InnerJoin(PublicreportImages.Name()).On( + psql.Quote(PublicreportImages.Alias(), "id").EQ(psql.Quote(PublicreportQuickImages.Alias(), "image_id")), + ), } subqueryMods = append(subqueryMods, mods...) return psql.Group(psql.Select(subqueryMods...).Expression) @@ -838,47 +865,47 @@ func buildPublicreportQuickCountPreloader() publicreportQuickCountPreloader { } type publicreportQuickCountThenLoader[Q orm.Loadable] struct { - QuickPhotos func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Images func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] } func buildPublicreportQuickCountThenLoader[Q orm.Loadable]() publicreportQuickCountThenLoader[Q] { - type QuickPhotosCountInterface interface { - LoadCountQuickPhotos(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + type ImagesCountInterface interface { + LoadCountImages(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error } return publicreportQuickCountThenLoader[Q]{ - QuickPhotos: countThenLoadBuilder[Q]( - "QuickPhotos", - func(ctx context.Context, exec bob.Executor, retrieved QuickPhotosCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { - return retrieved.LoadCountQuickPhotos(ctx, exec, mods...) + Images: countThenLoadBuilder[Q]( + "Images", + func(ctx context.Context, exec bob.Executor, retrieved ImagesCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadCountImages(ctx, exec, mods...) }, ), } } -// LoadCountQuickPhotos loads the count of QuickPhotos into the C struct -func (o *PublicreportQuick) LoadCountQuickPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadCountImages loads the count of Images into the C struct +func (o *PublicreportQuick) LoadCountImages(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { if o == nil { return nil } - count, err := o.QuickPhotos(mods...).Count(ctx, exec) + count, err := o.Images(mods...).Count(ctx, exec) if err != nil { return err } - o.C.QuickPhotos = &count + o.C.Images = &count return nil } -// LoadCountQuickPhotos loads the count of QuickPhotos for a slice -func (os PublicreportQuickSlice) LoadCountQuickPhotos(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { +// LoadCountImages loads the count of Images for a slice +func (os PublicreportQuickSlice) LoadCountImages(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.LoadCountQuickPhotos(ctx, exec, mods...); err != nil { + if err := o.LoadCountImages(ctx, exec, mods...); err != nil { return err } } @@ -887,8 +914,8 @@ func (os PublicreportQuickSlice) LoadCountQuickPhotos(ctx context.Context, exec } type publicreportQuickJoins[Q dialect.Joinable] struct { - typ string - QuickPhotos modAs[Q, publicreportQuickPhotoColumns] + typ string + Images modAs[Q, publicreportImageColumns] } func (j publicreportQuickJoins[Q]) aliasedAs(alias string) publicreportQuickJoins[Q] { @@ -898,16 +925,24 @@ func (j publicreportQuickJoins[Q]) aliasedAs(alias string) publicreportQuickJoin func buildPublicreportQuickJoins[Q dialect.Joinable](cols publicreportQuickColumns, typ string) publicreportQuickJoins[Q] { return publicreportQuickJoins[Q]{ typ: typ, - QuickPhotos: modAs[Q, publicreportQuickPhotoColumns]{ - c: PublicreportQuickPhotos.Columns, - f: func(to publicreportQuickPhotoColumns) bob.Mod[Q] { - mods := make(mods.QueryMods[Q], 0, 1) + Images: modAs[Q, publicreportImageColumns]{ + c: PublicreportImages.Columns, + f: func(to publicreportImageColumns) bob.Mod[Q] { + random := strconv.FormatInt(randInt(), 10) + mods := make(mods.QueryMods[Q], 0, 2) { - mods = append(mods, dialect.Join[Q](typ, PublicreportQuickPhotos.Name().As(to.Alias())).On( + to := PublicreportQuickImages.Columns.AliasedAs(PublicreportQuickImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportQuickImages.Name().As(to.Alias())).On( to.QuickID.EQ(cols.ID), )) } + { + cols := PublicreportQuickImages.Columns.AliasedAs(PublicreportQuickImages.Columns.Alias() + random) + mods = append(mods, dialect.Join[Q](typ, PublicreportImages.Name().As(to.Alias())).On( + to.ID.EQ(cols.ImageID), + )) + } return mods }, diff --git a/db/models/publicreport.quick_image.bob.go b/db/models/publicreport.quick_image.bob.go new file mode 100644 index 00000000..9d78ab8c --- /dev/null +++ b/db/models/publicreport.quick_image.bob.go @@ -0,0 +1,766 @@ +// Code generated by BobGen psql v0.42.1. 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/aarondl/opt/omit" + "github.com/stephenafamo/bob" + "github.com/stephenafamo/bob/dialect/psql" + "github.com/stephenafamo/bob/dialect/psql/dialect" + "github.com/stephenafamo/bob/dialect/psql/dm" + "github.com/stephenafamo/bob/dialect/psql/sm" + "github.com/stephenafamo/bob/dialect/psql/um" + "github.com/stephenafamo/bob/expr" + "github.com/stephenafamo/bob/mods" + "github.com/stephenafamo/bob/orm" + "github.com/stephenafamo/bob/types/pgtypes" +) + +// PublicreportQuickImage is an object representing the database table. +type PublicreportQuickImage struct { + ImageID int32 `db:"image_id,pk" ` + QuickID int32 `db:"quick_id,pk" ` + + R publicreportQuickImageR `db:"-" ` +} + +// PublicreportQuickImageSlice is an alias for a slice of pointers to PublicreportQuickImage. +// This should almost always be used instead of []*PublicreportQuickImage. +type PublicreportQuickImageSlice []*PublicreportQuickImage + +// PublicreportQuickImages contains methods to work with the quick_image table +var PublicreportQuickImages = psql.NewTablex[*PublicreportQuickImage, PublicreportQuickImageSlice, *PublicreportQuickImageSetter]("publicreport", "quick_image", buildPublicreportQuickImageColumns("publicreport.quick_image")) + +// PublicreportQuickImagesQuery is a query on the quick_image table +type PublicreportQuickImagesQuery = *psql.ViewQuery[*PublicreportQuickImage, PublicreportQuickImageSlice] + +// publicreportQuickImageR is where relationships are stored. +type publicreportQuickImageR struct { + Image *PublicreportImage // publicreport.quick_image.quick_image_image_id_fkey + Quick *PublicreportQuick // publicreport.quick_image.quick_image_quick_id_fkey +} + +func buildPublicreportQuickImageColumns(alias string) publicreportQuickImageColumns { + return publicreportQuickImageColumns{ + ColumnsExpr: expr.NewColumnsExpr( + "image_id", "quick_id", + ).WithParent("publicreport.quick_image"), + tableAlias: alias, + ImageID: psql.Quote(alias, "image_id"), + QuickID: psql.Quote(alias, "quick_id"), + } +} + +type publicreportQuickImageColumns struct { + expr.ColumnsExpr + tableAlias string + ImageID psql.Expression + QuickID psql.Expression +} + +func (c publicreportQuickImageColumns) Alias() string { + return c.tableAlias +} + +func (publicreportQuickImageColumns) AliasedAs(alias string) publicreportQuickImageColumns { + return buildPublicreportQuickImageColumns(alias) +} + +// PublicreportQuickImageSetter is used for insert/upsert/update operations +// All values are optional, and do not have to be set +// Generated columns are not included +type PublicreportQuickImageSetter struct { + ImageID omit.Val[int32] `db:"image_id,pk" ` + QuickID omit.Val[int32] `db:"quick_id,pk" ` +} + +func (s PublicreportQuickImageSetter) SetColumns() []string { + vals := make([]string, 0, 2) + if s.ImageID.IsValue() { + vals = append(vals, "image_id") + } + if s.QuickID.IsValue() { + vals = append(vals, "quick_id") + } + return vals +} + +func (s PublicreportQuickImageSetter) Overwrite(t *PublicreportQuickImage) { + if s.ImageID.IsValue() { + t.ImageID = s.ImageID.MustGet() + } + if s.QuickID.IsValue() { + t.QuickID = s.QuickID.MustGet() + } +} + +func (s *PublicreportQuickImageSetter) Apply(q *dialect.InsertQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportQuickImages.BeforeInsertHooks.RunHooks(ctx, exec, s) + }) + + 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.ImageID.IsValue() { + vals[0] = psql.Arg(s.ImageID.MustGet()) + } else { + vals[0] = psql.Raw("DEFAULT") + } + + if s.QuickID.IsValue() { + vals[1] = psql.Arg(s.QuickID.MustGet()) + } else { + vals[1] = psql.Raw("DEFAULT") + } + + return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") + })) +} + +func (s PublicreportQuickImageSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return um.Set(s.Expressions()...) +} + +func (s PublicreportQuickImageSetter) Expressions(prefix ...string) []bob.Expression { + exprs := make([]bob.Expression, 0, 2) + + if s.ImageID.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "image_id")...), + psql.Arg(s.ImageID), + }}) + } + + if s.QuickID.IsValue() { + exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ + psql.Quote(append(prefix, "quick_id")...), + psql.Arg(s.QuickID), + }}) + } + + return exprs +} + +// FindPublicreportQuickImage retrieves a single record by primary key +// If cols is empty Find will return all columns. +func FindPublicreportQuickImage(ctx context.Context, exec bob.Executor, ImageIDPK int32, QuickIDPK int32, cols ...string) (*PublicreportQuickImage, error) { + if len(cols) == 0 { + return PublicreportQuickImages.Query( + sm.Where(PublicreportQuickImages.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportQuickImages.Columns.QuickID.EQ(psql.Arg(QuickIDPK))), + ).One(ctx, exec) + } + + return PublicreportQuickImages.Query( + sm.Where(PublicreportQuickImages.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportQuickImages.Columns.QuickID.EQ(psql.Arg(QuickIDPK))), + sm.Columns(PublicreportQuickImages.Columns.Only(cols...)), + ).One(ctx, exec) +} + +// PublicreportQuickImageExists checks the presence of a single record by primary key +func PublicreportQuickImageExists(ctx context.Context, exec bob.Executor, ImageIDPK int32, QuickIDPK int32) (bool, error) { + return PublicreportQuickImages.Query( + sm.Where(PublicreportQuickImages.Columns.ImageID.EQ(psql.Arg(ImageIDPK))), + sm.Where(PublicreportQuickImages.Columns.QuickID.EQ(psql.Arg(QuickIDPK))), + ).Exists(ctx, exec) +} + +// AfterQueryHook is called after PublicreportQuickImage is retrieved from the database +func (o *PublicreportQuickImage) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportQuickImages.AfterSelectHooks.RunHooks(ctx, exec, PublicreportQuickImageSlice{o}) + case bob.QueryTypeInsert: + ctx, err = PublicreportQuickImages.AfterInsertHooks.RunHooks(ctx, exec, PublicreportQuickImageSlice{o}) + case bob.QueryTypeUpdate: + ctx, err = PublicreportQuickImages.AfterUpdateHooks.RunHooks(ctx, exec, PublicreportQuickImageSlice{o}) + case bob.QueryTypeDelete: + ctx, err = PublicreportQuickImages.AfterDeleteHooks.RunHooks(ctx, exec, PublicreportQuickImageSlice{o}) + } + + return err +} + +// primaryKeyVals returns the primary key values of the PublicreportQuickImage +func (o *PublicreportQuickImage) primaryKeyVals() bob.Expression { + return psql.ArgGroup( + o.ImageID, + o.QuickID, + ) +} + +func (o *PublicreportQuickImage) pkEQ() dialect.Expression { + return psql.Group(psql.Quote("publicreport.quick_image", "image_id"), psql.Quote("publicreport.quick_image", "quick_id")).EQ(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + return o.primaryKeyVals().WriteSQL(ctx, w, d, start) + })) +} + +// Update uses an executor to update the PublicreportQuickImage +func (o *PublicreportQuickImage) Update(ctx context.Context, exec bob.Executor, s *PublicreportQuickImageSetter) error { + v, err := PublicreportQuickImages.Update(s.UpdateMod(), um.Where(o.pkEQ())).One(ctx, exec) + if err != nil { + return err + } + + o.R = v.R + *o = *v + + return nil +} + +// Delete deletes a single PublicreportQuickImage record with an executor +func (o *PublicreportQuickImage) Delete(ctx context.Context, exec bob.Executor) error { + _, err := PublicreportQuickImages.Delete(dm.Where(o.pkEQ())).Exec(ctx, exec) + return err +} + +// Reload refreshes the PublicreportQuickImage using the executor +func (o *PublicreportQuickImage) Reload(ctx context.Context, exec bob.Executor) error { + o2, err := PublicreportQuickImages.Query( + sm.Where(PublicreportQuickImages.Columns.ImageID.EQ(psql.Arg(o.ImageID))), + sm.Where(PublicreportQuickImages.Columns.QuickID.EQ(psql.Arg(o.QuickID))), + ).One(ctx, exec) + if err != nil { + return err + } + o2.R = o.R + *o = *o2 + + return nil +} + +// AfterQueryHook is called after PublicreportQuickImageSlice is retrieved from the database +func (o PublicreportQuickImageSlice) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { + var err error + + switch queryType { + case bob.QueryTypeSelect: + ctx, err = PublicreportQuickImages.AfterSelectHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeInsert: + ctx, err = PublicreportQuickImages.AfterInsertHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeUpdate: + ctx, err = PublicreportQuickImages.AfterUpdateHooks.RunHooks(ctx, exec, o) + case bob.QueryTypeDelete: + ctx, err = PublicreportQuickImages.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err +} + +func (o PublicreportQuickImageSlice) pkIN() dialect.Expression { + if len(o) == 0 { + return psql.Raw("NULL") + } + + return psql.Group(psql.Quote("publicreport.quick_image", "image_id"), psql.Quote("publicreport.quick_image", "quick_id")).In(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { + pkPairs := make([]bob.Expression, len(o)) + for i, row := range o { + pkPairs[i] = row.primaryKeyVals() + } + return bob.ExpressSlice(ctx, w, d, start, pkPairs, "", ", ", "") + })) +} + +// copyMatchingRows finds models in the given slice that have the same primary key +// then it first copies the existing relationships from the old model to the new model +// and then replaces the old model in the slice with the new model +func (o PublicreportQuickImageSlice) copyMatchingRows(from ...*PublicreportQuickImage) { + for i, old := range o { + for _, new := range from { + if new.ImageID != old.ImageID { + continue + } + if new.QuickID != old.QuickID { + continue + } + new.R = old.R + o[i] = new + break + } + } +} + +// UpdateMod modifies an update query with "WHERE primary_key IN (o...)" +func (o PublicreportQuickImageSlice) UpdateMod() bob.Mod[*dialect.UpdateQuery] { + return bob.ModFunc[*dialect.UpdateQuery](func(q *dialect.UpdateQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportQuickImages.BeforeUpdateHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportQuickImage: + o.copyMatchingRows(retrieved) + case []*PublicreportQuickImage: + o.copyMatchingRows(retrieved...) + case PublicreportQuickImageSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportQuickImage or a slice of PublicreportQuickImage + // then run the AfterUpdateHooks on the slice + _, err = PublicreportQuickImages.AfterUpdateHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +// DeleteMod modifies an delete query with "WHERE primary_key IN (o...)" +func (o PublicreportQuickImageSlice) DeleteMod() bob.Mod[*dialect.DeleteQuery] { + return bob.ModFunc[*dialect.DeleteQuery](func(q *dialect.DeleteQuery) { + q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { + return PublicreportQuickImages.BeforeDeleteHooks.RunHooks(ctx, exec, o) + }) + + q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { + var err error + switch retrieved := retrieved.(type) { + case *PublicreportQuickImage: + o.copyMatchingRows(retrieved) + case []*PublicreportQuickImage: + o.copyMatchingRows(retrieved...) + case PublicreportQuickImageSlice: + o.copyMatchingRows(retrieved...) + default: + // If the retrieved value is not a PublicreportQuickImage or a slice of PublicreportQuickImage + // then run the AfterDeleteHooks on the slice + _, err = PublicreportQuickImages.AfterDeleteHooks.RunHooks(ctx, exec, o) + } + + return err + })) + + q.AppendWhere(o.pkIN()) + }) +} + +func (o PublicreportQuickImageSlice) UpdateAll(ctx context.Context, exec bob.Executor, vals PublicreportQuickImageSetter) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportQuickImages.Update(vals.UpdateMod(), o.UpdateMod()).All(ctx, exec) + return err +} + +func (o PublicreportQuickImageSlice) DeleteAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + _, err := PublicreportQuickImages.Delete(o.DeleteMod()).Exec(ctx, exec) + return err +} + +func (o PublicreportQuickImageSlice) ReloadAll(ctx context.Context, exec bob.Executor) error { + if len(o) == 0 { + return nil + } + + o2, err := PublicreportQuickImages.Query(sm.Where(o.pkIN())).All(ctx, exec) + if err != nil { + return err + } + + o.copyMatchingRows(o2...) + + return nil +} + +// Image starts a query for related objects on publicreport.image +func (o *PublicreportQuickImage) Image(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + return PublicreportImages.Query(append(mods, + sm.Where(PublicreportImages.Columns.ID.EQ(psql.Arg(o.ImageID))), + )...) +} + +func (os PublicreportQuickImageSlice) Image(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportImagesQuery { + pkImageID := make(pgtypes.Array[int32], 0, len(os)) + for _, o := range os { + if o == nil { + continue + } + pkImageID = append(pkImageID, o.ImageID) + } + PKArgExpr := psql.Select(sm.Columns( + psql.F("unnest", psql.Cast(psql.Arg(pkImageID), "integer[]")), + )) + + return PublicreportImages.Query(append(mods, + sm.Where(psql.Group(PublicreportImages.Columns.ID).OP("IN", PKArgExpr)), + )...) +} + +// Quick starts a query for related objects on publicreport.quick +func (o *PublicreportQuickImage) Quick(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuicksQuery { + return PublicreportQuicks.Query(append(mods, + sm.Where(PublicreportQuicks.Columns.ID.EQ(psql.Arg(o.QuickID))), + )...) +} + +func (os PublicreportQuickImageSlice) Quick(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuicksQuery { + pkQuickID := make(pgtypes.Array[int32], 0, len(os)) + for _, o := range os { + if o == nil { + continue + } + pkQuickID = append(pkQuickID, o.QuickID) + } + PKArgExpr := psql.Select(sm.Columns( + psql.F("unnest", psql.Cast(psql.Arg(pkQuickID), "integer[]")), + )) + + return PublicreportQuicks.Query(append(mods, + sm.Where(psql.Group(PublicreportQuicks.Columns.ID).OP("IN", PKArgExpr)), + )...) +} + +func attachPublicreportQuickImageImage0(ctx context.Context, exec bob.Executor, count int, publicreportQuickImage0 *PublicreportQuickImage, publicreportImage1 *PublicreportImage) (*PublicreportQuickImage, error) { + setter := &PublicreportQuickImageSetter{ + ImageID: omit.From(publicreportImage1.ID), + } + + err := publicreportQuickImage0.Update(ctx, exec, setter) + if err != nil { + return nil, fmt.Errorf("attachPublicreportQuickImageImage0: %w", err) + } + + return publicreportQuickImage0, nil +} + +func (publicreportQuickImage0 *PublicreportQuickImage) InsertImage(ctx context.Context, exec bob.Executor, related *PublicreportImageSetter) error { + var err error + + publicreportImage1, err := PublicreportImages.Insert(related).One(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + + _, err = attachPublicreportQuickImageImage0(ctx, exec, 1, publicreportQuickImage0, publicreportImage1) + if err != nil { + return err + } + + publicreportQuickImage0.R.Image = publicreportImage1 + + return nil +} + +func (publicreportQuickImage0 *PublicreportQuickImage) AttachImage(ctx context.Context, exec bob.Executor, publicreportImage1 *PublicreportImage) error { + var err error + + _, err = attachPublicreportQuickImageImage0(ctx, exec, 1, publicreportQuickImage0, publicreportImage1) + if err != nil { + return err + } + + publicreportQuickImage0.R.Image = publicreportImage1 + + return nil +} + +func attachPublicreportQuickImageQuick0(ctx context.Context, exec bob.Executor, count int, publicreportQuickImage0 *PublicreportQuickImage, publicreportQuick1 *PublicreportQuick) (*PublicreportQuickImage, error) { + setter := &PublicreportQuickImageSetter{ + QuickID: omit.From(publicreportQuick1.ID), + } + + err := publicreportQuickImage0.Update(ctx, exec, setter) + if err != nil { + return nil, fmt.Errorf("attachPublicreportQuickImageQuick0: %w", err) + } + + return publicreportQuickImage0, nil +} + +func (publicreportQuickImage0 *PublicreportQuickImage) InsertQuick(ctx context.Context, exec bob.Executor, related *PublicreportQuickSetter) error { + var err error + + publicreportQuick1, err := PublicreportQuicks.Insert(related).One(ctx, exec) + if err != nil { + return fmt.Errorf("inserting related objects: %w", err) + } + + _, err = attachPublicreportQuickImageQuick0(ctx, exec, 1, publicreportQuickImage0, publicreportQuick1) + if err != nil { + return err + } + + publicreportQuickImage0.R.Quick = publicreportQuick1 + + return nil +} + +func (publicreportQuickImage0 *PublicreportQuickImage) AttachQuick(ctx context.Context, exec bob.Executor, publicreportQuick1 *PublicreportQuick) error { + var err error + + _, err = attachPublicreportQuickImageQuick0(ctx, exec, 1, publicreportQuickImage0, publicreportQuick1) + if err != nil { + return err + } + + publicreportQuickImage0.R.Quick = publicreportQuick1 + + return nil +} + +type publicreportQuickImageWhere[Q psql.Filterable] struct { + ImageID psql.WhereMod[Q, int32] + QuickID psql.WhereMod[Q, int32] +} + +func (publicreportQuickImageWhere[Q]) AliasedAs(alias string) publicreportQuickImageWhere[Q] { + return buildPublicreportQuickImageWhere[Q](buildPublicreportQuickImageColumns(alias)) +} + +func buildPublicreportQuickImageWhere[Q psql.Filterable](cols publicreportQuickImageColumns) publicreportQuickImageWhere[Q] { + return publicreportQuickImageWhere[Q]{ + ImageID: psql.Where[Q, int32](cols.ImageID), + QuickID: psql.Where[Q, int32](cols.QuickID), + } +} + +func (o *PublicreportQuickImage) Preload(name string, retrieved any) error { + if o == nil { + return nil + } + + switch name { + case "Image": + rel, ok := retrieved.(*PublicreportImage) + if !ok { + return fmt.Errorf("publicreportQuickImage cannot load %T as %q", retrieved, name) + } + + o.R.Image = rel + + return nil + case "Quick": + rel, ok := retrieved.(*PublicreportQuick) + if !ok { + return fmt.Errorf("publicreportQuickImage cannot load %T as %q", retrieved, name) + } + + o.R.Quick = rel + + return nil + default: + return fmt.Errorf("publicreportQuickImage has no relationship %q", name) + } +} + +type publicreportQuickImagePreloader struct { + Image func(...psql.PreloadOption) psql.Preloader + Quick func(...psql.PreloadOption) psql.Preloader +} + +func buildPublicreportQuickImagePreloader() publicreportQuickImagePreloader { + return publicreportQuickImagePreloader{ + Image: func(opts ...psql.PreloadOption) psql.Preloader { + return psql.Preload[*PublicreportImage, PublicreportImageSlice](psql.PreloadRel{ + Name: "Image", + Sides: []psql.PreloadSide{ + { + From: PublicreportQuickImages, + To: PublicreportImages, + FromColumns: []string{"image_id"}, + ToColumns: []string{"id"}, + }, + }, + }, PublicreportImages.Columns.Names(), opts...) + }, + Quick: func(opts ...psql.PreloadOption) psql.Preloader { + return psql.Preload[*PublicreportQuick, PublicreportQuickSlice](psql.PreloadRel{ + Name: "Quick", + Sides: []psql.PreloadSide{ + { + From: PublicreportQuickImages, + To: PublicreportQuicks, + FromColumns: []string{"quick_id"}, + ToColumns: []string{"id"}, + }, + }, + }, PublicreportQuicks.Columns.Names(), opts...) + }, + } +} + +type publicreportQuickImageThenLoader[Q orm.Loadable] struct { + Image func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] + Quick func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] +} + +func buildPublicreportQuickImageThenLoader[Q orm.Loadable]() publicreportQuickImageThenLoader[Q] { + type ImageLoadInterface interface { + LoadImage(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + type QuickLoadInterface interface { + LoadQuick(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error + } + + return publicreportQuickImageThenLoader[Q]{ + Image: thenLoadBuilder[Q]( + "Image", + func(ctx context.Context, exec bob.Executor, retrieved ImageLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadImage(ctx, exec, mods...) + }, + ), + Quick: thenLoadBuilder[Q]( + "Quick", + func(ctx context.Context, exec bob.Executor, retrieved QuickLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { + return retrieved.LoadQuick(ctx, exec, mods...) + }, + ), + } +} + +// LoadImage loads the publicreportQuickImage's Image into the .R struct +func (o *PublicreportQuickImage) LoadImage(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.Image = nil + + related, err := o.Image(mods...).One(ctx, exec) + if err != nil { + return err + } + + o.R.Image = related + return nil +} + +// LoadImage loads the publicreportQuickImage's Image into the .R struct +func (os PublicreportQuickImageSlice) LoadImage(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if len(os) == 0 { + return nil + } + + publicreportImages, err := os.Image(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, o := range os { + if o == nil { + continue + } + + for _, rel := range publicreportImages { + + if !(o.ImageID == rel.ID) { + continue + } + + o.R.Image = rel + break + } + } + + return nil +} + +// LoadQuick loads the publicreportQuickImage's Quick into the .R struct +func (o *PublicreportQuickImage) LoadQuick(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if o == nil { + return nil + } + + // Reset the relationship + o.R.Quick = nil + + related, err := o.Quick(mods...).One(ctx, exec) + if err != nil { + return err + } + + o.R.Quick = related + return nil +} + +// LoadQuick loads the publicreportQuickImage's Quick into the .R struct +func (os PublicreportQuickImageSlice) LoadQuick(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { + if len(os) == 0 { + return nil + } + + publicreportQuicks, err := os.Quick(mods...).All(ctx, exec) + if err != nil { + return err + } + + for _, o := range os { + if o == nil { + continue + } + + for _, rel := range publicreportQuicks { + + if !(o.QuickID == rel.ID) { + continue + } + + o.R.Quick = rel + break + } + } + + return nil +} + +type publicreportQuickImageJoins[Q dialect.Joinable] struct { + typ string + Image modAs[Q, publicreportImageColumns] + Quick modAs[Q, publicreportQuickColumns] +} + +func (j publicreportQuickImageJoins[Q]) aliasedAs(alias string) publicreportQuickImageJoins[Q] { + return buildPublicreportQuickImageJoins[Q](buildPublicreportQuickImageColumns(alias), j.typ) +} + +func buildPublicreportQuickImageJoins[Q dialect.Joinable](cols publicreportQuickImageColumns, typ string) publicreportQuickImageJoins[Q] { + return publicreportQuickImageJoins[Q]{ + typ: typ, + Image: modAs[Q, publicreportImageColumns]{ + c: PublicreportImages.Columns, + f: func(to publicreportImageColumns) bob.Mod[Q] { + mods := make(mods.QueryMods[Q], 0, 1) + + { + mods = append(mods, dialect.Join[Q](typ, PublicreportImages.Name().As(to.Alias())).On( + to.ID.EQ(cols.ImageID), + )) + } + + return mods + }, + }, + Quick: modAs[Q, publicreportQuickColumns]{ + c: PublicreportQuicks.Columns, + f: func(to publicreportQuickColumns) bob.Mod[Q] { + mods := make(mods.QueryMods[Q], 0, 1) + + { + mods = append(mods, dialect.Join[Q](typ, PublicreportQuicks.Name().As(to.Alias())).On( + to.ID.EQ(cols.QuickID), + )) + } + + return mods + }, + }, + } +} diff --git a/db/models/publicreport.quick_photo.bob.go b/db/models/publicreport.quick_photo.bob.go deleted file mode 100644 index 9f5171d4..00000000 --- a/db/models/publicreport.quick_photo.bob.go +++ /dev/null @@ -1,678 +0,0 @@ -// Code generated by BobGen psql v0.42.1. 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/aarondl/opt/omit" - "github.com/google/uuid" - "github.com/stephenafamo/bob" - "github.com/stephenafamo/bob/dialect/psql" - "github.com/stephenafamo/bob/dialect/psql/dialect" - "github.com/stephenafamo/bob/dialect/psql/dm" - "github.com/stephenafamo/bob/dialect/psql/sm" - "github.com/stephenafamo/bob/dialect/psql/um" - "github.com/stephenafamo/bob/expr" - "github.com/stephenafamo/bob/mods" - "github.com/stephenafamo/bob/orm" - "github.com/stephenafamo/bob/types/pgtypes" -) - -// PublicreportQuickPhoto is an object representing the database table. -type PublicreportQuickPhoto struct { - ID int32 `db:"id,pk" ` - Size int64 `db:"size" ` - Filename string `db:"filename" ` - QuickID int32 `db:"quick_id" ` - UUID uuid.UUID `db:"uuid" ` - - R publicreportQuickPhotoR `db:"-" ` -} - -// PublicreportQuickPhotoSlice is an alias for a slice of pointers to PublicreportQuickPhoto. -// This should almost always be used instead of []*PublicreportQuickPhoto. -type PublicreportQuickPhotoSlice []*PublicreportQuickPhoto - -// PublicreportQuickPhotos contains methods to work with the quick_photo table -var PublicreportQuickPhotos = psql.NewTablex[*PublicreportQuickPhoto, PublicreportQuickPhotoSlice, *PublicreportQuickPhotoSetter]("publicreport", "quick_photo", buildPublicreportQuickPhotoColumns("publicreport.quick_photo")) - -// PublicreportQuickPhotosQuery is a query on the quick_photo table -type PublicreportQuickPhotosQuery = *psql.ViewQuery[*PublicreportQuickPhoto, PublicreportQuickPhotoSlice] - -// publicreportQuickPhotoR is where relationships are stored. -type publicreportQuickPhotoR struct { - Quick *PublicreportQuick // publicreport.quick_photo.quick_photo_quick_id_fkey -} - -func buildPublicreportQuickPhotoColumns(alias string) publicreportQuickPhotoColumns { - return publicreportQuickPhotoColumns{ - ColumnsExpr: expr.NewColumnsExpr( - "id", "size", "filename", "quick_id", "uuid", - ).WithParent("publicreport.quick_photo"), - tableAlias: alias, - ID: psql.Quote(alias, "id"), - Size: psql.Quote(alias, "size"), - Filename: psql.Quote(alias, "filename"), - QuickID: psql.Quote(alias, "quick_id"), - UUID: psql.Quote(alias, "uuid"), - } -} - -type publicreportQuickPhotoColumns struct { - expr.ColumnsExpr - tableAlias string - ID psql.Expression - Size psql.Expression - Filename psql.Expression - QuickID psql.Expression - UUID psql.Expression -} - -func (c publicreportQuickPhotoColumns) Alias() string { - return c.tableAlias -} - -func (publicreportQuickPhotoColumns) AliasedAs(alias string) publicreportQuickPhotoColumns { - return buildPublicreportQuickPhotoColumns(alias) -} - -// PublicreportQuickPhotoSetter is used for insert/upsert/update operations -// All values are optional, and do not have to be set -// Generated columns are not included -type PublicreportQuickPhotoSetter struct { - ID omit.Val[int32] `db:"id,pk" ` - Size omit.Val[int64] `db:"size" ` - Filename omit.Val[string] `db:"filename" ` - QuickID omit.Val[int32] `db:"quick_id" ` - UUID omit.Val[uuid.UUID] `db:"uuid" ` -} - -func (s PublicreportQuickPhotoSetter) SetColumns() []string { - vals := make([]string, 0, 5) - if s.ID.IsValue() { - vals = append(vals, "id") - } - if s.Size.IsValue() { - vals = append(vals, "size") - } - if s.Filename.IsValue() { - vals = append(vals, "filename") - } - if s.QuickID.IsValue() { - vals = append(vals, "quick_id") - } - if s.UUID.IsValue() { - vals = append(vals, "uuid") - } - return vals -} - -func (s PublicreportQuickPhotoSetter) Overwrite(t *PublicreportQuickPhoto) { - if s.ID.IsValue() { - t.ID = s.ID.MustGet() - } - if s.Size.IsValue() { - t.Size = s.Size.MustGet() - } - if s.Filename.IsValue() { - t.Filename = s.Filename.MustGet() - } - if s.QuickID.IsValue() { - t.QuickID = s.QuickID.MustGet() - } - if s.UUID.IsValue() { - t.UUID = s.UUID.MustGet() - } -} - -func (s *PublicreportQuickPhotoSetter) Apply(q *dialect.InsertQuery) { - q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { - return PublicreportQuickPhotos.BeforeInsertHooks.RunHooks(ctx, exec, s) - }) - - q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { - vals := make([]bob.Expression, 5) - if s.ID.IsValue() { - vals[0] = psql.Arg(s.ID.MustGet()) - } else { - vals[0] = psql.Raw("DEFAULT") - } - - if s.Size.IsValue() { - vals[1] = psql.Arg(s.Size.MustGet()) - } else { - vals[1] = psql.Raw("DEFAULT") - } - - if s.Filename.IsValue() { - vals[2] = psql.Arg(s.Filename.MustGet()) - } else { - vals[2] = psql.Raw("DEFAULT") - } - - if s.QuickID.IsValue() { - vals[3] = psql.Arg(s.QuickID.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, "", ", ", "") - })) -} - -func (s PublicreportQuickPhotoSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] { - return um.Set(s.Expressions()...) -} - -func (s PublicreportQuickPhotoSetter) Expressions(prefix ...string) []bob.Expression { - exprs := make([]bob.Expression, 0, 5) - - if s.ID.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "id")...), - psql.Arg(s.ID), - }}) - } - - if s.Size.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "size")...), - psql.Arg(s.Size), - }}) - } - - if s.Filename.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "filename")...), - psql.Arg(s.Filename), - }}) - } - - if s.QuickID.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "quick_id")...), - psql.Arg(s.QuickID), - }}) - } - - if s.UUID.IsValue() { - exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ - psql.Quote(append(prefix, "uuid")...), - psql.Arg(s.UUID), - }}) - } - - return exprs -} - -// FindPublicreportQuickPhoto retrieves a single record by primary key -// If cols is empty Find will return all columns. -func FindPublicreportQuickPhoto(ctx context.Context, exec bob.Executor, IDPK int32, cols ...string) (*PublicreportQuickPhoto, error) { - if len(cols) == 0 { - return PublicreportQuickPhotos.Query( - sm.Where(PublicreportQuickPhotos.Columns.ID.EQ(psql.Arg(IDPK))), - ).One(ctx, exec) - } - - return PublicreportQuickPhotos.Query( - sm.Where(PublicreportQuickPhotos.Columns.ID.EQ(psql.Arg(IDPK))), - sm.Columns(PublicreportQuickPhotos.Columns.Only(cols...)), - ).One(ctx, exec) -} - -// PublicreportQuickPhotoExists checks the presence of a single record by primary key -func PublicreportQuickPhotoExists(ctx context.Context, exec bob.Executor, IDPK int32) (bool, error) { - return PublicreportQuickPhotos.Query( - sm.Where(PublicreportQuickPhotos.Columns.ID.EQ(psql.Arg(IDPK))), - ).Exists(ctx, exec) -} - -// AfterQueryHook is called after PublicreportQuickPhoto is retrieved from the database -func (o *PublicreportQuickPhoto) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { - var err error - - switch queryType { - case bob.QueryTypeSelect: - ctx, err = PublicreportQuickPhotos.AfterSelectHooks.RunHooks(ctx, exec, PublicreportQuickPhotoSlice{o}) - case bob.QueryTypeInsert: - ctx, err = PublicreportQuickPhotos.AfterInsertHooks.RunHooks(ctx, exec, PublicreportQuickPhotoSlice{o}) - case bob.QueryTypeUpdate: - ctx, err = PublicreportQuickPhotos.AfterUpdateHooks.RunHooks(ctx, exec, PublicreportQuickPhotoSlice{o}) - case bob.QueryTypeDelete: - ctx, err = PublicreportQuickPhotos.AfterDeleteHooks.RunHooks(ctx, exec, PublicreportQuickPhotoSlice{o}) - } - - return err -} - -// primaryKeyVals returns the primary key values of the PublicreportQuickPhoto -func (o *PublicreportQuickPhoto) primaryKeyVals() bob.Expression { - return psql.Arg(o.ID) -} - -func (o *PublicreportQuickPhoto) pkEQ() dialect.Expression { - return psql.Quote("publicreport.quick_photo", "id").EQ(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { - return o.primaryKeyVals().WriteSQL(ctx, w, d, start) - })) -} - -// Update uses an executor to update the PublicreportQuickPhoto -func (o *PublicreportQuickPhoto) Update(ctx context.Context, exec bob.Executor, s *PublicreportQuickPhotoSetter) error { - v, err := PublicreportQuickPhotos.Update(s.UpdateMod(), um.Where(o.pkEQ())).One(ctx, exec) - if err != nil { - return err - } - - o.R = v.R - *o = *v - - return nil -} - -// Delete deletes a single PublicreportQuickPhoto record with an executor -func (o *PublicreportQuickPhoto) Delete(ctx context.Context, exec bob.Executor) error { - _, err := PublicreportQuickPhotos.Delete(dm.Where(o.pkEQ())).Exec(ctx, exec) - return err -} - -// Reload refreshes the PublicreportQuickPhoto using the executor -func (o *PublicreportQuickPhoto) Reload(ctx context.Context, exec bob.Executor) error { - o2, err := PublicreportQuickPhotos.Query( - sm.Where(PublicreportQuickPhotos.Columns.ID.EQ(psql.Arg(o.ID))), - ).One(ctx, exec) - if err != nil { - return err - } - o2.R = o.R - *o = *o2 - - return nil -} - -// AfterQueryHook is called after PublicreportQuickPhotoSlice is retrieved from the database -func (o PublicreportQuickPhotoSlice) AfterQueryHook(ctx context.Context, exec bob.Executor, queryType bob.QueryType) error { - var err error - - switch queryType { - case bob.QueryTypeSelect: - ctx, err = PublicreportQuickPhotos.AfterSelectHooks.RunHooks(ctx, exec, o) - case bob.QueryTypeInsert: - ctx, err = PublicreportQuickPhotos.AfterInsertHooks.RunHooks(ctx, exec, o) - case bob.QueryTypeUpdate: - ctx, err = PublicreportQuickPhotos.AfterUpdateHooks.RunHooks(ctx, exec, o) - case bob.QueryTypeDelete: - ctx, err = PublicreportQuickPhotos.AfterDeleteHooks.RunHooks(ctx, exec, o) - } - - return err -} - -func (o PublicreportQuickPhotoSlice) pkIN() dialect.Expression { - if len(o) == 0 { - return psql.Raw("NULL") - } - - return psql.Quote("publicreport.quick_photo", "id").In(bob.ExpressionFunc(func(ctx context.Context, w io.StringWriter, d bob.Dialect, start int) ([]any, error) { - pkPairs := make([]bob.Expression, len(o)) - for i, row := range o { - pkPairs[i] = row.primaryKeyVals() - } - return bob.ExpressSlice(ctx, w, d, start, pkPairs, "", ", ", "") - })) -} - -// copyMatchingRows finds models in the given slice that have the same primary key -// then it first copies the existing relationships from the old model to the new model -// and then replaces the old model in the slice with the new model -func (o PublicreportQuickPhotoSlice) copyMatchingRows(from ...*PublicreportQuickPhoto) { - for i, old := range o { - for _, new := range from { - if new.ID != old.ID { - continue - } - new.R = old.R - o[i] = new - break - } - } -} - -// UpdateMod modifies an update query with "WHERE primary_key IN (o...)" -func (o PublicreportQuickPhotoSlice) UpdateMod() bob.Mod[*dialect.UpdateQuery] { - return bob.ModFunc[*dialect.UpdateQuery](func(q *dialect.UpdateQuery) { - q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { - return PublicreportQuickPhotos.BeforeUpdateHooks.RunHooks(ctx, exec, o) - }) - - q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { - var err error - switch retrieved := retrieved.(type) { - case *PublicreportQuickPhoto: - o.copyMatchingRows(retrieved) - case []*PublicreportQuickPhoto: - o.copyMatchingRows(retrieved...) - case PublicreportQuickPhotoSlice: - o.copyMatchingRows(retrieved...) - default: - // If the retrieved value is not a PublicreportQuickPhoto or a slice of PublicreportQuickPhoto - // then run the AfterUpdateHooks on the slice - _, err = PublicreportQuickPhotos.AfterUpdateHooks.RunHooks(ctx, exec, o) - } - - return err - })) - - q.AppendWhere(o.pkIN()) - }) -} - -// DeleteMod modifies an delete query with "WHERE primary_key IN (o...)" -func (o PublicreportQuickPhotoSlice) DeleteMod() bob.Mod[*dialect.DeleteQuery] { - return bob.ModFunc[*dialect.DeleteQuery](func(q *dialect.DeleteQuery) { - q.AppendHooks(func(ctx context.Context, exec bob.Executor) (context.Context, error) { - return PublicreportQuickPhotos.BeforeDeleteHooks.RunHooks(ctx, exec, o) - }) - - q.AppendLoader(bob.LoaderFunc(func(ctx context.Context, exec bob.Executor, retrieved any) error { - var err error - switch retrieved := retrieved.(type) { - case *PublicreportQuickPhoto: - o.copyMatchingRows(retrieved) - case []*PublicreportQuickPhoto: - o.copyMatchingRows(retrieved...) - case PublicreportQuickPhotoSlice: - o.copyMatchingRows(retrieved...) - default: - // If the retrieved value is not a PublicreportQuickPhoto or a slice of PublicreportQuickPhoto - // then run the AfterDeleteHooks on the slice - _, err = PublicreportQuickPhotos.AfterDeleteHooks.RunHooks(ctx, exec, o) - } - - return err - })) - - q.AppendWhere(o.pkIN()) - }) -} - -func (o PublicreportQuickPhotoSlice) UpdateAll(ctx context.Context, exec bob.Executor, vals PublicreportQuickPhotoSetter) error { - if len(o) == 0 { - return nil - } - - _, err := PublicreportQuickPhotos.Update(vals.UpdateMod(), o.UpdateMod()).All(ctx, exec) - return err -} - -func (o PublicreportQuickPhotoSlice) DeleteAll(ctx context.Context, exec bob.Executor) error { - if len(o) == 0 { - return nil - } - - _, err := PublicreportQuickPhotos.Delete(o.DeleteMod()).Exec(ctx, exec) - return err -} - -func (o PublicreportQuickPhotoSlice) ReloadAll(ctx context.Context, exec bob.Executor) error { - if len(o) == 0 { - return nil - } - - o2, err := PublicreportQuickPhotos.Query(sm.Where(o.pkIN())).All(ctx, exec) - if err != nil { - return err - } - - o.copyMatchingRows(o2...) - - return nil -} - -// Quick starts a query for related objects on publicreport.quick -func (o *PublicreportQuickPhoto) Quick(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuicksQuery { - return PublicreportQuicks.Query(append(mods, - sm.Where(PublicreportQuicks.Columns.ID.EQ(psql.Arg(o.QuickID))), - )...) -} - -func (os PublicreportQuickPhotoSlice) Quick(mods ...bob.Mod[*dialect.SelectQuery]) PublicreportQuicksQuery { - pkQuickID := make(pgtypes.Array[int32], 0, len(os)) - for _, o := range os { - if o == nil { - continue - } - pkQuickID = append(pkQuickID, o.QuickID) - } - PKArgExpr := psql.Select(sm.Columns( - psql.F("unnest", psql.Cast(psql.Arg(pkQuickID), "integer[]")), - )) - - return PublicreportQuicks.Query(append(mods, - sm.Where(psql.Group(PublicreportQuicks.Columns.ID).OP("IN", PKArgExpr)), - )...) -} - -func attachPublicreportQuickPhotoQuick0(ctx context.Context, exec bob.Executor, count int, publicreportQuickPhoto0 *PublicreportQuickPhoto, publicreportQuick1 *PublicreportQuick) (*PublicreportQuickPhoto, error) { - setter := &PublicreportQuickPhotoSetter{ - QuickID: omit.From(publicreportQuick1.ID), - } - - err := publicreportQuickPhoto0.Update(ctx, exec, setter) - if err != nil { - return nil, fmt.Errorf("attachPublicreportQuickPhotoQuick0: %w", err) - } - - return publicreportQuickPhoto0, nil -} - -func (publicreportQuickPhoto0 *PublicreportQuickPhoto) InsertQuick(ctx context.Context, exec bob.Executor, related *PublicreportQuickSetter) error { - var err error - - publicreportQuick1, err := PublicreportQuicks.Insert(related).One(ctx, exec) - if err != nil { - return fmt.Errorf("inserting related objects: %w", err) - } - - _, err = attachPublicreportQuickPhotoQuick0(ctx, exec, 1, publicreportQuickPhoto0, publicreportQuick1) - if err != nil { - return err - } - - publicreportQuickPhoto0.R.Quick = publicreportQuick1 - - publicreportQuick1.R.QuickPhotos = append(publicreportQuick1.R.QuickPhotos, publicreportQuickPhoto0) - - return nil -} - -func (publicreportQuickPhoto0 *PublicreportQuickPhoto) AttachQuick(ctx context.Context, exec bob.Executor, publicreportQuick1 *PublicreportQuick) error { - var err error - - _, err = attachPublicreportQuickPhotoQuick0(ctx, exec, 1, publicreportQuickPhoto0, publicreportQuick1) - if err != nil { - return err - } - - publicreportQuickPhoto0.R.Quick = publicreportQuick1 - - publicreportQuick1.R.QuickPhotos = append(publicreportQuick1.R.QuickPhotos, publicreportQuickPhoto0) - - return nil -} - -type publicreportQuickPhotoWhere[Q psql.Filterable] struct { - ID psql.WhereMod[Q, int32] - Size psql.WhereMod[Q, int64] - Filename psql.WhereMod[Q, string] - QuickID psql.WhereMod[Q, int32] - UUID psql.WhereMod[Q, uuid.UUID] -} - -func (publicreportQuickPhotoWhere[Q]) AliasedAs(alias string) publicreportQuickPhotoWhere[Q] { - return buildPublicreportQuickPhotoWhere[Q](buildPublicreportQuickPhotoColumns(alias)) -} - -func buildPublicreportQuickPhotoWhere[Q psql.Filterable](cols publicreportQuickPhotoColumns) publicreportQuickPhotoWhere[Q] { - return publicreportQuickPhotoWhere[Q]{ - ID: psql.Where[Q, int32](cols.ID), - Size: psql.Where[Q, int64](cols.Size), - Filename: psql.Where[Q, string](cols.Filename), - QuickID: psql.Where[Q, int32](cols.QuickID), - UUID: psql.Where[Q, uuid.UUID](cols.UUID), - } -} - -func (o *PublicreportQuickPhoto) Preload(name string, retrieved any) error { - if o == nil { - return nil - } - - switch name { - case "Quick": - rel, ok := retrieved.(*PublicreportQuick) - if !ok { - return fmt.Errorf("publicreportQuickPhoto cannot load %T as %q", retrieved, name) - } - - o.R.Quick = rel - - if rel != nil { - rel.R.QuickPhotos = PublicreportQuickPhotoSlice{o} - } - return nil - default: - return fmt.Errorf("publicreportQuickPhoto has no relationship %q", name) - } -} - -type publicreportQuickPhotoPreloader struct { - Quick func(...psql.PreloadOption) psql.Preloader -} - -func buildPublicreportQuickPhotoPreloader() publicreportQuickPhotoPreloader { - return publicreportQuickPhotoPreloader{ - Quick: func(opts ...psql.PreloadOption) psql.Preloader { - return psql.Preload[*PublicreportQuick, PublicreportQuickSlice](psql.PreloadRel{ - Name: "Quick", - Sides: []psql.PreloadSide{ - { - From: PublicreportQuickPhotos, - To: PublicreportQuicks, - FromColumns: []string{"quick_id"}, - ToColumns: []string{"id"}, - }, - }, - }, PublicreportQuicks.Columns.Names(), opts...) - }, - } -} - -type publicreportQuickPhotoThenLoader[Q orm.Loadable] struct { - Quick func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q] -} - -func buildPublicreportQuickPhotoThenLoader[Q orm.Loadable]() publicreportQuickPhotoThenLoader[Q] { - type QuickLoadInterface interface { - LoadQuick(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error - } - - return publicreportQuickPhotoThenLoader[Q]{ - Quick: thenLoadBuilder[Q]( - "Quick", - func(ctx context.Context, exec bob.Executor, retrieved QuickLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error { - return retrieved.LoadQuick(ctx, exec, mods...) - }, - ), - } -} - -// LoadQuick loads the publicreportQuickPhoto's Quick into the .R struct -func (o *PublicreportQuickPhoto) LoadQuick(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { - if o == nil { - return nil - } - - // Reset the relationship - o.R.Quick = nil - - related, err := o.Quick(mods...).One(ctx, exec) - if err != nil { - return err - } - - related.R.QuickPhotos = PublicreportQuickPhotoSlice{o} - - o.R.Quick = related - return nil -} - -// LoadQuick loads the publicreportQuickPhoto's Quick into the .R struct -func (os PublicreportQuickPhotoSlice) LoadQuick(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error { - if len(os) == 0 { - return nil - } - - publicreportQuicks, err := os.Quick(mods...).All(ctx, exec) - if err != nil { - return err - } - - for _, o := range os { - if o == nil { - continue - } - - for _, rel := range publicreportQuicks { - - if !(o.QuickID == rel.ID) { - continue - } - - rel.R.QuickPhotos = append(rel.R.QuickPhotos, o) - - o.R.Quick = rel - break - } - } - - return nil -} - -type publicreportQuickPhotoJoins[Q dialect.Joinable] struct { - typ string - Quick modAs[Q, publicreportQuickColumns] -} - -func (j publicreportQuickPhotoJoins[Q]) aliasedAs(alias string) publicreportQuickPhotoJoins[Q] { - return buildPublicreportQuickPhotoJoins[Q](buildPublicreportQuickPhotoColumns(alias), j.typ) -} - -func buildPublicreportQuickPhotoJoins[Q dialect.Joinable](cols publicreportQuickPhotoColumns, typ string) publicreportQuickPhotoJoins[Q] { - return publicreportQuickPhotoJoins[Q]{ - typ: typ, - Quick: modAs[Q, publicreportQuickColumns]{ - c: PublicreportQuicks.Columns, - f: func(to publicreportQuickColumns) bob.Mod[Q] { - mods := make(mods.QueryMods[Q], 0, 1) - - { - mods = append(mods, dialect.Join[Q](typ, PublicreportQuicks.Name().As(to.Alias())).On( - to.ID.EQ(cols.QuickID), - )) - } - - return mods - }, - }, - } -} diff --git a/go.mod b/go.mod index 85d2a31f..ef56dc10 100644 --- a/go.mod +++ b/go.mod @@ -33,8 +33,17 @@ require ( require ( github.com/ajg/form v1.5.1 // indirect + github.com/dsoprea/go-exif/v3 v3.0.1 // indirect + github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb // indirect + github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20221012074422-4f3f7e934102 // indirect + github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect + github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect + github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/go-errors/errors v1.4.2 // indirect github.com/go-ini/ini v1.67.0 // indirect + github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect + github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect @@ -67,5 +76,6 @@ require ( golang.org/x/sys v0.36.0 // indirect golang.org/x/text v0.29.0 // indirect google.golang.org/protobuf v1.36.5 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 2b5f8289..c6543560 100644 --- a/go.sum +++ b/go.sum @@ -43,6 +43,31 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E= +github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8= +github.com/dsoprea/go-exif/v3 v3.0.0-20210428042052-dca55bf8ca15/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= +github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk= +github.com/dsoprea/go-exif/v3 v3.0.0-20221003160559-cf5cd88aa559/go.mod h1:rW6DMEv25U9zCtE5ukC7ttBRllXj7g7TAHl7tQrT5No= +github.com/dsoprea/go-exif/v3 v3.0.0-20221003171958-de6cb6e380a8/go.mod h1:akyZEJZ/k5bmbC9gA612ZLQkcED8enS9vuTiuAkENr0= +github.com/dsoprea/go-exif/v3 v3.0.1 h1:/IE4iW7gvY7BablV1XY0unqhMv26EYpOquVMwoBo/wc= +github.com/dsoprea/go-exif/v3 v3.0.1/go.mod h1:10HkA1Wz3h398cDP66L+Is9kKDmlqlIJGPv8pk4EWvc= +github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb h1:gwjJjUr6FY7zAWVEueFPrcRHhd9+IK81TcItbqw2du4= +github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= +github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20221012074422-4f3f7e934102 h1:gmTXQdSuuuORRFPTS2uaYpAXU5oUNkXdeYSlZe5NvsE= +github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20221012074422-4f3f7e934102/go.mod h1:WaARaUjQuSuDCDFAiU/GwzfxMTJBulfEhqEA2Tx6B4Y= +github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA= +github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= +github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg= +github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= +github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c h1:7j5aWACOzROpr+dvMtu8GnI97g9ShLWD72XIELMgn+c= +github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E= +github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf h1:/w4QxepU4AHh3AuO6/g8y/YIIHH5+aKP3Bj8sg5cqhU= +github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8= +github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003142440-7a1927d49d9d/go.mod h1:LVjRU0RNUuMDqkPTxcALio0LWPFPXxxFCvVGVAwEpFc= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003160719-7bc88537c05e/go.mod h1:VZ7cB0pTjm1ADBWhJUOHESu4ZYy9JN+ZPqjfiW09EPU= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 h1:DilThiXje0z+3UQ5YjYiSRRzVdtamFpvBQXKwMglWqw= +github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349/go.mod h1:4GC5sXji84i/p+irqghpPFZBF8tRN/Q7+700G0/DLe8= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= @@ -56,6 +81,11 @@ github.com/go-chi/hostrouter v0.3.0 h1:75it1eO3FvkG8te1CvU6Kvr3WzAZNEBbo8xIrxUKL github.com/go-chi/hostrouter v0.3.0/go.mod h1:KLB+7PH/ceOr6FCmMyWD2Dmql/clpOe+y7I7CUeTkaQ= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= +github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= @@ -64,11 +94,17 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0= github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= +github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -88,6 +124,8 @@ github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jaswdr/faker/v2 v2.8.1 h1:2AcPgHDBXYQregFUH9LgVZKfFupc4SIquYhp29sf5wQ= github.com/jaswdr/faker/v2 v2.8.1/go.mod h1:jZq+qzNQr8/P+5fHd9t3txe2GNPnthrTfohtnJ7B+68= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -247,6 +285,7 @@ go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXe go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= @@ -255,9 +294,16 @@ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/y golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= @@ -268,11 +314,16 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -309,6 +360,10 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/public-report/image-upload.go b/public-report/image-upload.go new file mode 100644 index 00000000..ea40a0cd --- /dev/null +++ b/public-report/image-upload.go @@ -0,0 +1,182 @@ +package publicreport + +import ( + "bytes" + "context" + "fmt" + "image" + _ "image/gif" // register GIF format + _ "image/jpeg" // register JPEG format + _ "image/png" // register PNG format + "io" + "mime/multipart" + "net/http" + "time" + + "github.com/aarondl/opt/omit" + "github.com/dsoprea/go-exif/v3" + exifcommon "github.com/dsoprea/go-exif/v3/common" + //"github.com/dsoprea/go-jpeg-image-structure/v2" + "github.com/Gleipnir-Technology/nidus-sync/db/models" + "github.com/Gleipnir-Technology/nidus-sync/userfile" + "github.com/google/uuid" + "github.com/rs/zerolog/log" + "github.com/stephenafamo/bob" + "github.com/stephenafamo/bob/dialect/psql" + "github.com/stephenafamo/bob/dialect/psql/um" +) + +type ExifCollection struct { + GPS *exif.GpsInfo + Tags map[string]string +} + +type ImageUpload struct { + Bounds image.Rectangle + ContentType string + Exif ExifCollection + Format string + + UploadFilesize int + UploadFilename string + UUID uuid.UUID +} + +func extractExif(file_bytes []byte) (result ExifCollection, err error) { + + raw_exif, err := exif.SearchAndExtractExifWithReader(bytes.NewReader(file_bytes)) + if err != nil { + return result, fmt.Errorf("Failed to find exif: %w", err) + } + im, err := exifcommon.NewIfdMappingWithStandard() + if err != nil { + return result, fmt.Errorf("Failed to create new idf mapping: %w", err) + } + ti := exif.NewTagIndex() + _, index, err := exif.Collect(im, ti, raw_exif) + if err != nil { + return result, fmt.Errorf("Failed to collect exif: %w", err) + } + ifd, err := index.RootIfd.ChildWithIfdPath(exifcommon.IfdGpsInfoStandardIfdIdentity) + if err != nil { + return result, fmt.Errorf("Failed to find gps exif: %w", err) + } + gi, err := ifd.GpsInfo() + if err != nil { + log.Info().Err(err).Msg("Failed to get GPS info for uploaded image") + result.GPS = nil + } else { + result.GPS = gi + } + result.Tags = make(map[string]string, 0) + + tags, _, err := exif.GetFlatExifData(raw_exif, &exif.ScanOptions{}) + if err != nil { + return result, fmt.Errorf("Failed to gather flat exif: %w", err) + } + for _, t := range tags { + result.Tags[t.TagName] = t.Formatted + } + log.Info().Str("GPS", fmt.Sprintf("%s", gi)).Int("count", len(result.Tags)).Msg("Extracted exif tags") + return result, nil +} + +func extractImageUpload(headers *multipart.FileHeader) (upload ImageUpload, err error) { + file, err := headers.Open() + if err != nil { + return upload, fmt.Errorf("Failed to open header: %w", err) + } + defer file.Close() + + file_bytes, err := io.ReadAll(file) + content_type := http.DetectContentType(file_bytes) + + exif, err := extractExif(file_bytes) + if err != nil { + //return upload, fmt.Errorf("Failed to extract EXIF data: %w", err) + log.Warn().Err(err).Msg("Failed to extract EXIF data") + } + + i, format, err := image.Decode(bytes.NewReader(file_bytes)) + if err != nil { + return upload, fmt.Errorf("Failed to decode image file: %w", err) + } + + u, err := uuid.NewUUID() + if err != nil { + return upload, fmt.Errorf("Failed to create quick report photo uuid", err) + } + err = userfile.PublicImageFileContentWrite(u, bytes.NewReader(file_bytes)) + if err != nil { + return upload, fmt.Errorf("Failed to write image file to disk: %w", err) + } + log.Info().Int("size", len(file_bytes)).Str("uploaded_filename", headers.Filename).Str("content-type", content_type).Str("uuid", u.String()).Msg("Saved an uploaded file to disk") + return ImageUpload{ + Bounds: i.Bounds(), + ContentType: content_type, + Exif: exif, + Format: format, + UploadFilename: headers.Filename, + UploadFilesize: len(file_bytes), + UUID: u, + }, nil +} + +func extractImageUploads(r *http.Request) (uploads []ImageUpload, err error) { + uploads = make([]ImageUpload, 0) + for _, fheaders := range r.MultipartForm.File { + for _, headers := range fheaders { + upload, err := extractImageUpload(headers) + if err != nil { + return make([]ImageUpload, 0), fmt.Errorf("Failed to extract photo upload: %w", err) + } + uploads = append(uploads, upload) + } + } + return uploads, nil +} + +func saveImageUploads(ctx context.Context, tx bob.Tx, uploads []ImageUpload) (models.PublicreportImageSlice, error) { + images := make(models.PublicreportImageSlice, 0) + for _, u := range uploads { + image, err := models.PublicreportImages.Insert(&models.PublicreportImageSetter{ + ContentType: omit.From(u.ContentType), + + Created: omit.From(time.Now()), + //Location: omitnull.From(nil), + ResolutionX: omit.From(int32(u.Bounds.Max.X)), + ResolutionY: omit.From(int32(u.Bounds.Max.Y)), + StorageUUID: omit.From(u.UUID), + StorageSize: omit.From(int64(u.UploadFilesize)), + UploadedFilename: omit.From(u.UploadFilename), + }).One(ctx, tx) + if err != nil { + return images, fmt.Errorf("Failed to create photo records: %w", err) + } + + // TODO: figure out how to do this via the setter...? + 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.Decimal(), u.Exif.GPS.Latitude.Decimal())), + um.Where(psql.Quote("id").EQ(psql.Arg(image.ID))), + ).Exec(ctx, tx) + } + + exif_setters := make([]*models.PublicreportImageExifSetter, 0) + for k, v := range u.Exif.Tags { + exif_setters = append(exif_setters, &models.PublicreportImageExifSetter{ + ImageID: omit.From(image.ID), + Name: omit.From(k), + Value: omit.From(v), + }) + } + _, err = models.PublicreportImageExifs.Insert(bob.ToMods(exif_setters...)).Exec(ctx, tx) + if err != nil { + return images, fmt.Errorf("Failed to create photo exif records: %w", err) + } + images = append(images, image) + log.Info().Int32("id", image.ID).Int("tags", len(u.Exif.Tags)).Msg("Saved an uploaded file to the database") + } + return images, nil +} diff --git a/public-report/photo-upload.go b/public-report/photo-upload.go deleted file mode 100644 index 6d40946f..00000000 --- a/public-report/photo-upload.go +++ /dev/null @@ -1,59 +0,0 @@ -package publicreport - -import ( - "bytes" - "fmt" - "net/http" - - "github.com/Gleipnir-Technology/nidus-sync/userfile" - "github.com/google/uuid" - "github.com/rs/zerolog/log" -) - -type PhotoUpload struct { - Filename string - Size int64 - UUID uuid.UUID -} - -func extractPhotoUploads(r *http.Request) (uploads []PhotoUpload, err error) { - uploads = make([]PhotoUpload, 0) - for _, fheaders := range r.MultipartForm.File { - for _, headers := range fheaders { - file, err := headers.Open() - - if err != nil { - return uploads, fmt.Errorf("Failed to open header: %v", err) - } - - defer file.Close() - - buff := make([]byte, 512) - file.Read(buff) - - file.Seek(0, 0) - contentType := http.DetectContentType(buff) - var sizeBuff bytes.Buffer - fileSize, err := sizeBuff.ReadFrom(file) - if err != nil { - return uploads, fmt.Errorf("Failed to read file: %v", err) - } - file.Seek(0, 0) - log.Info().Int64("size", fileSize).Str("filename", headers.Filename).Str("content-type", contentType).Msg("Got an uploaded file") - u, err := uuid.NewUUID() - if err != nil { - return uploads, fmt.Errorf("Failed to create quick report photo uuid", err) - } - err = userfile.PublicImageFileContentWrite(u, file) - if err != nil { - return uploads, fmt.Errorf("Failed to write image file to disk: %v", err) - } - uploads = append(uploads, PhotoUpload{ - Size: fileSize, - Filename: headers.Filename, - UUID: u, - }) - } - } - return uploads, nil -} diff --git a/public-report/pool.go b/public-report/pool.go index 5f5d5004..6872c8a7 100644 --- a/public-report/pool.go +++ b/public-report/pool.go @@ -13,6 +13,7 @@ import ( "github.com/Gleipnir-Technology/nidus-sync/htmlpage" "github.com/aarondl/opt/omit" "github.com/rs/zerolog/log" + "github.com/stephenafamo/bob" "github.com/stephenafamo/bob/dialect/psql" "github.com/stephenafamo/bob/dialect/psql/um" ) @@ -90,6 +91,14 @@ func postPool(w http.ResponseWriter, r *http.Request) { return } + ctx := r.Context() + tx, err := db.PGInstance.BobDB.BeginTx(ctx, nil) + if err != nil { + respondError(w, "Failed to create transaction", err, http.StatusInternalServerError) + return + } + defer tx.Rollback(ctx) + setter := models.PublicreportPoolSetter{ AccessComments: omit.From(access_comments), AccessGate: omit.From(access_gate), @@ -121,7 +130,7 @@ func postPool(w http.ResponseWriter, r *http.Request) { Status: omit.From(enums.PublicreportReportstatustypeReported), Subscribe: omit.From(subscribe), } - pool, err := models.PublicreportPools.Insert(&setter).One(r.Context(), db.PGInstance.BobDB) + pool, err := models.PublicreportPools.Insert(&setter).One(ctx, tx) if err != nil { respondError(w, "Failed to create database record", err, http.StatusInternalServerError) return @@ -138,30 +147,31 @@ func postPool(w http.ResponseWriter, r *http.Request) { um.SetCol("h3cell").ToArg(geospatial.Cell), um.SetCol("location").To(geospatial.GeometryQuery), um.Where(psql.Quote("id").EQ(psql.Arg(pool.ID))), - ).Exec(r.Context(), db.PGInstance.BobDB) + ).Exec(ctx, tx) if err != nil { respondError(w, "Failed to insert publicreport.pool", err, http.StatusInternalServerError) return } } log.Info().Int32("id", pool.ID).Str("public_id", pool.PublicID).Msg("Created pool report") - photoSetters := make([]*models.PublicreportPoolPhotoSetter, 0) - uploads, err := extractPhotoUploads(r) + uploads, err := extractImageUploads(r) if err != nil { - respondError(w, "Failed to extract photo uploads", err, http.StatusInternalServerError) + respondError(w, "Failed to extract image uploads", err, http.StatusInternalServerError) return } - for _, u := range uploads { - photoSetters = append(photoSetters, &models.PublicreportPoolPhotoSetter{ - Filename: omit.From(u.Filename), - Size: omit.From(u.Size), - UUID: omit.From(u.UUID), + images, err := saveImageUploads(r.Context(), tx, uploads) + setters := make([]*models.PublicreportPoolImageSetter, 0) + for _, image := range images { + setters = append(setters, &models.PublicreportPoolImageSetter{ + ImageID: omit.From(int32(image.ID)), + PoolID: omit.From(int32(pool.ID)), }) } - err = pool.InsertPoolPhotos(r.Context(), db.PGInstance.BobDB, photoSetters...) + _, err = models.PublicreportPoolImages.Insert(bob.ToMods(setters...)).Exec(r.Context(), tx) if err != nil { - respondError(w, "Failed to create photo records", err, http.StatusInternalServerError) + respondError(w, "Failed to save upload relationships", err, http.StatusInternalServerError) return } + tx.Commit(ctx) http.Redirect(w, r, fmt.Sprintf("/pool-submit-complete?report=%s", public_id), http.StatusFound) } diff --git a/public-report/quick.go b/public-report/quick.go index 1509df56..e076d425 100644 --- a/public-report/quick.go +++ b/public-report/quick.go @@ -14,6 +14,7 @@ import ( "github.com/aarondl/opt/omit" "github.com/aarondl/opt/omitnull" "github.com/rs/zerolog/log" + "github.com/stephenafamo/bob" "github.com/stephenafamo/bob/dialect/psql" "github.com/stephenafamo/bob/dialect/psql/um" ) @@ -70,6 +71,14 @@ func postQuick(w http.ResponseWriter, r *http.Request) { respondError(w, "Failed to create quick report public ID", err, http.StatusInternalServerError) return } + ctx := r.Context() + tx, err := db.PGInstance.BobDB.BeginTx(ctx, nil) + if err != nil { + respondError(w, "Failed to create transaction", err, http.StatusInternalServerError) + return + } + defer tx.Rollback(ctx) + c, err := h3utils.GetCell(longitude, latitude, 15) setter := models.PublicreportQuickSetter{ Address: omit.From(""), @@ -82,7 +91,7 @@ func postQuick(w http.ResponseWriter, r *http.Request) { ReporterPhone: omit.From(""), Status: omit.From(enums.PublicreportReportstatustypeReported), } - quick, err := models.PublicreportQuicks.Insert(&setter).One(r.Context(), db.PGInstance.BobDB) + quick, err := models.PublicreportQuicks.Insert(&setter).One(ctx, tx) if err != nil { respondError(w, "Failed to create database record", err, http.StatusInternalServerError) return @@ -91,29 +100,37 @@ func postQuick(w http.ResponseWriter, r *http.Request) { um.Table("publicreport.quick"), um.SetCol("location").To(fmt.Sprintf("ST_GeometryFromText('Point(%f %f)')", longitude, latitude)), um.Where(psql.Quote("id").EQ(psql.Arg(quick.ID))), - ).Exec(r.Context(), db.PGInstance.BobDB) + ).Exec(ctx, tx) if err != nil { respondError(w, "Failed to insert publicreport", err, http.StatusInternalServerError) return } log.Info().Float64("latitude", latitude).Float64("longitude", longitude).Msg("Got upload") - photoSetters := make([]*models.PublicreportQuickPhotoSetter, 0) - uploads, err := extractPhotoUploads(r) + uploads, err := extractImageUploads(r) + log.Info().Int("len", len(uploads)).Msg("extracted uploads") if err != nil { - respondError(w, "Failed to extract photo uploads", err, http.StatusInternalServerError) + respondError(w, "Failed to extract image uploads", err, http.StatusInternalServerError) return } - for _, u := range uploads { - photoSetters = append(photoSetters, &models.PublicreportQuickPhotoSetter{ - Filename: omit.From(u.Filename), - Size: omit.From(u.Size), - UUID: omit.From(u.UUID), + images, err := saveImageUploads(ctx, tx, uploads) + if err != nil { + respondError(w, "Failed to save image uploads", err, http.StatusInternalServerError) + return + } + log.Info().Int("len", len(images)).Msg("saved uploads") + setters := make([]*models.PublicreportQuickImageSetter, 0) + for _, image := range images { + setters = append(setters, &models.PublicreportQuickImageSetter{ + ImageID: omit.From(int32(image.ID)), + QuickID: omit.From(int32(quick.ID)), }) } - err = quick.InsertQuickPhotos(r.Context(), db.PGInstance.BobDB, photoSetters...) + _, err = models.PublicreportQuickImages.Insert(bob.ToMods(setters...)).Exec(ctx, tx) if err != nil { - respondError(w, "Failed to create photo records", err, http.StatusInternalServerError) + respondError(w, "Failed to save reference to images", err, http.StatusInternalServerError) return } + log.Info().Int("len", len(images)).Msg("saved uploads") + tx.Commit(ctx) http.Redirect(w, r, fmt.Sprintf("/quick-submit-complete?report=%s", u), http.StatusFound) } diff --git a/userfile/userfile.go b/userfile/userfile.go index 2608d975..794450e0 100644 --- a/userfile/userfile.go +++ b/userfile/userfile.go @@ -3,11 +3,11 @@ package userfile import ( "fmt" "io" - "log" "os" "github.com/Gleipnir-Technology/nidus-sync/config" "github.com/google/uuid" + "github.com/rs/zerolog/log" ) func AudioFileContentPathRaw(audioUUID string) string { @@ -27,7 +27,7 @@ func AudioFileContentWrite(audioUUID uuid.UUID, body io.Reader) error { filepath := AudioFileContentPathRaw(audioUUID.String()) dst, err := os.Create(filepath) if err != nil { - log.Printf("Failed to create audio file at %s: %v\n", filepath, err) + log.Error().Err(err).Str("filepath", filepath).Msg("Failed to create audio file") return fmt.Errorf("Failed to create audio file at %s: %v", filepath, err) } defer dst.Close() @@ -37,7 +37,7 @@ func AudioFileContentWrite(audioUUID uuid.UUID, body io.Reader) error { if err != nil { return fmt.Errorf("Unable to save file to create audio file at %s: %v", filepath, err) } - log.Printf("Saved audio content to %s\n", filepath) + log.Info().Str("filepath", filepath).Msg("Save audio file content") return nil } func ImageFileContentPathRaw(uid string) string { @@ -65,7 +65,7 @@ func PublicImageFileContentWrite(uid uuid.UUID, body io.Reader) error { filepath := PublicImageFileContentPathRaw(uid.String()) dst, err := os.Create(filepath) if err != nil { - log.Printf("Failed to create public image file at %s: %v\n", filepath, err) + log.Error().Err(err).Str("filepath", filepath).Msg("Failed to create public image file") return fmt.Errorf("Failed to create public image file at %s: %v", filepath, err) } defer dst.Close() @@ -75,7 +75,7 @@ func PublicImageFileContentWrite(uid uuid.UUID, body io.Reader) error { if err != nil { return fmt.Errorf("Unable to save file to create audio file at %s: %v", filepath, err) } - log.Printf("Saved audio content to %s\n", filepath) + log.Info().Str("filepath", filepath).Msg("Saved public report image file content") return nil } func PublicImageFileContentPathRaw(uid string) string {