Split out ability to upload flyover data from pool uploads
Tons of changes here, all in the name of quickly getting to where I can create test compliance letters.
This commit is contained in:
parent
9939434cb3
commit
ff2ec0ad14
38 changed files with 4204 additions and 233 deletions
|
|
@ -5,14 +5,17 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/Gleipnir-Technology/bob"
|
||||||
|
"github.com/Gleipnir-Technology/bob/dialect/psql"
|
||||||
|
"github.com/Gleipnir-Technology/bob/dialect/psql/sm"
|
||||||
commsemail "github.com/Gleipnir-Technology/nidus-sync/comms/email"
|
commsemail "github.com/Gleipnir-Technology/nidus-sync/comms/email"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/config"
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/db"
|
"github.com/Gleipnir-Technology/nidus-sync/db"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/platform/email"
|
"github.com/Gleipnir-Technology/nidus-sync/platform/email"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/platform/text"
|
"github.com/Gleipnir-Technology/nidus-sync/platform/text"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
|
"github.com/stephenafamo/scan"
|
||||||
)
|
)
|
||||||
|
|
||||||
var waitGroup sync.WaitGroup
|
var waitGroup sync.WaitGroup
|
||||||
|
|
@ -20,10 +23,10 @@ var waitGroup sync.WaitGroup
|
||||||
func Start(ctx context.Context) {
|
func Start(ctx context.Context) {
|
||||||
newOAuthTokenChannel = make(chan struct{}, 10)
|
newOAuthTokenChannel = make(chan struct{}, 10)
|
||||||
|
|
||||||
channelJobAudio = make(chan jobAudio, 100) // Buffered channel to prevent blocking
|
channelJobAudio = make(chan jobAudio, 100) // Buffered channel to prevent blocking
|
||||||
channelJobImportCSVPool = make(chan jobImportCSVPool, 100) // Buffered channel to prevent blocking
|
channelJobImportCSV = make(chan jobImportCSV, 100) // Buffered channel to prevent blocking
|
||||||
channelJobEmail = make(chan email.Job, 100) // Buffered channel to prevent blocking
|
channelJobEmail = make(chan email.Job, 100) // Buffered channel to prevent blocking
|
||||||
channelJobText = make(chan text.Job, 100) // Buffered channel to prevent blocking
|
channelJobText = make(chan text.Job, 100) // Buffered channel to prevent blocking
|
||||||
|
|
||||||
waitGroup.Add(1)
|
waitGroup.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
|
|
@ -46,7 +49,7 @@ func Start(ctx context.Context) {
|
||||||
waitGroup.Add(1)
|
waitGroup.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
defer waitGroup.Done()
|
defer waitGroup.Done()
|
||||||
startWorkerCSV(ctx, channelJobImportCSVPool)
|
startWorkerCSV(ctx, channelJobImportCSV)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
waitGroup.Add(1)
|
waitGroup.Add(1)
|
||||||
|
|
@ -73,21 +76,33 @@ func WaitForExit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func addWaitingJobs(ctx context.Context) error {
|
func addWaitingJobs(ctx context.Context) error {
|
||||||
rows, err := models.FileuploadFiles.Query(
|
type Row_ struct {
|
||||||
models.SelectWhere.FileuploadFiles.Status.EQ(
|
ID int32 `db:"id"`
|
||||||
enums.FileuploadFilestatustypeUploaded,
|
Type enums.FileuploadCsvtype `db:"type"`
|
||||||
|
}
|
||||||
|
rows, err := bob.All(ctx, db.PGInstance.BobDB, psql.Select(
|
||||||
|
sm.Columns(
|
||||||
|
"file.id AS id",
|
||||||
|
"csv.type_ AS type",
|
||||||
),
|
),
|
||||||
).All(ctx, db.PGInstance.BobDB)
|
sm.From("fileupload.file").As("file"),
|
||||||
|
sm.InnerJoin("fileupload.csv").As("csv").OnEQ(psql.Raw("file.id"), psql.Raw("csv.file_id")),
|
||||||
|
sm.Where(
|
||||||
|
psql.Raw("file.status").EQ(psql.Arg(enums.FileuploadFilestatustypeUploaded)),
|
||||||
|
),
|
||||||
|
), scan.StructMapper[Row_]())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to query file uploads: %w", err)
|
return fmt.Errorf("Failed to query file uploads: %w", err)
|
||||||
}
|
}
|
||||||
for _, row := range rows {
|
for _, row := range rows {
|
||||||
report_id := row.ID
|
report_id := row.ID
|
||||||
job := jobImportCSVPool{
|
job := jobImportCSV{
|
||||||
fileID: report_id,
|
fileID: report_id,
|
||||||
|
type_: row.Type,
|
||||||
}
|
}
|
||||||
select {
|
select {
|
||||||
case channelJobImportCSVPool <- job:
|
case channelJobImportCSV <- job:
|
||||||
log.Info().Int32("report_id", report_id).Msg("CSV upload job queued")
|
log.Info().Int32("report_id", report_id).Msg("CSV upload job queued")
|
||||||
default:
|
default:
|
||||||
log.Warn().Int32("report_id", report_id).Msg("CSV upload job failed to queue, channel full")
|
log.Warn().Int32("report_id", report_id).Msg("CSV upload job failed to queue, channel full")
|
||||||
|
|
|
||||||
|
|
@ -4,34 +4,36 @@ import (
|
||||||
"context"
|
"context"
|
||||||
//"fmt"
|
//"fmt"
|
||||||
|
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/platform/csv"
|
"github.com/Gleipnir-Technology/nidus-sync/platform/csv"
|
||||||
//"github.com/Gleipnir-Technology/nidus-sync/userfile"
|
//"github.com/Gleipnir-Technology/nidus-sync/userfile"
|
||||||
//"github.com/google/uuid"
|
//"github.com/google/uuid"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
// represents a job to import a pool CSV file
|
type jobImportCSV struct {
|
||||||
type jobImportCSVPool struct {
|
|
||||||
fileID int32
|
fileID int32
|
||||||
|
type_ enums.FileuploadCsvtype
|
||||||
}
|
}
|
||||||
|
|
||||||
var channelJobImportCSVPool chan jobImportCSVPool
|
var channelJobImportCSV chan jobImportCSV
|
||||||
|
|
||||||
func ProcessUpload(file_id int32) {
|
func ProcessUpload(file_id int32, t enums.FileuploadCsvtype) {
|
||||||
enqueueUploadJob(jobImportCSVPool{
|
enqueueUploadJob(jobImportCSV{
|
||||||
fileID: file_id,
|
fileID: file_id,
|
||||||
|
type_: t,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func enqueueUploadJob(job jobImportCSVPool) {
|
func enqueueUploadJob(job jobImportCSV) {
|
||||||
select {
|
select {
|
||||||
case channelJobImportCSVPool <- job:
|
case channelJobImportCSV <- job:
|
||||||
log.Info().Int32("file_id", job.fileID).Msg("Enqueued csv job")
|
log.Info().Int32("file_id", job.fileID).Msg("Enqueued csv job")
|
||||||
default:
|
default:
|
||||||
log.Warn().Int32("file_id", job.fileID).Msg("csv channel is full, dropping job")
|
log.Warn().Int32("file_id", job.fileID).Msg("csv channel is full, dropping job")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func startWorkerCSV(ctx context.Context, channelJobImport chan jobImportCSVPool) {
|
func startWorkerCSV(ctx context.Context, channelJobImport chan jobImportCSV) {
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|
@ -40,7 +42,7 @@ func startWorkerCSV(ctx context.Context, channelJobImport chan jobImportCSVPool)
|
||||||
return
|
return
|
||||||
case job := <-channelJobImport:
|
case job := <-channelJobImport:
|
||||||
log.Info().Int32("id", job.fileID).Msg("Processing CSV job")
|
log.Info().Int32("id", job.fileID).Msg("Processing CSV job")
|
||||||
err := csv.ProcessJob(ctx, job.fileID)
|
err := csv.ProcessJob(ctx, job.fileID, job.type_)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Int32("id", job.fileID).Msg("Error processing CSV file")
|
log.Error().Err(err).Int32("id", job.fileID).Msg("Error processing CSV file")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
17
db/dberrors/fileupload.flyover_aerial_service.bob.go
Normal file
17
db/dberrors/fileupload.flyover_aerial_service.bob.go
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
|
||||||
|
// This file is meant to be re-generated in place and/or deleted at any time.
|
||||||
|
|
||||||
|
package dberrors
|
||||||
|
|
||||||
|
var FileuploadFlyoverAerialServiceErrors = &fileuploadFlyoverAerialServiceErrors{
|
||||||
|
ErrUniqueFlyoverAerialServicePkey: &UniqueConstraintError{
|
||||||
|
schema: "fileupload",
|
||||||
|
table: "flyover_aerial_service",
|
||||||
|
columns: []string{"id"},
|
||||||
|
s: "flyover_aerial_service_pkey",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceErrors struct {
|
||||||
|
ErrUniqueFlyoverAerialServicePkey *UniqueConstraintError
|
||||||
|
}
|
||||||
217
db/dbinfo/fileupload.flyover_aerial_service.bob.go
Normal file
217
db/dbinfo/fileupload.flyover_aerial_service.bob.go
Normal file
|
|
@ -0,0 +1,217 @@
|
||||||
|
// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
|
||||||
|
// This file is meant to be re-generated in place and/or deleted at any time.
|
||||||
|
|
||||||
|
package dbinfo
|
||||||
|
|
||||||
|
import "github.com/aarondl/opt/null"
|
||||||
|
|
||||||
|
var FileuploadFlyoverAerialServices = Table[
|
||||||
|
fileuploadFlyoverAerialServiceColumns,
|
||||||
|
fileuploadFlyoverAerialServiceIndexes,
|
||||||
|
fileuploadFlyoverAerialServiceForeignKeys,
|
||||||
|
fileuploadFlyoverAerialServiceUniques,
|
||||||
|
fileuploadFlyoverAerialServiceChecks,
|
||||||
|
]{
|
||||||
|
Schema: "fileupload",
|
||||||
|
Name: "flyover_aerial_service",
|
||||||
|
Columns: fileuploadFlyoverAerialServiceColumns{
|
||||||
|
Committed: column{
|
||||||
|
Name: "committed",
|
||||||
|
DBType: "boolean",
|
||||||
|
Default: "",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: false,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
Condition: column{
|
||||||
|
Name: "condition",
|
||||||
|
DBType: "fileupload.poolconditiontype",
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
CreatorID: column{
|
||||||
|
Name: "creator_id",
|
||||||
|
DBType: "integer",
|
||||||
|
Default: "",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: false,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
CSVFile: column{
|
||||||
|
Name: "csv_file",
|
||||||
|
DBType: "integer",
|
||||||
|
Default: "",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: false,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
Deleted: column{
|
||||||
|
Name: "deleted",
|
||||||
|
DBType: "timestamp without time zone",
|
||||||
|
Default: "NULL",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: true,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
Geom: column{
|
||||||
|
Name: "geom",
|
||||||
|
DBType: "geometry",
|
||||||
|
Default: "NULL",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: true,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
H3cell: column{
|
||||||
|
Name: "h3cell",
|
||||||
|
DBType: "h3index",
|
||||||
|
Default: "NULL",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: true,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
ID: column{
|
||||||
|
Name: "id",
|
||||||
|
DBType: "integer",
|
||||||
|
Default: "nextval('fileupload.flyover_aerial_service_id_seq'::regclass)",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: false,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
OrganizationID: column{
|
||||||
|
Name: "organization_id",
|
||||||
|
DBType: "integer",
|
||||||
|
Default: "",
|
||||||
|
Comment: "",
|
||||||
|
Nullable: false,
|
||||||
|
Generated: false,
|
||||||
|
AutoIncr: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Indexes: fileuploadFlyoverAerialServiceIndexes{
|
||||||
|
FlyoverAerialServicePkey: index{
|
||||||
|
Type: "btree",
|
||||||
|
Name: "flyover_aerial_service_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: "flyover_aerial_service_pkey",
|
||||||
|
Columns: []string{"id"},
|
||||||
|
Comment: "",
|
||||||
|
},
|
||||||
|
ForeignKeys: fileuploadFlyoverAerialServiceForeignKeys{
|
||||||
|
FileuploadFlyoverAerialServiceFlyoverAerialServiceCreatorIDFkey: foreignKey{
|
||||||
|
constraint: constraint{
|
||||||
|
Name: "fileupload.flyover_aerial_service.flyover_aerial_service_creator_id_fkey",
|
||||||
|
Columns: []string{"creator_id"},
|
||||||
|
Comment: "",
|
||||||
|
},
|
||||||
|
ForeignTable: "user_",
|
||||||
|
ForeignColumns: []string{"id"},
|
||||||
|
},
|
||||||
|
FileuploadFlyoverAerialServiceFlyoverAerialServiceCSVFileFkey: foreignKey{
|
||||||
|
constraint: constraint{
|
||||||
|
Name: "fileupload.flyover_aerial_service.flyover_aerial_service_csv_file_fkey",
|
||||||
|
Columns: []string{"csv_file"},
|
||||||
|
Comment: "",
|
||||||
|
},
|
||||||
|
ForeignTable: "fileupload.csv",
|
||||||
|
ForeignColumns: []string{"file_id"},
|
||||||
|
},
|
||||||
|
FileuploadFlyoverAerialServiceFlyoverAerialServiceOrganizationIDFkey: foreignKey{
|
||||||
|
constraint: constraint{
|
||||||
|
Name: "fileupload.flyover_aerial_service.flyover_aerial_service_organization_id_fkey",
|
||||||
|
Columns: []string{"organization_id"},
|
||||||
|
Comment: "",
|
||||||
|
},
|
||||||
|
ForeignTable: "organization",
|
||||||
|
ForeignColumns: []string{"id"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
Comment: "",
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceColumns struct {
|
||||||
|
Committed column
|
||||||
|
Condition column
|
||||||
|
Created column
|
||||||
|
CreatorID column
|
||||||
|
CSVFile column
|
||||||
|
Deleted column
|
||||||
|
Geom column
|
||||||
|
H3cell column
|
||||||
|
ID column
|
||||||
|
OrganizationID column
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c fileuploadFlyoverAerialServiceColumns) AsSlice() []column {
|
||||||
|
return []column{
|
||||||
|
c.Committed, c.Condition, c.Created, c.CreatorID, c.CSVFile, c.Deleted, c.Geom, c.H3cell, c.ID, c.OrganizationID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceIndexes struct {
|
||||||
|
FlyoverAerialServicePkey index
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i fileuploadFlyoverAerialServiceIndexes) AsSlice() []index {
|
||||||
|
return []index{
|
||||||
|
i.FlyoverAerialServicePkey,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceForeignKeys struct {
|
||||||
|
FileuploadFlyoverAerialServiceFlyoverAerialServiceCreatorIDFkey foreignKey
|
||||||
|
FileuploadFlyoverAerialServiceFlyoverAerialServiceCSVFileFkey foreignKey
|
||||||
|
FileuploadFlyoverAerialServiceFlyoverAerialServiceOrganizationIDFkey foreignKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fileuploadFlyoverAerialServiceForeignKeys) AsSlice() []foreignKey {
|
||||||
|
return []foreignKey{
|
||||||
|
f.FileuploadFlyoverAerialServiceFlyoverAerialServiceCreatorIDFkey, f.FileuploadFlyoverAerialServiceFlyoverAerialServiceCSVFileFkey, f.FileuploadFlyoverAerialServiceFlyoverAerialServiceOrganizationIDFkey,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceUniques struct{}
|
||||||
|
|
||||||
|
func (u fileuploadFlyoverAerialServiceUniques) AsSlice() []constraint {
|
||||||
|
return []constraint{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceChecks struct{}
|
||||||
|
|
||||||
|
func (c fileuploadFlyoverAerialServiceChecks) AsSlice() []check {
|
||||||
|
return []check{}
|
||||||
|
}
|
||||||
|
|
@ -986,11 +986,13 @@ func (e *Countrytype) Scan(value any) error {
|
||||||
// Enum values for FileuploadCsvtype
|
// Enum values for FileuploadCsvtype
|
||||||
const (
|
const (
|
||||||
FileuploadCsvtypePoollist FileuploadCsvtype = "PoolList"
|
FileuploadCsvtypePoollist FileuploadCsvtype = "PoolList"
|
||||||
|
FileuploadCsvtypeFlyover FileuploadCsvtype = "Flyover"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AllFileuploadCsvtype() []FileuploadCsvtype {
|
func AllFileuploadCsvtype() []FileuploadCsvtype {
|
||||||
return []FileuploadCsvtype{
|
return []FileuploadCsvtype{
|
||||||
FileuploadCsvtypePoollist,
|
FileuploadCsvtypePoollist,
|
||||||
|
FileuploadCsvtypeFlyover,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1002,7 +1004,8 @@ func (e FileuploadCsvtype) String() string {
|
||||||
|
|
||||||
func (e FileuploadCsvtype) Valid() bool {
|
func (e FileuploadCsvtype) Valid() bool {
|
||||||
switch e {
|
switch e {
|
||||||
case FileuploadCsvtypePoollist:
|
case FileuploadCsvtypePoollist,
|
||||||
|
FileuploadCsvtypeFlyover:
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
|
|
|
||||||
|
|
@ -236,10 +236,11 @@ var (
|
||||||
fieldseekerSyncRelOrganizationCtx = newContextual[bool]("fieldseeker_sync.organization.fieldseeker_sync.fieldseeker_sync_organization_id_fkey")
|
fieldseekerSyncRelOrganizationCtx = newContextual[bool]("fieldseeker_sync.organization.fieldseeker_sync.fieldseeker_sync_organization_id_fkey")
|
||||||
|
|
||||||
// Relationship Contexts for fileupload.csv
|
// Relationship Contexts for fileupload.csv
|
||||||
fileuploadCSVWithParentsCascadingCtx = newContextual[bool]("fileuploadCSVWithParentsCascading")
|
fileuploadCSVWithParentsCascadingCtx = newContextual[bool]("fileuploadCSVWithParentsCascading")
|
||||||
fileuploadCSVRelFileCtx = newContextual[bool]("fileupload.csv.fileupload.file.fileupload.csv.csv_file_id_fkey")
|
fileuploadCSVRelFileCtx = newContextual[bool]("fileupload.csv.fileupload.file.fileupload.csv.csv_file_id_fkey")
|
||||||
fileuploadCSVRelCSVFileErrorCSVSCtx = newContextual[bool]("fileupload.csv.fileupload.error_csv.fileupload.error_csv.error_csv_csv_file_id_fkey")
|
fileuploadCSVRelCSVFileErrorCSVSCtx = newContextual[bool]("fileupload.csv.fileupload.error_csv.fileupload.error_csv.error_csv_csv_file_id_fkey")
|
||||||
fileuploadCSVRelCSVFilePoolsCtx = newContextual[bool]("fileupload.csv.fileupload.pool.fileupload.pool.pool_csv_file_fkey")
|
fileuploadCSVRelCSVFileFlyoverAerialServicesCtx = newContextual[bool]("fileupload.csv.fileupload.flyover_aerial_service.fileupload.flyover_aerial_service.flyover_aerial_service_csv_file_fkey")
|
||||||
|
fileuploadCSVRelCSVFilePoolsCtx = newContextual[bool]("fileupload.csv.fileupload.pool.fileupload.pool.pool_csv_file_fkey")
|
||||||
|
|
||||||
// Relationship Contexts for fileupload.error_csv
|
// Relationship Contexts for fileupload.error_csv
|
||||||
fileuploadErrorCSVWithParentsCascadingCtx = newContextual[bool]("fileuploadErrorCSVWithParentsCascading")
|
fileuploadErrorCSVWithParentsCascadingCtx = newContextual[bool]("fileuploadErrorCSVWithParentsCascading")
|
||||||
|
|
@ -257,6 +258,12 @@ var (
|
||||||
fileuploadFileRelOrganizationCtx = newContextual[bool]("fileupload.file.organization.fileupload.file.file_organization_id_fkey")
|
fileuploadFileRelOrganizationCtx = newContextual[bool]("fileupload.file.organization.fileupload.file.file_organization_id_fkey")
|
||||||
fileuploadFileRelSitesCtx = newContextual[bool]("fileupload.file.site.site.site_file_id_fkey")
|
fileuploadFileRelSitesCtx = newContextual[bool]("fileupload.file.site.site.site_file_id_fkey")
|
||||||
|
|
||||||
|
// Relationship Contexts for fileupload.flyover_aerial_service
|
||||||
|
fileuploadFlyoverAerialServiceWithParentsCascadingCtx = newContextual[bool]("fileuploadFlyoverAerialServiceWithParentsCascading")
|
||||||
|
fileuploadFlyoverAerialServiceRelCreatorUserCtx = newContextual[bool]("fileupload.flyover_aerial_service.user_.fileupload.flyover_aerial_service.flyover_aerial_service_creator_id_fkey")
|
||||||
|
fileuploadFlyoverAerialServiceRelCSVFileCSVCtx = newContextual[bool]("fileupload.csv.fileupload.flyover_aerial_service.fileupload.flyover_aerial_service.flyover_aerial_service_csv_file_fkey")
|
||||||
|
fileuploadFlyoverAerialServiceRelOrganizationCtx = newContextual[bool]("fileupload.flyover_aerial_service.organization.fileupload.flyover_aerial_service.flyover_aerial_service_organization_id_fkey")
|
||||||
|
|
||||||
// Relationship Contexts for fileupload.pool
|
// Relationship Contexts for fileupload.pool
|
||||||
fileuploadPoolWithParentsCascadingCtx = newContextual[bool]("fileuploadPoolWithParentsCascading")
|
fileuploadPoolWithParentsCascadingCtx = newContextual[bool]("fileuploadPoolWithParentsCascading")
|
||||||
fileuploadPoolRelCreatorUserCtx = newContextual[bool]("fileupload.pool.user_.fileupload.pool.pool_creator_id_fkey")
|
fileuploadPoolRelCreatorUserCtx = newContextual[bool]("fileupload.pool.user_.fileupload.pool.pool_creator_id_fkey")
|
||||||
|
|
@ -350,6 +357,7 @@ var (
|
||||||
organizationRelZones2sCtx = newContextual[bool]("fieldseeker.zones2.organization.fieldseeker.zones2.zones2_organization_id_fkey")
|
organizationRelZones2sCtx = newContextual[bool]("fieldseeker.zones2.organization.fieldseeker.zones2.zones2_organization_id_fkey")
|
||||||
organizationRelFieldseekerSyncsCtx = newContextual[bool]("fieldseeker_sync.organization.fieldseeker_sync.fieldseeker_sync_organization_id_fkey")
|
organizationRelFieldseekerSyncsCtx = newContextual[bool]("fieldseeker_sync.organization.fieldseeker_sync.fieldseeker_sync_organization_id_fkey")
|
||||||
organizationRelFilesCtx = newContextual[bool]("fileupload.file.organization.fileupload.file.file_organization_id_fkey")
|
organizationRelFilesCtx = newContextual[bool]("fileupload.file.organization.fileupload.file.file_organization_id_fkey")
|
||||||
|
organizationRelFlyoverAerialServicesCtx = newContextual[bool]("fileupload.flyover_aerial_service.organization.fileupload.flyover_aerial_service.flyover_aerial_service_organization_id_fkey")
|
||||||
organizationRelPoolsCtx = newContextual[bool]("fileupload.pool.organization.fileupload.pool.pool_organization_id_fkey")
|
organizationRelPoolsCtx = newContextual[bool]("fileupload.pool.organization.fileupload.pool.pool_organization_id_fkey")
|
||||||
organizationRelH3AggregationsCtx = newContextual[bool]("h3_aggregation.organization.h3_aggregation.h3_aggregation_organization_id_fkey")
|
organizationRelH3AggregationsCtx = newContextual[bool]("h3_aggregation.organization.h3_aggregation.h3_aggregation_organization_id_fkey")
|
||||||
organizationRelNoteAudiosCtx = newContextual[bool]("note_audio.organization.note_audio.note_audio_organization_id_fkey")
|
organizationRelNoteAudiosCtx = newContextual[bool]("note_audio.organization.note_audio.note_audio_organization_id_fkey")
|
||||||
|
|
@ -481,6 +489,7 @@ var (
|
||||||
userRelPublicUserUserCtx = newContextual[bool]("arcgis.user_.user_.arcgis.user_.user__public_user_id_fkey")
|
userRelPublicUserUserCtx = newContextual[bool]("arcgis.user_.user_.arcgis.user_.user__public_user_id_fkey")
|
||||||
userRelCreatorComplianceReportRequestsCtx = newContextual[bool]("compliance_report_request.user_.compliance_report_request.compliance_report_request_creator_fkey")
|
userRelCreatorComplianceReportRequestsCtx = newContextual[bool]("compliance_report_request.user_.compliance_report_request.compliance_report_request_creator_fkey")
|
||||||
userRelCreatorFilesCtx = newContextual[bool]("fileupload.file.user_.fileupload.file.file_creator_id_fkey")
|
userRelCreatorFilesCtx = newContextual[bool]("fileupload.file.user_.fileupload.file.file_creator_id_fkey")
|
||||||
|
userRelCreatorFlyoverAerialServicesCtx = newContextual[bool]("fileupload.flyover_aerial_service.user_.fileupload.flyover_aerial_service.flyover_aerial_service_creator_id_fkey")
|
||||||
userRelFileuploadPoolCtx = newContextual[bool]("fileupload.pool.user_.fileupload.pool.pool_creator_id_fkey")
|
userRelFileuploadPoolCtx = newContextual[bool]("fileupload.pool.user_.fileupload.pool.pool_creator_id_fkey")
|
||||||
userRelCreatorNoteAudiosCtx = newContextual[bool]("note_audio.user_.note_audio.note_audio_creator_id_fkey")
|
userRelCreatorNoteAudiosCtx = newContextual[bool]("note_audio.user_.note_audio.note_audio_creator_id_fkey")
|
||||||
userRelDeletorNoteAudiosCtx = newContextual[bool]("note_audio.user_.note_audio.note_audio_deletor_id_fkey")
|
userRelDeletorNoteAudiosCtx = newContextual[bool]("note_audio.user_.note_audio.note_audio_deletor_id_fkey")
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,7 @@ type Factory struct {
|
||||||
baseFileuploadErrorCSVMods FileuploadErrorCSVModSlice
|
baseFileuploadErrorCSVMods FileuploadErrorCSVModSlice
|
||||||
baseFileuploadErrorFileMods FileuploadErrorFileModSlice
|
baseFileuploadErrorFileMods FileuploadErrorFileModSlice
|
||||||
baseFileuploadFileMods FileuploadFileModSlice
|
baseFileuploadFileMods FileuploadFileModSlice
|
||||||
|
baseFileuploadFlyoverAerialServiceMods FileuploadFlyoverAerialServiceModSlice
|
||||||
baseFileuploadPoolMods FileuploadPoolModSlice
|
baseFileuploadPoolMods FileuploadPoolModSlice
|
||||||
baseGeographyColumnMods GeographyColumnModSlice
|
baseGeographyColumnMods GeographyColumnModSlice
|
||||||
baseGeometryColumnMods GeometryColumnModSlice
|
baseGeometryColumnMods GeometryColumnModSlice
|
||||||
|
|
@ -2706,6 +2707,9 @@ func (f *Factory) FromExistingFileuploadCSV(m *models.FileuploadCSV) *Fileupload
|
||||||
if len(m.R.CSVFileErrorCSVS) > 0 {
|
if len(m.R.CSVFileErrorCSVS) > 0 {
|
||||||
FileuploadCSVMods.AddExistingCSVFileErrorCSVS(m.R.CSVFileErrorCSVS...).Apply(ctx, o)
|
FileuploadCSVMods.AddExistingCSVFileErrorCSVS(m.R.CSVFileErrorCSVS...).Apply(ctx, o)
|
||||||
}
|
}
|
||||||
|
if len(m.R.CSVFileFlyoverAerialServices) > 0 {
|
||||||
|
FileuploadCSVMods.AddExistingCSVFileFlyoverAerialServices(m.R.CSVFileFlyoverAerialServices...).Apply(ctx, o)
|
||||||
|
}
|
||||||
if len(m.R.CSVFilePools) > 0 {
|
if len(m.R.CSVFilePools) > 0 {
|
||||||
FileuploadCSVMods.AddExistingCSVFilePools(m.R.CSVFilePools...).Apply(ctx, o)
|
FileuploadCSVMods.AddExistingCSVFilePools(m.R.CSVFilePools...).Apply(ctx, o)
|
||||||
}
|
}
|
||||||
|
|
@ -2827,6 +2831,50 @@ func (f *Factory) FromExistingFileuploadFile(m *models.FileuploadFile) *Fileuplo
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *Factory) NewFileuploadFlyoverAerialService(mods ...FileuploadFlyoverAerialServiceMod) *FileuploadFlyoverAerialServiceTemplate {
|
||||||
|
return f.NewFileuploadFlyoverAerialServiceWithContext(context.Background(), mods...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Factory) NewFileuploadFlyoverAerialServiceWithContext(ctx context.Context, mods ...FileuploadFlyoverAerialServiceMod) *FileuploadFlyoverAerialServiceTemplate {
|
||||||
|
o := &FileuploadFlyoverAerialServiceTemplate{f: f}
|
||||||
|
|
||||||
|
if f != nil {
|
||||||
|
f.baseFileuploadFlyoverAerialServiceMods.Apply(ctx, o)
|
||||||
|
}
|
||||||
|
|
||||||
|
FileuploadFlyoverAerialServiceModSlice(mods).Apply(ctx, o)
|
||||||
|
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Factory) FromExistingFileuploadFlyoverAerialService(m *models.FileuploadFlyoverAerialService) *FileuploadFlyoverAerialServiceTemplate {
|
||||||
|
o := &FileuploadFlyoverAerialServiceTemplate{f: f, alreadyPersisted: true}
|
||||||
|
|
||||||
|
o.Committed = func() bool { return m.Committed }
|
||||||
|
o.Condition = func() enums.FileuploadPoolconditiontype { return m.Condition }
|
||||||
|
o.Created = func() time.Time { return m.Created }
|
||||||
|
o.CreatorID = func() int32 { return m.CreatorID }
|
||||||
|
o.CSVFile = func() int32 { return m.CSVFile }
|
||||||
|
o.Deleted = func() null.Val[time.Time] { return m.Deleted }
|
||||||
|
o.Geom = func() null.Val[string] { return m.Geom }
|
||||||
|
o.H3cell = func() null.Val[string] { return m.H3cell }
|
||||||
|
o.ID = func() int32 { return m.ID }
|
||||||
|
o.OrganizationID = func() int32 { return m.OrganizationID }
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
if m.R.CreatorUser != nil {
|
||||||
|
FileuploadFlyoverAerialServiceMods.WithExistingCreatorUser(m.R.CreatorUser).Apply(ctx, o)
|
||||||
|
}
|
||||||
|
if m.R.CSVFileCSV != nil {
|
||||||
|
FileuploadFlyoverAerialServiceMods.WithExistingCSVFileCSV(m.R.CSVFileCSV).Apply(ctx, o)
|
||||||
|
}
|
||||||
|
if m.R.Organization != nil {
|
||||||
|
FileuploadFlyoverAerialServiceMods.WithExistingOrganization(m.R.Organization).Apply(ctx, o)
|
||||||
|
}
|
||||||
|
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
func (f *Factory) NewFileuploadPool(mods ...FileuploadPoolMod) *FileuploadPoolTemplate {
|
func (f *Factory) NewFileuploadPool(mods ...FileuploadPoolMod) *FileuploadPoolTemplate {
|
||||||
return f.NewFileuploadPoolWithContext(context.Background(), mods...)
|
return f.NewFileuploadPoolWithContext(context.Background(), mods...)
|
||||||
}
|
}
|
||||||
|
|
@ -3430,6 +3478,9 @@ func (f *Factory) FromExistingOrganization(m *models.Organization) *Organization
|
||||||
if len(m.R.Files) > 0 {
|
if len(m.R.Files) > 0 {
|
||||||
OrganizationMods.AddExistingFiles(m.R.Files...).Apply(ctx, o)
|
OrganizationMods.AddExistingFiles(m.R.Files...).Apply(ctx, o)
|
||||||
}
|
}
|
||||||
|
if len(m.R.FlyoverAerialServices) > 0 {
|
||||||
|
OrganizationMods.AddExistingFlyoverAerialServices(m.R.FlyoverAerialServices...).Apply(ctx, o)
|
||||||
|
}
|
||||||
if len(m.R.Pools) > 0 {
|
if len(m.R.Pools) > 0 {
|
||||||
OrganizationMods.AddExistingPools(m.R.Pools...).Apply(ctx, o)
|
OrganizationMods.AddExistingPools(m.R.Pools...).Apply(ctx, o)
|
||||||
}
|
}
|
||||||
|
|
@ -4404,6 +4455,9 @@ func (f *Factory) FromExistingUser(m *models.User) *UserTemplate {
|
||||||
if len(m.R.CreatorFiles) > 0 {
|
if len(m.R.CreatorFiles) > 0 {
|
||||||
UserMods.AddExistingCreatorFiles(m.R.CreatorFiles...).Apply(ctx, o)
|
UserMods.AddExistingCreatorFiles(m.R.CreatorFiles...).Apply(ctx, o)
|
||||||
}
|
}
|
||||||
|
if len(m.R.CreatorFlyoverAerialServices) > 0 {
|
||||||
|
UserMods.AddExistingCreatorFlyoverAerialServices(m.R.CreatorFlyoverAerialServices...).Apply(ctx, o)
|
||||||
|
}
|
||||||
if len(m.R.FileuploadPool) > 0 {
|
if len(m.R.FileuploadPool) > 0 {
|
||||||
UserMods.AddExistingFileuploadPool(m.R.FileuploadPool...).Apply(ctx, o)
|
UserMods.AddExistingFileuploadPool(m.R.FileuploadPool...).Apply(ctx, o)
|
||||||
}
|
}
|
||||||
|
|
@ -4862,6 +4916,14 @@ func (f *Factory) AddBaseFileuploadFileMod(mods ...FileuploadFileMod) {
|
||||||
f.baseFileuploadFileMods = append(f.baseFileuploadFileMods, mods...)
|
f.baseFileuploadFileMods = append(f.baseFileuploadFileMods, mods...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *Factory) ClearBaseFileuploadFlyoverAerialServiceMods() {
|
||||||
|
f.baseFileuploadFlyoverAerialServiceMods = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Factory) AddBaseFileuploadFlyoverAerialServiceMod(mods ...FileuploadFlyoverAerialServiceMod) {
|
||||||
|
f.baseFileuploadFlyoverAerialServiceMods = append(f.baseFileuploadFlyoverAerialServiceMods, mods...)
|
||||||
|
}
|
||||||
|
|
||||||
func (f *Factory) ClearBaseFileuploadPoolMods() {
|
func (f *Factory) ClearBaseFileuploadPoolMods() {
|
||||||
f.baseFileuploadPoolMods = nil
|
f.baseFileuploadPoolMods = nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,9 +50,10 @@ type FileuploadCSVTemplate struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileuploadCSVR struct {
|
type fileuploadCSVR struct {
|
||||||
File *fileuploadCSVRFileR
|
File *fileuploadCSVRFileR
|
||||||
CSVFileErrorCSVS []*fileuploadCSVRCSVFileErrorCSVSR
|
CSVFileErrorCSVS []*fileuploadCSVRCSVFileErrorCSVSR
|
||||||
CSVFilePools []*fileuploadCSVRCSVFilePoolsR
|
CSVFileFlyoverAerialServices []*fileuploadCSVRCSVFileFlyoverAerialServicesR
|
||||||
|
CSVFilePools []*fileuploadCSVRCSVFilePoolsR
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileuploadCSVRFileR struct {
|
type fileuploadCSVRFileR struct {
|
||||||
|
|
@ -62,6 +63,10 @@ type fileuploadCSVRCSVFileErrorCSVSR struct {
|
||||||
number int
|
number int
|
||||||
o *FileuploadErrorCSVTemplate
|
o *FileuploadErrorCSVTemplate
|
||||||
}
|
}
|
||||||
|
type fileuploadCSVRCSVFileFlyoverAerialServicesR struct {
|
||||||
|
number int
|
||||||
|
o *FileuploadFlyoverAerialServiceTemplate
|
||||||
|
}
|
||||||
type fileuploadCSVRCSVFilePoolsR struct {
|
type fileuploadCSVRCSVFilePoolsR struct {
|
||||||
number int
|
number int
|
||||||
o *FileuploadPoolTemplate
|
o *FileuploadPoolTemplate
|
||||||
|
|
@ -97,6 +102,19 @@ func (t FileuploadCSVTemplate) setModelRels(o *models.FileuploadCSV) {
|
||||||
o.R.CSVFileErrorCSVS = rel
|
o.R.CSVFileErrorCSVS = rel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if t.r.CSVFileFlyoverAerialServices != nil {
|
||||||
|
rel := models.FileuploadFlyoverAerialServiceSlice{}
|
||||||
|
for _, r := range t.r.CSVFileFlyoverAerialServices {
|
||||||
|
related := r.o.BuildMany(r.number)
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.CSVFile = o.FileID // h2
|
||||||
|
rel.R.CSVFileCSV = o
|
||||||
|
}
|
||||||
|
rel = append(rel, related...)
|
||||||
|
}
|
||||||
|
o.R.CSVFileFlyoverAerialServices = rel
|
||||||
|
}
|
||||||
|
|
||||||
if t.r.CSVFilePools != nil {
|
if t.r.CSVFilePools != nil {
|
||||||
rel := models.FileuploadPoolSlice{}
|
rel := models.FileuploadPoolSlice{}
|
||||||
for _, r := range t.r.CSVFilePools {
|
for _, r := range t.r.CSVFilePools {
|
||||||
|
|
@ -226,6 +244,26 @@ func (o *FileuploadCSVTemplate) insertOptRels(ctx context.Context, exec bob.Exec
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isCSVFileFlyoverAerialServicesDone, _ := fileuploadCSVRelCSVFileFlyoverAerialServicesCtx.Value(ctx)
|
||||||
|
if !isCSVFileFlyoverAerialServicesDone && o.r.CSVFileFlyoverAerialServices != nil {
|
||||||
|
ctx = fileuploadCSVRelCSVFileFlyoverAerialServicesCtx.WithValue(ctx, true)
|
||||||
|
for _, r := range o.r.CSVFileFlyoverAerialServices {
|
||||||
|
if r.o.alreadyPersisted {
|
||||||
|
m.R.CSVFileFlyoverAerialServices = append(m.R.CSVFileFlyoverAerialServices, r.o.Build())
|
||||||
|
} else {
|
||||||
|
rel2, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = m.AttachCSVFileFlyoverAerialServices(ctx, exec, rel2...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
isCSVFilePoolsDone, _ := fileuploadCSVRelCSVFilePoolsCtx.Value(ctx)
|
isCSVFilePoolsDone, _ := fileuploadCSVRelCSVFilePoolsCtx.Value(ctx)
|
||||||
if !isCSVFilePoolsDone && o.r.CSVFilePools != nil {
|
if !isCSVFilePoolsDone && o.r.CSVFilePools != nil {
|
||||||
ctx = fileuploadCSVRelCSVFilePoolsCtx.WithValue(ctx, true)
|
ctx = fileuploadCSVRelCSVFilePoolsCtx.WithValue(ctx, true)
|
||||||
|
|
@ -233,12 +271,12 @@ func (o *FileuploadCSVTemplate) insertOptRels(ctx context.Context, exec bob.Exec
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.CSVFilePools = append(m.R.CSVFilePools, r.o.Build())
|
m.R.CSVFilePools = append(m.R.CSVFilePools, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel2, err := r.o.CreateMany(ctx, exec, r.number)
|
rel3, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachCSVFilePools(ctx, exec, rel2...)
|
err = m.AttachCSVFilePools(ctx, exec, rel3...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -602,6 +640,54 @@ func (m fileuploadCSVMods) WithoutCSVFileErrorCSVS() FileuploadCSVMod {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m fileuploadCSVMods) WithCSVFileFlyoverAerialServices(number int, related *FileuploadFlyoverAerialServiceTemplate) FileuploadCSVMod {
|
||||||
|
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
||||||
|
o.r.CSVFileFlyoverAerialServices = []*fileuploadCSVRCSVFileFlyoverAerialServicesR{{
|
||||||
|
number: number,
|
||||||
|
o: related,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadCSVMods) WithNewCSVFileFlyoverAerialServices(number int, mods ...FileuploadFlyoverAerialServiceMod) FileuploadCSVMod {
|
||||||
|
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
||||||
|
related := o.f.NewFileuploadFlyoverAerialServiceWithContext(ctx, mods...)
|
||||||
|
m.WithCSVFileFlyoverAerialServices(number, related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadCSVMods) AddCSVFileFlyoverAerialServices(number int, related *FileuploadFlyoverAerialServiceTemplate) FileuploadCSVMod {
|
||||||
|
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
||||||
|
o.r.CSVFileFlyoverAerialServices = append(o.r.CSVFileFlyoverAerialServices, &fileuploadCSVRCSVFileFlyoverAerialServicesR{
|
||||||
|
number: number,
|
||||||
|
o: related,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadCSVMods) AddNewCSVFileFlyoverAerialServices(number int, mods ...FileuploadFlyoverAerialServiceMod) FileuploadCSVMod {
|
||||||
|
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
||||||
|
related := o.f.NewFileuploadFlyoverAerialServiceWithContext(ctx, mods...)
|
||||||
|
m.AddCSVFileFlyoverAerialServices(number, related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadCSVMods) AddExistingCSVFileFlyoverAerialServices(existingModels ...*models.FileuploadFlyoverAerialService) FileuploadCSVMod {
|
||||||
|
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
||||||
|
for _, em := range existingModels {
|
||||||
|
o.r.CSVFileFlyoverAerialServices = append(o.r.CSVFileFlyoverAerialServices, &fileuploadCSVRCSVFileFlyoverAerialServicesR{
|
||||||
|
o: o.f.FromExistingFileuploadFlyoverAerialService(em),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadCSVMods) WithoutCSVFileFlyoverAerialServices() FileuploadCSVMod {
|
||||||
|
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
||||||
|
o.r.CSVFileFlyoverAerialServices = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (m fileuploadCSVMods) WithCSVFilePools(number int, related *FileuploadPoolTemplate) FileuploadCSVMod {
|
func (m fileuploadCSVMods) WithCSVFilePools(number int, related *FileuploadPoolTemplate) FileuploadCSVMod {
|
||||||
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
return FileuploadCSVModFunc(func(ctx context.Context, o *FileuploadCSVTemplate) {
|
||||||
o.r.CSVFilePools = []*fileuploadCSVRCSVFilePoolsR{{
|
o.r.CSVFilePools = []*fileuploadCSVRCSVFilePoolsR{{
|
||||||
|
|
|
||||||
903
db/factory/fileupload.flyover_aerial_service.bob.go
Normal file
903
db/factory/fileupload.flyover_aerial_service.bob.go
Normal file
|
|
@ -0,0 +1,903 @@
|
||||||
|
// Code generated by BobGen psql v0.42.5. DO NOT EDIT.
|
||||||
|
// This file is meant to be re-generated in place and/or deleted at any time.
|
||||||
|
|
||||||
|
package factory
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/Gleipnir-Technology/bob"
|
||||||
|
enums "github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||||
|
models "github.com/Gleipnir-Technology/nidus-sync/db/models"
|
||||||
|
"github.com/aarondl/opt/null"
|
||||||
|
"github.com/aarondl/opt/omit"
|
||||||
|
"github.com/aarondl/opt/omitnull"
|
||||||
|
"github.com/jaswdr/faker/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FileuploadFlyoverAerialServiceMod interface {
|
||||||
|
Apply(context.Context, *FileuploadFlyoverAerialServiceTemplate)
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileuploadFlyoverAerialServiceModFunc func(context.Context, *FileuploadFlyoverAerialServiceTemplate)
|
||||||
|
|
||||||
|
func (f FileuploadFlyoverAerialServiceModFunc) Apply(ctx context.Context, n *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
f(ctx, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileuploadFlyoverAerialServiceModSlice []FileuploadFlyoverAerialServiceMod
|
||||||
|
|
||||||
|
func (mods FileuploadFlyoverAerialServiceModSlice) Apply(ctx context.Context, n *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
for _, f := range mods {
|
||||||
|
f.Apply(ctx, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FileuploadFlyoverAerialServiceTemplate is an object representing the database table.
|
||||||
|
// all columns are optional and should be set by mods
|
||||||
|
type FileuploadFlyoverAerialServiceTemplate struct {
|
||||||
|
Committed func() bool
|
||||||
|
Condition func() enums.FileuploadPoolconditiontype
|
||||||
|
Created func() time.Time
|
||||||
|
CreatorID func() int32
|
||||||
|
CSVFile func() int32
|
||||||
|
Deleted func() null.Val[time.Time]
|
||||||
|
Geom func() null.Val[string]
|
||||||
|
H3cell func() null.Val[string]
|
||||||
|
ID func() int32
|
||||||
|
OrganizationID func() int32
|
||||||
|
|
||||||
|
r fileuploadFlyoverAerialServiceR
|
||||||
|
f *Factory
|
||||||
|
|
||||||
|
alreadyPersisted bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceR struct {
|
||||||
|
CreatorUser *fileuploadFlyoverAerialServiceRCreatorUserR
|
||||||
|
CSVFileCSV *fileuploadFlyoverAerialServiceRCSVFileCSVR
|
||||||
|
Organization *fileuploadFlyoverAerialServiceROrganizationR
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceRCreatorUserR struct {
|
||||||
|
o *UserTemplate
|
||||||
|
}
|
||||||
|
type fileuploadFlyoverAerialServiceRCSVFileCSVR struct {
|
||||||
|
o *FileuploadCSVTemplate
|
||||||
|
}
|
||||||
|
type fileuploadFlyoverAerialServiceROrganizationR struct {
|
||||||
|
o *OrganizationTemplate
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply mods to the FileuploadFlyoverAerialServiceTemplate
|
||||||
|
func (o *FileuploadFlyoverAerialServiceTemplate) Apply(ctx context.Context, mods ...FileuploadFlyoverAerialServiceMod) {
|
||||||
|
for _, mod := range mods {
|
||||||
|
mod.Apply(ctx, o)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// setModelRels creates and sets the relationships on *models.FileuploadFlyoverAerialService
|
||||||
|
// according to the relationships in the template. Nothing is inserted into the db
|
||||||
|
func (t FileuploadFlyoverAerialServiceTemplate) setModelRels(o *models.FileuploadFlyoverAerialService) {
|
||||||
|
if t.r.CreatorUser != nil {
|
||||||
|
rel := t.r.CreatorUser.o.Build()
|
||||||
|
rel.R.CreatorFlyoverAerialServices = append(rel.R.CreatorFlyoverAerialServices, o)
|
||||||
|
o.CreatorID = rel.ID // h2
|
||||||
|
o.R.CreatorUser = rel
|
||||||
|
}
|
||||||
|
|
||||||
|
if t.r.CSVFileCSV != nil {
|
||||||
|
rel := t.r.CSVFileCSV.o.Build()
|
||||||
|
rel.R.CSVFileFlyoverAerialServices = append(rel.R.CSVFileFlyoverAerialServices, o)
|
||||||
|
o.CSVFile = rel.FileID // h2
|
||||||
|
o.R.CSVFileCSV = rel
|
||||||
|
}
|
||||||
|
|
||||||
|
if t.r.Organization != nil {
|
||||||
|
rel := t.r.Organization.o.Build()
|
||||||
|
rel.R.FlyoverAerialServices = append(rel.R.FlyoverAerialServices, o)
|
||||||
|
o.OrganizationID = rel.ID // h2
|
||||||
|
o.R.Organization = rel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildSetter returns an *models.FileuploadFlyoverAerialServiceSetter
|
||||||
|
// this does nothing with the relationship templates
|
||||||
|
func (o FileuploadFlyoverAerialServiceTemplate) BuildSetter() *models.FileuploadFlyoverAerialServiceSetter {
|
||||||
|
m := &models.FileuploadFlyoverAerialServiceSetter{}
|
||||||
|
|
||||||
|
if o.Committed != nil {
|
||||||
|
val := o.Committed()
|
||||||
|
m.Committed = omit.From(val)
|
||||||
|
}
|
||||||
|
if o.Condition != nil {
|
||||||
|
val := o.Condition()
|
||||||
|
m.Condition = omit.From(val)
|
||||||
|
}
|
||||||
|
if o.Created != nil {
|
||||||
|
val := o.Created()
|
||||||
|
m.Created = omit.From(val)
|
||||||
|
}
|
||||||
|
if o.CreatorID != nil {
|
||||||
|
val := o.CreatorID()
|
||||||
|
m.CreatorID = omit.From(val)
|
||||||
|
}
|
||||||
|
if o.CSVFile != nil {
|
||||||
|
val := o.CSVFile()
|
||||||
|
m.CSVFile = omit.From(val)
|
||||||
|
}
|
||||||
|
if o.Deleted != nil {
|
||||||
|
val := o.Deleted()
|
||||||
|
m.Deleted = omitnull.FromNull(val)
|
||||||
|
}
|
||||||
|
if o.Geom != nil {
|
||||||
|
val := o.Geom()
|
||||||
|
m.Geom = omitnull.FromNull(val)
|
||||||
|
}
|
||||||
|
if o.H3cell != nil {
|
||||||
|
val := o.H3cell()
|
||||||
|
m.H3cell = omitnull.FromNull(val)
|
||||||
|
}
|
||||||
|
if o.ID != nil {
|
||||||
|
val := o.ID()
|
||||||
|
m.ID = omit.From(val)
|
||||||
|
}
|
||||||
|
if o.OrganizationID != nil {
|
||||||
|
val := o.OrganizationID()
|
||||||
|
m.OrganizationID = omit.From(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildManySetter returns an []*models.FileuploadFlyoverAerialServiceSetter
|
||||||
|
// this does nothing with the relationship templates
|
||||||
|
func (o FileuploadFlyoverAerialServiceTemplate) BuildManySetter(number int) []*models.FileuploadFlyoverAerialServiceSetter {
|
||||||
|
m := make([]*models.FileuploadFlyoverAerialServiceSetter, number)
|
||||||
|
|
||||||
|
for i := range m {
|
||||||
|
m[i] = o.BuildSetter()
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build returns an *models.FileuploadFlyoverAerialService
|
||||||
|
// Related objects are also created and placed in the .R field
|
||||||
|
// NOTE: Objects are not inserted into the database. Use FileuploadFlyoverAerialServiceTemplate.Create
|
||||||
|
func (o FileuploadFlyoverAerialServiceTemplate) Build() *models.FileuploadFlyoverAerialService {
|
||||||
|
m := &models.FileuploadFlyoverAerialService{}
|
||||||
|
|
||||||
|
if o.Committed != nil {
|
||||||
|
m.Committed = o.Committed()
|
||||||
|
}
|
||||||
|
if o.Condition != nil {
|
||||||
|
m.Condition = o.Condition()
|
||||||
|
}
|
||||||
|
if o.Created != nil {
|
||||||
|
m.Created = o.Created()
|
||||||
|
}
|
||||||
|
if o.CreatorID != nil {
|
||||||
|
m.CreatorID = o.CreatorID()
|
||||||
|
}
|
||||||
|
if o.CSVFile != nil {
|
||||||
|
m.CSVFile = o.CSVFile()
|
||||||
|
}
|
||||||
|
if o.Deleted != nil {
|
||||||
|
m.Deleted = o.Deleted()
|
||||||
|
}
|
||||||
|
if o.Geom != nil {
|
||||||
|
m.Geom = o.Geom()
|
||||||
|
}
|
||||||
|
if o.H3cell != nil {
|
||||||
|
m.H3cell = o.H3cell()
|
||||||
|
}
|
||||||
|
if o.ID != nil {
|
||||||
|
m.ID = o.ID()
|
||||||
|
}
|
||||||
|
if o.OrganizationID != nil {
|
||||||
|
m.OrganizationID = o.OrganizationID()
|
||||||
|
}
|
||||||
|
|
||||||
|
o.setModelRels(m)
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildMany returns an models.FileuploadFlyoverAerialServiceSlice
|
||||||
|
// Related objects are also created and placed in the .R field
|
||||||
|
// NOTE: Objects are not inserted into the database. Use FileuploadFlyoverAerialServiceTemplate.CreateMany
|
||||||
|
func (o FileuploadFlyoverAerialServiceTemplate) BuildMany(number int) models.FileuploadFlyoverAerialServiceSlice {
|
||||||
|
m := make(models.FileuploadFlyoverAerialServiceSlice, number)
|
||||||
|
|
||||||
|
for i := range m {
|
||||||
|
m[i] = o.Build()
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func ensureCreatableFileuploadFlyoverAerialService(m *models.FileuploadFlyoverAerialServiceSetter) {
|
||||||
|
if !(m.Committed.IsValue()) {
|
||||||
|
val := random_bool(nil)
|
||||||
|
m.Committed = omit.From(val)
|
||||||
|
}
|
||||||
|
if !(m.Condition.IsValue()) {
|
||||||
|
val := random_enums_FileuploadPoolconditiontype(nil)
|
||||||
|
m.Condition = omit.From(val)
|
||||||
|
}
|
||||||
|
if !(m.Created.IsValue()) {
|
||||||
|
val := random_time_Time(nil)
|
||||||
|
m.Created = omit.From(val)
|
||||||
|
}
|
||||||
|
if !(m.CreatorID.IsValue()) {
|
||||||
|
val := random_int32(nil)
|
||||||
|
m.CreatorID = omit.From(val)
|
||||||
|
}
|
||||||
|
if !(m.CSVFile.IsValue()) {
|
||||||
|
val := random_int32(nil)
|
||||||
|
m.CSVFile = omit.From(val)
|
||||||
|
}
|
||||||
|
if !(m.OrganizationID.IsValue()) {
|
||||||
|
val := random_int32(nil)
|
||||||
|
m.OrganizationID = omit.From(val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// insertOptRels creates and inserts any optional the relationships on *models.FileuploadFlyoverAerialService
|
||||||
|
// according to the relationships in the template.
|
||||||
|
// any required relationship should have already exist on the model
|
||||||
|
func (o *FileuploadFlyoverAerialServiceTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.FileuploadFlyoverAerialService) error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create builds a fileuploadFlyoverAerialService and inserts it into the database
|
||||||
|
// Relations objects are also inserted and placed in the .R field
|
||||||
|
func (o *FileuploadFlyoverAerialServiceTemplate) Create(ctx context.Context, exec bob.Executor) (*models.FileuploadFlyoverAerialService, error) {
|
||||||
|
var err error
|
||||||
|
opt := o.BuildSetter()
|
||||||
|
ensureCreatableFileuploadFlyoverAerialService(opt)
|
||||||
|
|
||||||
|
if o.r.CreatorUser == nil {
|
||||||
|
FileuploadFlyoverAerialServiceMods.WithNewCreatorUser().Apply(ctx, o)
|
||||||
|
}
|
||||||
|
|
||||||
|
var rel0 *models.User
|
||||||
|
|
||||||
|
if o.r.CreatorUser.o.alreadyPersisted {
|
||||||
|
rel0 = o.r.CreatorUser.o.Build()
|
||||||
|
} else {
|
||||||
|
rel0, err = o.r.CreatorUser.o.Create(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
opt.CreatorID = omit.From(rel0.ID)
|
||||||
|
|
||||||
|
if o.r.CSVFileCSV == nil {
|
||||||
|
FileuploadFlyoverAerialServiceMods.WithNewCSVFileCSV().Apply(ctx, o)
|
||||||
|
}
|
||||||
|
|
||||||
|
var rel1 *models.FileuploadCSV
|
||||||
|
|
||||||
|
if o.r.CSVFileCSV.o.alreadyPersisted {
|
||||||
|
rel1 = o.r.CSVFileCSV.o.Build()
|
||||||
|
} else {
|
||||||
|
rel1, err = o.r.CSVFileCSV.o.Create(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
opt.CSVFile = omit.From(rel1.FileID)
|
||||||
|
|
||||||
|
if o.r.Organization == nil {
|
||||||
|
FileuploadFlyoverAerialServiceMods.WithNewOrganization().Apply(ctx, o)
|
||||||
|
}
|
||||||
|
|
||||||
|
var rel2 *models.Organization
|
||||||
|
|
||||||
|
if o.r.Organization.o.alreadyPersisted {
|
||||||
|
rel2 = o.r.Organization.o.Build()
|
||||||
|
} else {
|
||||||
|
rel2, err = o.r.Organization.o.Create(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
opt.OrganizationID = omit.From(rel2.ID)
|
||||||
|
|
||||||
|
m, err := models.FileuploadFlyoverAerialServices.Insert(opt).One(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.R.CreatorUser = rel0
|
||||||
|
m.R.CSVFileCSV = rel1
|
||||||
|
m.R.Organization = rel2
|
||||||
|
|
||||||
|
if err := o.insertOptRels(ctx, exec, m); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return m, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustCreate builds a fileuploadFlyoverAerialService and inserts it into the database
|
||||||
|
// Relations objects are also inserted and placed in the .R field
|
||||||
|
// panics if an error occurs
|
||||||
|
func (o *FileuploadFlyoverAerialServiceTemplate) MustCreate(ctx context.Context, exec bob.Executor) *models.FileuploadFlyoverAerialService {
|
||||||
|
m, err := o.Create(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrFail builds a fileuploadFlyoverAerialService 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 *FileuploadFlyoverAerialServiceTemplate) CreateOrFail(ctx context.Context, tb testing.TB, exec bob.Executor) *models.FileuploadFlyoverAerialService {
|
||||||
|
tb.Helper()
|
||||||
|
m, err := o.Create(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
tb.Fatal(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateMany builds multiple fileuploadFlyoverAerialServices and inserts them into the database
|
||||||
|
// Relations objects are also inserted and placed in the .R field
|
||||||
|
func (o FileuploadFlyoverAerialServiceTemplate) CreateMany(ctx context.Context, exec bob.Executor, number int) (models.FileuploadFlyoverAerialServiceSlice, error) {
|
||||||
|
var err error
|
||||||
|
m := make(models.FileuploadFlyoverAerialServiceSlice, number)
|
||||||
|
|
||||||
|
for i := range m {
|
||||||
|
m[i], err = o.Create(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustCreateMany builds multiple fileuploadFlyoverAerialServices and inserts them into the database
|
||||||
|
// Relations objects are also inserted and placed in the .R field
|
||||||
|
// panics if an error occurs
|
||||||
|
func (o FileuploadFlyoverAerialServiceTemplate) MustCreateMany(ctx context.Context, exec bob.Executor, number int) models.FileuploadFlyoverAerialServiceSlice {
|
||||||
|
m, err := o.CreateMany(ctx, exec, number)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateManyOrFail builds multiple fileuploadFlyoverAerialServices 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 FileuploadFlyoverAerialServiceTemplate) CreateManyOrFail(ctx context.Context, tb testing.TB, exec bob.Executor, number int) models.FileuploadFlyoverAerialServiceSlice {
|
||||||
|
tb.Helper()
|
||||||
|
m, err := o.CreateMany(ctx, exec, number)
|
||||||
|
if err != nil {
|
||||||
|
tb.Fatal(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// FileuploadFlyoverAerialService has methods that act as mods for the FileuploadFlyoverAerialServiceTemplate
|
||||||
|
var FileuploadFlyoverAerialServiceMods fileuploadFlyoverAerialServiceMods
|
||||||
|
|
||||||
|
type fileuploadFlyoverAerialServiceMods struct{}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomizeAllColumns(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModSlice{
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomCommitted(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomCondition(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomCreated(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomCreatorID(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomCSVFile(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomDeleted(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomGeom(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomH3cell(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomID(f),
|
||||||
|
FileuploadFlyoverAerialServiceMods.RandomOrganizationID(f),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) Committed(val bool) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Committed = func() bool { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) CommittedFunc(f func() bool) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Committed = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetCommitted() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Committed = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomCommitted(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Committed = func() bool {
|
||||||
|
return random_bool(f)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) Condition(val enums.FileuploadPoolconditiontype) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Condition = func() enums.FileuploadPoolconditiontype { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) ConditionFunc(f func() enums.FileuploadPoolconditiontype) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Condition = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetCondition() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Condition = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomCondition(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Condition = func() enums.FileuploadPoolconditiontype {
|
||||||
|
return random_enums_FileuploadPoolconditiontype(f)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) Created(val time.Time) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Created = func() time.Time { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) CreatedFunc(f func() time.Time) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Created = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetCreated() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
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 fileuploadFlyoverAerialServiceMods) RandomCreated(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Created = func() time.Time {
|
||||||
|
return random_time_Time(f)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) CreatorID(val int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CreatorID = func() int32 { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) CreatorIDFunc(f func() int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CreatorID = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetCreatorID() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CreatorID = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomCreatorID(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CreatorID = func() int32 {
|
||||||
|
return random_int32(f)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) CSVFile(val int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CSVFile = func() int32 { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) CSVFileFunc(f func() int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CSVFile = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetCSVFile() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CSVFile = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomCSVFile(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.CSVFile = func() int32 {
|
||||||
|
return random_int32(f)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) Deleted(val null.Val[time.Time]) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Deleted = func() null.Val[time.Time] { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) DeletedFunc(f func() null.Val[time.Time]) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Deleted = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetDeleted() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Deleted = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
// The generated value is sometimes null
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomDeleted(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Deleted = func() null.Val[time.Time] {
|
||||||
|
if f == nil {
|
||||||
|
f = &defaultFaker
|
||||||
|
}
|
||||||
|
|
||||||
|
val := random_time_Time(f)
|
||||||
|
return null.From(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
// The generated value is never null
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomDeletedNotNull(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Deleted = func() null.Val[time.Time] {
|
||||||
|
if f == nil {
|
||||||
|
f = &defaultFaker
|
||||||
|
}
|
||||||
|
|
||||||
|
val := random_time_Time(f)
|
||||||
|
return null.From(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) Geom(val null.Val[string]) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Geom = func() null.Val[string] { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) GeomFunc(f func() null.Val[string]) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Geom = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetGeom() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Geom = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
// The generated value is sometimes null
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomGeom(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Geom = func() null.Val[string] {
|
||||||
|
if f == nil {
|
||||||
|
f = &defaultFaker
|
||||||
|
}
|
||||||
|
|
||||||
|
val := random_string(f)
|
||||||
|
return null.From(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
// The generated value is never null
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomGeomNotNull(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.Geom = func() null.Val[string] {
|
||||||
|
if f == nil {
|
||||||
|
f = &defaultFaker
|
||||||
|
}
|
||||||
|
|
||||||
|
val := random_string(f)
|
||||||
|
return null.From(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) H3cell(val null.Val[string]) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.H3cell = func() null.Val[string] { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) H3cellFunc(f func() null.Val[string]) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.H3cell = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetH3cell() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.H3cell = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
// The generated value is sometimes null
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomH3cell(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.H3cell = func() null.Val[string] {
|
||||||
|
if f == nil {
|
||||||
|
f = &defaultFaker
|
||||||
|
}
|
||||||
|
|
||||||
|
val := random_string(f)
|
||||||
|
return null.From(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
// The generated value is never null
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomH3cellNotNull(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.H3cell = func() null.Val[string] {
|
||||||
|
if f == nil {
|
||||||
|
f = &defaultFaker
|
||||||
|
}
|
||||||
|
|
||||||
|
val := random_string(f)
|
||||||
|
return null.From(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) ID(val int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.ID = func() int32 { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) IDFunc(f func() int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.ID = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetID() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
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 fileuploadFlyoverAerialServiceMods) RandomID(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.ID = func() int32 {
|
||||||
|
return random_int32(f)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the model columns to this value
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) OrganizationID(val int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.OrganizationID = func() int32 { return val }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Column from the function
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) OrganizationIDFunc(f func() int32) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.OrganizationID = f
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear any values for the column
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) UnsetOrganizationID() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.OrganizationID = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates a random value for the column using the given faker
|
||||||
|
// if faker is nil, a default faker is used
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) RandomOrganizationID(f *faker.Faker) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(_ context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.OrganizationID = func() int32 {
|
||||||
|
return random_int32(f)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithParentsCascading() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
if isDone, _ := fileuploadFlyoverAerialServiceWithParentsCascadingCtx.Value(ctx); isDone {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx = fileuploadFlyoverAerialServiceWithParentsCascadingCtx.WithValue(ctx, true)
|
||||||
|
{
|
||||||
|
|
||||||
|
related := o.f.NewUserWithContext(ctx, UserMods.WithParentsCascading())
|
||||||
|
m.WithCreatorUser(related).Apply(ctx, o)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
|
||||||
|
related := o.f.NewFileuploadCSVWithContext(ctx, FileuploadCSVMods.WithParentsCascading())
|
||||||
|
m.WithCSVFileCSV(related).Apply(ctx, o)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
|
||||||
|
related := o.f.NewOrganizationWithContext(ctx, OrganizationMods.WithParentsCascading())
|
||||||
|
m.WithOrganization(related).Apply(ctx, o)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithCreatorUser(rel *UserTemplate) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.CreatorUser = &fileuploadFlyoverAerialServiceRCreatorUserR{
|
||||||
|
o: rel,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithNewCreatorUser(mods ...UserMod) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
related := o.f.NewUserWithContext(ctx, mods...)
|
||||||
|
|
||||||
|
m.WithCreatorUser(related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithExistingCreatorUser(em *models.User) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.CreatorUser = &fileuploadFlyoverAerialServiceRCreatorUserR{
|
||||||
|
o: o.f.FromExistingUser(em),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithoutCreatorUser() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.CreatorUser = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithCSVFileCSV(rel *FileuploadCSVTemplate) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.CSVFileCSV = &fileuploadFlyoverAerialServiceRCSVFileCSVR{
|
||||||
|
o: rel,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithNewCSVFileCSV(mods ...FileuploadCSVMod) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
related := o.f.NewFileuploadCSVWithContext(ctx, mods...)
|
||||||
|
|
||||||
|
m.WithCSVFileCSV(related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithExistingCSVFileCSV(em *models.FileuploadCSV) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.CSVFileCSV = &fileuploadFlyoverAerialServiceRCSVFileCSVR{
|
||||||
|
o: o.f.FromExistingFileuploadCSV(em),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithoutCSVFileCSV() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.CSVFileCSV = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithOrganization(rel *OrganizationTemplate) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.Organization = &fileuploadFlyoverAerialServiceROrganizationR{
|
||||||
|
o: rel,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithNewOrganization(mods ...OrganizationMod) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
related := o.f.NewOrganizationWithContext(ctx, mods...)
|
||||||
|
|
||||||
|
m.WithOrganization(related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithExistingOrganization(em *models.Organization) FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.Organization = &fileuploadFlyoverAerialServiceROrganizationR{
|
||||||
|
o: o.f.FromExistingOrganization(em),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m fileuploadFlyoverAerialServiceMods) WithoutOrganization() FileuploadFlyoverAerialServiceMod {
|
||||||
|
return FileuploadFlyoverAerialServiceModFunc(func(ctx context.Context, o *FileuploadFlyoverAerialServiceTemplate) {
|
||||||
|
o.r.Organization = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -112,6 +112,7 @@ type organizationR struct {
|
||||||
Zones2s []*organizationRZones2sR
|
Zones2s []*organizationRZones2sR
|
||||||
FieldseekerSyncs []*organizationRFieldseekerSyncsR
|
FieldseekerSyncs []*organizationRFieldseekerSyncsR
|
||||||
Files []*organizationRFilesR
|
Files []*organizationRFilesR
|
||||||
|
FlyoverAerialServices []*organizationRFlyoverAerialServicesR
|
||||||
Pools []*organizationRPoolsR
|
Pools []*organizationRPoolsR
|
||||||
H3Aggregations []*organizationRH3AggregationsR
|
H3Aggregations []*organizationRH3AggregationsR
|
||||||
NoteAudios []*organizationRNoteAudiosR
|
NoteAudios []*organizationRNoteAudiosR
|
||||||
|
|
@ -260,6 +261,10 @@ type organizationRFilesR struct {
|
||||||
number int
|
number int
|
||||||
o *FileuploadFileTemplate
|
o *FileuploadFileTemplate
|
||||||
}
|
}
|
||||||
|
type organizationRFlyoverAerialServicesR struct {
|
||||||
|
number int
|
||||||
|
o *FileuploadFlyoverAerialServiceTemplate
|
||||||
|
}
|
||||||
type organizationRPoolsR struct {
|
type organizationRPoolsR struct {
|
||||||
number int
|
number int
|
||||||
o *FileuploadPoolTemplate
|
o *FileuploadPoolTemplate
|
||||||
|
|
@ -749,6 +754,19 @@ func (t OrganizationTemplate) setModelRels(o *models.Organization) {
|
||||||
o.R.Files = rel
|
o.R.Files = rel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if t.r.FlyoverAerialServices != nil {
|
||||||
|
rel := models.FileuploadFlyoverAerialServiceSlice{}
|
||||||
|
for _, r := range t.r.FlyoverAerialServices {
|
||||||
|
related := r.o.BuildMany(r.number)
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.OrganizationID = o.ID // h2
|
||||||
|
rel.R.Organization = o
|
||||||
|
}
|
||||||
|
rel = append(rel, related...)
|
||||||
|
}
|
||||||
|
o.R.FlyoverAerialServices = rel
|
||||||
|
}
|
||||||
|
|
||||||
if t.r.Pools != nil {
|
if t.r.Pools != nil {
|
||||||
rel := models.FileuploadPoolSlice{}
|
rel := models.FileuploadPoolSlice{}
|
||||||
for _, r := range t.r.Pools {
|
for _, r := range t.r.Pools {
|
||||||
|
|
@ -1791,6 +1809,26 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isFlyoverAerialServicesDone, _ := organizationRelFlyoverAerialServicesCtx.Value(ctx)
|
||||||
|
if !isFlyoverAerialServicesDone && o.r.FlyoverAerialServices != nil {
|
||||||
|
ctx = organizationRelFlyoverAerialServicesCtx.WithValue(ctx, true)
|
||||||
|
for _, r := range o.r.FlyoverAerialServices {
|
||||||
|
if r.o.alreadyPersisted {
|
||||||
|
m.R.FlyoverAerialServices = append(m.R.FlyoverAerialServices, r.o.Build())
|
||||||
|
} else {
|
||||||
|
rel34, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = m.AttachFlyoverAerialServices(ctx, exec, rel34...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
isPoolsDone, _ := organizationRelPoolsCtx.Value(ctx)
|
isPoolsDone, _ := organizationRelPoolsCtx.Value(ctx)
|
||||||
if !isPoolsDone && o.r.Pools != nil {
|
if !isPoolsDone && o.r.Pools != nil {
|
||||||
ctx = organizationRelPoolsCtx.WithValue(ctx, true)
|
ctx = organizationRelPoolsCtx.WithValue(ctx, true)
|
||||||
|
|
@ -1798,12 +1836,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.Pools = append(m.R.Pools, r.o.Build())
|
m.R.Pools = append(m.R.Pools, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel34, err := r.o.CreateMany(ctx, exec, r.number)
|
rel35, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachPools(ctx, exec, rel34...)
|
err = m.AttachPools(ctx, exec, rel35...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1818,12 +1856,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.H3Aggregations = append(m.R.H3Aggregations, r.o.Build())
|
m.R.H3Aggregations = append(m.R.H3Aggregations, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel35, err := r.o.CreateMany(ctx, exec, r.number)
|
rel36, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachH3Aggregations(ctx, exec, rel35...)
|
err = m.AttachH3Aggregations(ctx, exec, rel36...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1838,12 +1876,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.NoteAudios = append(m.R.NoteAudios, r.o.Build())
|
m.R.NoteAudios = append(m.R.NoteAudios, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel36, err := r.o.CreateMany(ctx, exec, r.number)
|
rel37, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachNoteAudios(ctx, exec, rel36...)
|
err = m.AttachNoteAudios(ctx, exec, rel37...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1858,12 +1896,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.NoteImages = append(m.R.NoteImages, r.o.Build())
|
m.R.NoteImages = append(m.R.NoteImages, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel37, err := r.o.CreateMany(ctx, exec, r.number)
|
rel38, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachNoteImages(ctx, exec, rel37...)
|
err = m.AttachNoteImages(ctx, exec, rel38...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1877,12 +1915,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if o.r.ArcgisAccountAccount.o.alreadyPersisted {
|
if o.r.ArcgisAccountAccount.o.alreadyPersisted {
|
||||||
m.R.ArcgisAccountAccount = o.r.ArcgisAccountAccount.o.Build()
|
m.R.ArcgisAccountAccount = o.r.ArcgisAccountAccount.o.Build()
|
||||||
} else {
|
} else {
|
||||||
var rel38 *models.ArcgisAccount
|
var rel39 *models.ArcgisAccount
|
||||||
rel38, err = o.r.ArcgisAccountAccount.o.Create(ctx, exec)
|
rel39, err = o.r.ArcgisAccountAccount.o.Create(ctx, exec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = m.AttachArcgisAccountAccount(ctx, exec, rel38)
|
err = m.AttachArcgisAccountAccount(ctx, exec, rel39)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1896,12 +1934,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if o.r.FieldseekerServiceFeatureItemServiceFeature.o.alreadyPersisted {
|
if o.r.FieldseekerServiceFeatureItemServiceFeature.o.alreadyPersisted {
|
||||||
m.R.FieldseekerServiceFeatureItemServiceFeature = o.r.FieldseekerServiceFeatureItemServiceFeature.o.Build()
|
m.R.FieldseekerServiceFeatureItemServiceFeature = o.r.FieldseekerServiceFeatureItemServiceFeature.o.Build()
|
||||||
} else {
|
} else {
|
||||||
var rel39 *models.ArcgisServiceFeature
|
var rel40 *models.ArcgisServiceFeature
|
||||||
rel39, err = o.r.FieldseekerServiceFeatureItemServiceFeature.o.Create(ctx, exec)
|
rel40, err = o.r.FieldseekerServiceFeatureItemServiceFeature.o.Create(ctx, exec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = m.AttachFieldseekerServiceFeatureItemServiceFeature(ctx, exec, rel39)
|
err = m.AttachFieldseekerServiceFeatureItemServiceFeature(ctx, exec, rel40)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1916,12 +1954,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.Nuisances = append(m.R.Nuisances, r.o.Build())
|
m.R.Nuisances = append(m.R.Nuisances, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel40, err := r.o.CreateMany(ctx, exec, r.number)
|
rel41, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachNuisances(ctx, exec, rel40...)
|
err = m.AttachNuisances(ctx, exec, rel41...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1936,12 +1974,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.PublicreportPool = append(m.R.PublicreportPool, r.o.Build())
|
m.R.PublicreportPool = append(m.R.PublicreportPool, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel41, err := r.o.CreateMany(ctx, exec, r.number)
|
rel42, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachPublicreportPool(ctx, exec, rel41...)
|
err = m.AttachPublicreportPool(ctx, exec, rel42...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1956,12 +1994,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.Quicks = append(m.R.Quicks, r.o.Build())
|
m.R.Quicks = append(m.R.Quicks, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel42, err := r.o.CreateMany(ctx, exec, r.number)
|
rel43, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachQuicks(ctx, exec, rel42...)
|
err = m.AttachQuicks(ctx, exec, rel43...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -1976,12 +2014,12 @@ func (o *OrganizationTemplate) insertOptRels(ctx context.Context, exec bob.Execu
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.User = append(m.R.User, r.o.Build())
|
m.R.User = append(m.R.User, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel43, err := r.o.CreateMany(ctx, exec, r.number)
|
rel44, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachUser(ctx, exec, rel43...)
|
err = m.AttachUser(ctx, exec, rel44...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -5479,6 +5517,54 @@ func (m organizationMods) WithoutFiles() OrganizationMod {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m organizationMods) WithFlyoverAerialServices(number int, related *FileuploadFlyoverAerialServiceTemplate) OrganizationMod {
|
||||||
|
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
||||||
|
o.r.FlyoverAerialServices = []*organizationRFlyoverAerialServicesR{{
|
||||||
|
number: number,
|
||||||
|
o: related,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m organizationMods) WithNewFlyoverAerialServices(number int, mods ...FileuploadFlyoverAerialServiceMod) OrganizationMod {
|
||||||
|
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
||||||
|
related := o.f.NewFileuploadFlyoverAerialServiceWithContext(ctx, mods...)
|
||||||
|
m.WithFlyoverAerialServices(number, related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m organizationMods) AddFlyoverAerialServices(number int, related *FileuploadFlyoverAerialServiceTemplate) OrganizationMod {
|
||||||
|
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
||||||
|
o.r.FlyoverAerialServices = append(o.r.FlyoverAerialServices, &organizationRFlyoverAerialServicesR{
|
||||||
|
number: number,
|
||||||
|
o: related,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m organizationMods) AddNewFlyoverAerialServices(number int, mods ...FileuploadFlyoverAerialServiceMod) OrganizationMod {
|
||||||
|
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
||||||
|
related := o.f.NewFileuploadFlyoverAerialServiceWithContext(ctx, mods...)
|
||||||
|
m.AddFlyoverAerialServices(number, related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m organizationMods) AddExistingFlyoverAerialServices(existingModels ...*models.FileuploadFlyoverAerialService) OrganizationMod {
|
||||||
|
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
||||||
|
for _, em := range existingModels {
|
||||||
|
o.r.FlyoverAerialServices = append(o.r.FlyoverAerialServices, &organizationRFlyoverAerialServicesR{
|
||||||
|
o: o.f.FromExistingFileuploadFlyoverAerialService(em),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m organizationMods) WithoutFlyoverAerialServices() OrganizationMod {
|
||||||
|
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
||||||
|
o.r.FlyoverAerialServices = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (m organizationMods) WithPools(number int, related *FileuploadPoolTemplate) OrganizationMod {
|
func (m organizationMods) WithPools(number int, related *FileuploadPoolTemplate) OrganizationMod {
|
||||||
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
return OrganizationModFunc(func(ctx context.Context, o *OrganizationTemplate) {
|
||||||
o.r.Pools = []*organizationRPoolsR{{
|
o.r.Pools = []*organizationRPoolsR{{
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ type userR struct {
|
||||||
PublicUserUser []*userRPublicUserUserR
|
PublicUserUser []*userRPublicUserUserR
|
||||||
CreatorComplianceReportRequests []*userRCreatorComplianceReportRequestsR
|
CreatorComplianceReportRequests []*userRCreatorComplianceReportRequestsR
|
||||||
CreatorFiles []*userRCreatorFilesR
|
CreatorFiles []*userRCreatorFilesR
|
||||||
|
CreatorFlyoverAerialServices []*userRCreatorFlyoverAerialServicesR
|
||||||
FileuploadPool []*userRFileuploadPoolR
|
FileuploadPool []*userRFileuploadPoolR
|
||||||
CreatorNoteAudios []*userRCreatorNoteAudiosR
|
CreatorNoteAudios []*userRCreatorNoteAudiosR
|
||||||
DeletorNoteAudios []*userRDeletorNoteAudiosR
|
DeletorNoteAudios []*userRDeletorNoteAudiosR
|
||||||
|
|
@ -91,6 +92,10 @@ type userRCreatorFilesR struct {
|
||||||
number int
|
number int
|
||||||
o *FileuploadFileTemplate
|
o *FileuploadFileTemplate
|
||||||
}
|
}
|
||||||
|
type userRCreatorFlyoverAerialServicesR struct {
|
||||||
|
number int
|
||||||
|
o *FileuploadFlyoverAerialServiceTemplate
|
||||||
|
}
|
||||||
type userRFileuploadPoolR struct {
|
type userRFileuploadPoolR struct {
|
||||||
number int
|
number int
|
||||||
o *FileuploadPoolTemplate
|
o *FileuploadPoolTemplate
|
||||||
|
|
@ -193,6 +198,19 @@ func (t UserTemplate) setModelRels(o *models.User) {
|
||||||
o.R.CreatorFiles = rel
|
o.R.CreatorFiles = rel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if t.r.CreatorFlyoverAerialServices != nil {
|
||||||
|
rel := models.FileuploadFlyoverAerialServiceSlice{}
|
||||||
|
for _, r := range t.r.CreatorFlyoverAerialServices {
|
||||||
|
related := r.o.BuildMany(r.number)
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.CreatorID = o.ID // h2
|
||||||
|
rel.R.CreatorUser = o
|
||||||
|
}
|
||||||
|
rel = append(rel, related...)
|
||||||
|
}
|
||||||
|
o.R.CreatorFlyoverAerialServices = rel
|
||||||
|
}
|
||||||
|
|
||||||
if t.r.FileuploadPool != nil {
|
if t.r.FileuploadPool != nil {
|
||||||
rel := models.FileuploadPoolSlice{}
|
rel := models.FileuploadPoolSlice{}
|
||||||
for _, r := range t.r.FileuploadPool {
|
for _, r := range t.r.FileuploadPool {
|
||||||
|
|
@ -568,6 +586,26 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isCreatorFlyoverAerialServicesDone, _ := userRelCreatorFlyoverAerialServicesCtx.Value(ctx)
|
||||||
|
if !isCreatorFlyoverAerialServicesDone && o.r.CreatorFlyoverAerialServices != nil {
|
||||||
|
ctx = userRelCreatorFlyoverAerialServicesCtx.WithValue(ctx, true)
|
||||||
|
for _, r := range o.r.CreatorFlyoverAerialServices {
|
||||||
|
if r.o.alreadyPersisted {
|
||||||
|
m.R.CreatorFlyoverAerialServices = append(m.R.CreatorFlyoverAerialServices, r.o.Build())
|
||||||
|
} else {
|
||||||
|
rel4, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = m.AttachCreatorFlyoverAerialServices(ctx, exec, rel4...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
isFileuploadPoolDone, _ := userRelFileuploadPoolCtx.Value(ctx)
|
isFileuploadPoolDone, _ := userRelFileuploadPoolCtx.Value(ctx)
|
||||||
if !isFileuploadPoolDone && o.r.FileuploadPool != nil {
|
if !isFileuploadPoolDone && o.r.FileuploadPool != nil {
|
||||||
ctx = userRelFileuploadPoolCtx.WithValue(ctx, true)
|
ctx = userRelFileuploadPoolCtx.WithValue(ctx, true)
|
||||||
|
|
@ -575,12 +613,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.FileuploadPool = append(m.R.FileuploadPool, r.o.Build())
|
m.R.FileuploadPool = append(m.R.FileuploadPool, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel4, err := r.o.CreateMany(ctx, exec, r.number)
|
rel5, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachFileuploadPool(ctx, exec, rel4...)
|
err = m.AttachFileuploadPool(ctx, exec, rel5...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -595,12 +633,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.CreatorNoteAudios = append(m.R.CreatorNoteAudios, r.o.Build())
|
m.R.CreatorNoteAudios = append(m.R.CreatorNoteAudios, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel5, err := r.o.CreateMany(ctx, exec, r.number)
|
rel6, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachCreatorNoteAudios(ctx, exec, rel5...)
|
err = m.AttachCreatorNoteAudios(ctx, exec, rel6...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -615,12 +653,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.DeletorNoteAudios = append(m.R.DeletorNoteAudios, r.o.Build())
|
m.R.DeletorNoteAudios = append(m.R.DeletorNoteAudios, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel6, err := r.o.CreateMany(ctx, exec, r.number)
|
rel7, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachDeletorNoteAudios(ctx, exec, rel6...)
|
err = m.AttachDeletorNoteAudios(ctx, exec, rel7...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -635,12 +673,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.CreatorNoteImages = append(m.R.CreatorNoteImages, r.o.Build())
|
m.R.CreatorNoteImages = append(m.R.CreatorNoteImages, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel7, err := r.o.CreateMany(ctx, exec, r.number)
|
rel8, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachCreatorNoteImages(ctx, exec, rel7...)
|
err = m.AttachCreatorNoteImages(ctx, exec, rel8...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -655,12 +693,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.DeletorNoteImages = append(m.R.DeletorNoteImages, r.o.Build())
|
m.R.DeletorNoteImages = append(m.R.DeletorNoteImages, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel8, err := r.o.CreateMany(ctx, exec, r.number)
|
rel9, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachDeletorNoteImages(ctx, exec, rel8...)
|
err = m.AttachDeletorNoteImages(ctx, exec, rel9...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -675,12 +713,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.UserNotifications = append(m.R.UserNotifications, r.o.Build())
|
m.R.UserNotifications = append(m.R.UserNotifications, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel9, err := r.o.CreateMany(ctx, exec, r.number)
|
rel10, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachUserNotifications(ctx, exec, rel9...)
|
err = m.AttachUserNotifications(ctx, exec, rel10...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -695,12 +733,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.CreatorPools = append(m.R.CreatorPools, r.o.Build())
|
m.R.CreatorPools = append(m.R.CreatorPools, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel10, err := r.o.CreateMany(ctx, exec, r.number)
|
rel11, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachCreatorPools(ctx, exec, rel10...)
|
err = m.AttachCreatorPools(ctx, exec, rel11...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -715,12 +753,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.CreatorResidents = append(m.R.CreatorResidents, r.o.Build())
|
m.R.CreatorResidents = append(m.R.CreatorResidents, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel11, err := r.o.CreateMany(ctx, exec, r.number)
|
rel12, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachCreatorResidents(ctx, exec, rel11...)
|
err = m.AttachCreatorResidents(ctx, exec, rel12...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -735,12 +773,12 @@ func (o *UserTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *
|
||||||
if r.o.alreadyPersisted {
|
if r.o.alreadyPersisted {
|
||||||
m.R.CreatorSites = append(m.R.CreatorSites, r.o.Build())
|
m.R.CreatorSites = append(m.R.CreatorSites, r.o.Build())
|
||||||
} else {
|
} else {
|
||||||
rel12, err := r.o.CreateMany(ctx, exec, r.number)
|
rel13, err := r.o.CreateMany(ctx, exec, r.number)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.AttachCreatorSites(ctx, exec, rel12...)
|
err = m.AttachCreatorSites(ctx, exec, rel13...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -762,25 +800,25 @@ func (o *UserTemplate) Create(ctx context.Context, exec bob.Executor) (*models.U
|
||||||
UserMods.WithNewOrganization().Apply(ctx, o)
|
UserMods.WithNewOrganization().Apply(ctx, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
var rel13 *models.Organization
|
var rel14 *models.Organization
|
||||||
|
|
||||||
if o.r.Organization.o.alreadyPersisted {
|
if o.r.Organization.o.alreadyPersisted {
|
||||||
rel13 = o.r.Organization.o.Build()
|
rel14 = o.r.Organization.o.Build()
|
||||||
} else {
|
} else {
|
||||||
rel13, err = o.r.Organization.o.Create(ctx, exec)
|
rel14, err = o.r.Organization.o.Create(ctx, exec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
opt.OrganizationID = omit.From(rel13.ID)
|
opt.OrganizationID = omit.From(rel14.ID)
|
||||||
|
|
||||||
m, err := models.Users.Insert(opt).One(ctx, exec)
|
m, err := models.Users.Insert(opt).One(ctx, exec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
m.R.Organization = rel13
|
m.R.Organization = rel14
|
||||||
|
|
||||||
if err := o.insertOptRels(ctx, exec, m); err != nil {
|
if err := o.insertOptRels(ctx, exec, m); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -1646,6 +1684,54 @@ func (m userMods) WithoutCreatorFiles() UserMod {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m userMods) WithCreatorFlyoverAerialServices(number int, related *FileuploadFlyoverAerialServiceTemplate) UserMod {
|
||||||
|
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
||||||
|
o.r.CreatorFlyoverAerialServices = []*userRCreatorFlyoverAerialServicesR{{
|
||||||
|
number: number,
|
||||||
|
o: related,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m userMods) WithNewCreatorFlyoverAerialServices(number int, mods ...FileuploadFlyoverAerialServiceMod) UserMod {
|
||||||
|
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
||||||
|
related := o.f.NewFileuploadFlyoverAerialServiceWithContext(ctx, mods...)
|
||||||
|
m.WithCreatorFlyoverAerialServices(number, related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m userMods) AddCreatorFlyoverAerialServices(number int, related *FileuploadFlyoverAerialServiceTemplate) UserMod {
|
||||||
|
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
||||||
|
o.r.CreatorFlyoverAerialServices = append(o.r.CreatorFlyoverAerialServices, &userRCreatorFlyoverAerialServicesR{
|
||||||
|
number: number,
|
||||||
|
o: related,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m userMods) AddNewCreatorFlyoverAerialServices(number int, mods ...FileuploadFlyoverAerialServiceMod) UserMod {
|
||||||
|
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
||||||
|
related := o.f.NewFileuploadFlyoverAerialServiceWithContext(ctx, mods...)
|
||||||
|
m.AddCreatorFlyoverAerialServices(number, related).Apply(ctx, o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m userMods) AddExistingCreatorFlyoverAerialServices(existingModels ...*models.FileuploadFlyoverAerialService) UserMod {
|
||||||
|
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
||||||
|
for _, em := range existingModels {
|
||||||
|
o.r.CreatorFlyoverAerialServices = append(o.r.CreatorFlyoverAerialServices, &userRCreatorFlyoverAerialServicesR{
|
||||||
|
o: o.f.FromExistingFileuploadFlyoverAerialService(em),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m userMods) WithoutCreatorFlyoverAerialServices() UserMod {
|
||||||
|
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
||||||
|
o.r.CreatorFlyoverAerialServices = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (m userMods) WithFileuploadPool(number int, related *FileuploadPoolTemplate) UserMod {
|
func (m userMods) WithFileuploadPool(number int, related *FileuploadPoolTemplate) UserMod {
|
||||||
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
return UserModFunc(func(ctx context.Context, o *UserTemplate) {
|
||||||
o.r.FileuploadPool = []*userRFileuploadPoolR{{
|
o.r.FileuploadPool = []*userRFileuploadPoolR{{
|
||||||
|
|
|
||||||
18
db/migrations/00074_fileupload_pool_aerial_services.sql
Normal file
18
db/migrations/00074_fileupload_pool_aerial_services.sql
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
-- +goose Up
|
||||||
|
ALTER TYPE fileupload.CSVType ADD VALUE 'Flyover' AFTER 'PoolList';
|
||||||
|
CREATE TABLE fileupload.flyover_aerial_service (
|
||||||
|
committed BOOLEAN NOT NULL, -- Whether or not its just proposed before a CSV file is committed
|
||||||
|
condition fileupload.PoolConditionType NOT NULL,
|
||||||
|
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
|
||||||
|
creator_id INTEGER REFERENCES user_(id) NOT NULL,
|
||||||
|
csv_file INTEGER REFERENCES fileupload.csv(file_id) NOT NULL,
|
||||||
|
deleted TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
geom geometry(Point, 4326),
|
||||||
|
h3cell h3index,
|
||||||
|
id SERIAL,
|
||||||
|
organization_id INTEGER REFERENCES organization(id) NOT NULL,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
-- +goose Down
|
||||||
|
DROP TABLE fileupload.flyover_aerial_services;
|
||||||
|
ALTER TYPE fileupload.CSVType DROP VALUE 'Flyover';
|
||||||
3
db/migrations/00075_address_parcel_geom_index.sql
Normal file
3
db/migrations/00075_address_parcel_geom_index.sql
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
-- +goose Up
|
||||||
|
CREATE INDEX idx_address_geom ON address USING GIST (geom);
|
||||||
|
CREATE INDEX idx_parcel_geometry ON parcel USING GIST (geometry);
|
||||||
16
db/migrations/00076_func_gen_alpha_code.sql
Normal file
16
db/migrations/00076_func_gen_alpha_code.sql
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
-- +goose Up
|
||||||
|
-- +goose StatementBegin
|
||||||
|
CREATE OR REPLACE FUNCTION generate_alphanumeric_code(code_length INTEGER DEFAULT 8)
|
||||||
|
RETURNS TEXT AS $$
|
||||||
|
DECLARE
|
||||||
|
chars TEXT := 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
|
||||||
|
result TEXT := '';
|
||||||
|
i INTEGER;
|
||||||
|
BEGIN
|
||||||
|
FOR i IN 1..code_length LOOP
|
||||||
|
result := result || substr(chars, floor(random() * length(chars) + 1)::INTEGER, 1);
|
||||||
|
END LOOP;
|
||||||
|
RETURN result;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
-- +goose StatementEnd
|
||||||
|
|
@ -84,6 +84,7 @@ type joins[Q dialect.Joinable] struct {
|
||||||
FileuploadErrorCSVS joinSet[fileuploadErrorCSVJoins[Q]]
|
FileuploadErrorCSVS joinSet[fileuploadErrorCSVJoins[Q]]
|
||||||
FileuploadErrorFiles joinSet[fileuploadErrorFileJoins[Q]]
|
FileuploadErrorFiles joinSet[fileuploadErrorFileJoins[Q]]
|
||||||
FileuploadFiles joinSet[fileuploadFileJoins[Q]]
|
FileuploadFiles joinSet[fileuploadFileJoins[Q]]
|
||||||
|
FileuploadFlyoverAerialServices joinSet[fileuploadFlyoverAerialServiceJoins[Q]]
|
||||||
FileuploadPools joinSet[fileuploadPoolJoins[Q]]
|
FileuploadPools joinSet[fileuploadPoolJoins[Q]]
|
||||||
H3Aggregations joinSet[h3AggregationJoins[Q]]
|
H3Aggregations joinSet[h3AggregationJoins[Q]]
|
||||||
NoteAudios joinSet[noteAudioJoins[Q]]
|
NoteAudios joinSet[noteAudioJoins[Q]]
|
||||||
|
|
@ -177,6 +178,7 @@ func getJoins[Q dialect.Joinable]() joins[Q] {
|
||||||
FileuploadErrorCSVS: buildJoinSet[fileuploadErrorCSVJoins[Q]](FileuploadErrorCSVS.Columns, buildFileuploadErrorCSVJoins),
|
FileuploadErrorCSVS: buildJoinSet[fileuploadErrorCSVJoins[Q]](FileuploadErrorCSVS.Columns, buildFileuploadErrorCSVJoins),
|
||||||
FileuploadErrorFiles: buildJoinSet[fileuploadErrorFileJoins[Q]](FileuploadErrorFiles.Columns, buildFileuploadErrorFileJoins),
|
FileuploadErrorFiles: buildJoinSet[fileuploadErrorFileJoins[Q]](FileuploadErrorFiles.Columns, buildFileuploadErrorFileJoins),
|
||||||
FileuploadFiles: buildJoinSet[fileuploadFileJoins[Q]](FileuploadFiles.Columns, buildFileuploadFileJoins),
|
FileuploadFiles: buildJoinSet[fileuploadFileJoins[Q]](FileuploadFiles.Columns, buildFileuploadFileJoins),
|
||||||
|
FileuploadFlyoverAerialServices: buildJoinSet[fileuploadFlyoverAerialServiceJoins[Q]](FileuploadFlyoverAerialServices.Columns, buildFileuploadFlyoverAerialServiceJoins),
|
||||||
FileuploadPools: buildJoinSet[fileuploadPoolJoins[Q]](FileuploadPools.Columns, buildFileuploadPoolJoins),
|
FileuploadPools: buildJoinSet[fileuploadPoolJoins[Q]](FileuploadPools.Columns, buildFileuploadPoolJoins),
|
||||||
H3Aggregations: buildJoinSet[h3AggregationJoins[Q]](H3Aggregations.Columns, buildH3AggregationJoins),
|
H3Aggregations: buildJoinSet[h3AggregationJoins[Q]](H3Aggregations.Columns, buildH3AggregationJoins),
|
||||||
NoteAudios: buildJoinSet[noteAudioJoins[Q]](NoteAudios.Columns, buildNoteAudioJoins),
|
NoteAudios: buildJoinSet[noteAudioJoins[Q]](NoteAudios.Columns, buildNoteAudioJoins),
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ type preloaders struct {
|
||||||
FileuploadErrorCSV fileuploadErrorCSVPreloader
|
FileuploadErrorCSV fileuploadErrorCSVPreloader
|
||||||
FileuploadErrorFile fileuploadErrorFilePreloader
|
FileuploadErrorFile fileuploadErrorFilePreloader
|
||||||
FileuploadFile fileuploadFilePreloader
|
FileuploadFile fileuploadFilePreloader
|
||||||
|
FileuploadFlyoverAerialService fileuploadFlyoverAerialServicePreloader
|
||||||
FileuploadPool fileuploadPoolPreloader
|
FileuploadPool fileuploadPoolPreloader
|
||||||
H3Aggregation h3AggregationPreloader
|
H3Aggregation h3AggregationPreloader
|
||||||
NoteAudio noteAudioPreloader
|
NoteAudio noteAudioPreloader
|
||||||
|
|
@ -154,6 +155,7 @@ func getPreloaders() preloaders {
|
||||||
FileuploadErrorCSV: buildFileuploadErrorCSVPreloader(),
|
FileuploadErrorCSV: buildFileuploadErrorCSVPreloader(),
|
||||||
FileuploadErrorFile: buildFileuploadErrorFilePreloader(),
|
FileuploadErrorFile: buildFileuploadErrorFilePreloader(),
|
||||||
FileuploadFile: buildFileuploadFilePreloader(),
|
FileuploadFile: buildFileuploadFilePreloader(),
|
||||||
|
FileuploadFlyoverAerialService: buildFileuploadFlyoverAerialServicePreloader(),
|
||||||
FileuploadPool: buildFileuploadPoolPreloader(),
|
FileuploadPool: buildFileuploadPoolPreloader(),
|
||||||
H3Aggregation: buildH3AggregationPreloader(),
|
H3Aggregation: buildH3AggregationPreloader(),
|
||||||
NoteAudio: buildNoteAudioPreloader(),
|
NoteAudio: buildNoteAudioPreloader(),
|
||||||
|
|
@ -245,6 +247,7 @@ type thenLoaders[Q orm.Loadable] struct {
|
||||||
FileuploadErrorCSV fileuploadErrorCSVThenLoader[Q]
|
FileuploadErrorCSV fileuploadErrorCSVThenLoader[Q]
|
||||||
FileuploadErrorFile fileuploadErrorFileThenLoader[Q]
|
FileuploadErrorFile fileuploadErrorFileThenLoader[Q]
|
||||||
FileuploadFile fileuploadFileThenLoader[Q]
|
FileuploadFile fileuploadFileThenLoader[Q]
|
||||||
|
FileuploadFlyoverAerialService fileuploadFlyoverAerialServiceThenLoader[Q]
|
||||||
FileuploadPool fileuploadPoolThenLoader[Q]
|
FileuploadPool fileuploadPoolThenLoader[Q]
|
||||||
H3Aggregation h3AggregationThenLoader[Q]
|
H3Aggregation h3AggregationThenLoader[Q]
|
||||||
NoteAudio noteAudioThenLoader[Q]
|
NoteAudio noteAudioThenLoader[Q]
|
||||||
|
|
@ -330,6 +333,7 @@ func getThenLoaders[Q orm.Loadable]() thenLoaders[Q] {
|
||||||
FileuploadErrorCSV: buildFileuploadErrorCSVThenLoader[Q](),
|
FileuploadErrorCSV: buildFileuploadErrorCSVThenLoader[Q](),
|
||||||
FileuploadErrorFile: buildFileuploadErrorFileThenLoader[Q](),
|
FileuploadErrorFile: buildFileuploadErrorFileThenLoader[Q](),
|
||||||
FileuploadFile: buildFileuploadFileThenLoader[Q](),
|
FileuploadFile: buildFileuploadFileThenLoader[Q](),
|
||||||
|
FileuploadFlyoverAerialService: buildFileuploadFlyoverAerialServiceThenLoader[Q](),
|
||||||
FileuploadPool: buildFileuploadPoolThenLoader[Q](),
|
FileuploadPool: buildFileuploadPoolThenLoader[Q](),
|
||||||
H3Aggregation: buildH3AggregationThenLoader[Q](),
|
H3Aggregation: buildH3AggregationThenLoader[Q](),
|
||||||
NoteAudio: buildNoteAudioThenLoader[Q](),
|
NoteAudio: buildNoteAudioThenLoader[Q](),
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ func Where[Q psql.Filterable]() struct {
|
||||||
FileuploadErrorCSVS fileuploadErrorCSVWhere[Q]
|
FileuploadErrorCSVS fileuploadErrorCSVWhere[Q]
|
||||||
FileuploadErrorFiles fileuploadErrorFileWhere[Q]
|
FileuploadErrorFiles fileuploadErrorFileWhere[Q]
|
||||||
FileuploadFiles fileuploadFileWhere[Q]
|
FileuploadFiles fileuploadFileWhere[Q]
|
||||||
|
FileuploadFlyoverAerialServices fileuploadFlyoverAerialServiceWhere[Q]
|
||||||
FileuploadPools fileuploadPoolWhere[Q]
|
FileuploadPools fileuploadPoolWhere[Q]
|
||||||
GeographyColumns geographyColumnWhere[Q]
|
GeographyColumns geographyColumnWhere[Q]
|
||||||
GeometryColumns geometryColumnWhere[Q]
|
GeometryColumns geometryColumnWhere[Q]
|
||||||
|
|
@ -162,6 +163,7 @@ func Where[Q psql.Filterable]() struct {
|
||||||
FileuploadErrorCSVS fileuploadErrorCSVWhere[Q]
|
FileuploadErrorCSVS fileuploadErrorCSVWhere[Q]
|
||||||
FileuploadErrorFiles fileuploadErrorFileWhere[Q]
|
FileuploadErrorFiles fileuploadErrorFileWhere[Q]
|
||||||
FileuploadFiles fileuploadFileWhere[Q]
|
FileuploadFiles fileuploadFileWhere[Q]
|
||||||
|
FileuploadFlyoverAerialServices fileuploadFlyoverAerialServiceWhere[Q]
|
||||||
FileuploadPools fileuploadPoolWhere[Q]
|
FileuploadPools fileuploadPoolWhere[Q]
|
||||||
GeographyColumns geographyColumnWhere[Q]
|
GeographyColumns geographyColumnWhere[Q]
|
||||||
GeometryColumns geometryColumnWhere[Q]
|
GeometryColumns geometryColumnWhere[Q]
|
||||||
|
|
@ -253,6 +255,7 @@ func Where[Q psql.Filterable]() struct {
|
||||||
FileuploadErrorCSVS: buildFileuploadErrorCSVWhere[Q](FileuploadErrorCSVS.Columns),
|
FileuploadErrorCSVS: buildFileuploadErrorCSVWhere[Q](FileuploadErrorCSVS.Columns),
|
||||||
FileuploadErrorFiles: buildFileuploadErrorFileWhere[Q](FileuploadErrorFiles.Columns),
|
FileuploadErrorFiles: buildFileuploadErrorFileWhere[Q](FileuploadErrorFiles.Columns),
|
||||||
FileuploadFiles: buildFileuploadFileWhere[Q](FileuploadFiles.Columns),
|
FileuploadFiles: buildFileuploadFileWhere[Q](FileuploadFiles.Columns),
|
||||||
|
FileuploadFlyoverAerialServices: buildFileuploadFlyoverAerialServiceWhere[Q](FileuploadFlyoverAerialServices.Columns),
|
||||||
FileuploadPools: buildFileuploadPoolWhere[Q](FileuploadPools.Columns),
|
FileuploadPools: buildFileuploadPoolWhere[Q](FileuploadPools.Columns),
|
||||||
GeographyColumns: buildGeographyColumnWhere[Q](GeographyColumns.Columns),
|
GeographyColumns: buildGeographyColumnWhere[Q](GeographyColumns.Columns),
|
||||||
GeometryColumns: buildGeometryColumnWhere[Q](GeometryColumns.Columns),
|
GeometryColumns: buildGeometryColumnWhere[Q](GeometryColumns.Columns),
|
||||||
|
|
|
||||||
|
|
@ -49,9 +49,10 @@ type FileuploadCSVSQuery = *psql.ViewQuery[*FileuploadCSV, FileuploadCSVSlice]
|
||||||
|
|
||||||
// fileuploadCSVR is where relationships are stored.
|
// fileuploadCSVR is where relationships are stored.
|
||||||
type fileuploadCSVR struct {
|
type fileuploadCSVR struct {
|
||||||
File *FileuploadFile // fileupload.csv.csv_file_id_fkey
|
File *FileuploadFile // fileupload.csv.csv_file_id_fkey
|
||||||
CSVFileErrorCSVS FileuploadErrorCSVSlice // fileupload.error_csv.error_csv_csv_file_id_fkey
|
CSVFileErrorCSVS FileuploadErrorCSVSlice // fileupload.error_csv.error_csv_csv_file_id_fkey
|
||||||
CSVFilePools FileuploadPoolSlice // fileupload.pool.pool_csv_file_fkey
|
CSVFileFlyoverAerialServices FileuploadFlyoverAerialServiceSlice // fileupload.flyover_aerial_service.flyover_aerial_service_csv_file_fkey
|
||||||
|
CSVFilePools FileuploadPoolSlice // fileupload.pool.pool_csv_file_fkey
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildFileuploadCSVColumns(alias string) fileuploadCSVColumns {
|
func buildFileuploadCSVColumns(alias string) fileuploadCSVColumns {
|
||||||
|
|
@ -470,6 +471,30 @@ func (os FileuploadCSVSlice) CSVFileErrorCSVS(mods ...bob.Mod[*dialect.SelectQue
|
||||||
)...)
|
)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CSVFileFlyoverAerialServices starts a query for related objects on fileupload.flyover_aerial_service
|
||||||
|
func (o *FileuploadCSV) CSVFileFlyoverAerialServices(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadFlyoverAerialServicesQuery {
|
||||||
|
return FileuploadFlyoverAerialServices.Query(append(mods,
|
||||||
|
sm.Where(FileuploadFlyoverAerialServices.Columns.CSVFile.EQ(psql.Arg(o.FileID))),
|
||||||
|
)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (os FileuploadCSVSlice) CSVFileFlyoverAerialServices(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadFlyoverAerialServicesQuery {
|
||||||
|
pkFileID := make(pgtypes.Array[int32], 0, len(os))
|
||||||
|
for _, o := range os {
|
||||||
|
if o == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pkFileID = append(pkFileID, o.FileID)
|
||||||
|
}
|
||||||
|
PKArgExpr := psql.Select(sm.Columns(
|
||||||
|
psql.F("unnest", psql.Cast(psql.Arg(pkFileID), "integer[]")),
|
||||||
|
))
|
||||||
|
|
||||||
|
return FileuploadFlyoverAerialServices.Query(append(mods,
|
||||||
|
sm.Where(psql.Group(FileuploadFlyoverAerialServices.Columns.CSVFile).OP("IN", PKArgExpr)),
|
||||||
|
)...)
|
||||||
|
}
|
||||||
|
|
||||||
// CSVFilePools starts a query for related objects on fileupload.pool
|
// CSVFilePools starts a query for related objects on fileupload.pool
|
||||||
func (o *FileuploadCSV) CSVFilePools(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadPoolsQuery {
|
func (o *FileuploadCSV) CSVFilePools(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadPoolsQuery {
|
||||||
return FileuploadPools.Query(append(mods,
|
return FileuploadPools.Query(append(mods,
|
||||||
|
|
@ -610,6 +635,74 @@ func (fileuploadCSV0 *FileuploadCSV) AttachCSVFileErrorCSVS(ctx context.Context,
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func insertFileuploadCSVCSVFileFlyoverAerialServices0(ctx context.Context, exec bob.Executor, fileuploadFlyoverAerialServices1 []*FileuploadFlyoverAerialServiceSetter, fileuploadCSV0 *FileuploadCSV) (FileuploadFlyoverAerialServiceSlice, error) {
|
||||||
|
for i := range fileuploadFlyoverAerialServices1 {
|
||||||
|
fileuploadFlyoverAerialServices1[i].CSVFile = omit.From(fileuploadCSV0.FileID)
|
||||||
|
}
|
||||||
|
|
||||||
|
ret, err := FileuploadFlyoverAerialServices.Insert(bob.ToMods(fileuploadFlyoverAerialServices1...)).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return ret, fmt.Errorf("insertFileuploadCSVCSVFileFlyoverAerialServices0: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func attachFileuploadCSVCSVFileFlyoverAerialServices0(ctx context.Context, exec bob.Executor, count int, fileuploadFlyoverAerialServices1 FileuploadFlyoverAerialServiceSlice, fileuploadCSV0 *FileuploadCSV) (FileuploadFlyoverAerialServiceSlice, error) {
|
||||||
|
setter := &FileuploadFlyoverAerialServiceSetter{
|
||||||
|
CSVFile: omit.From(fileuploadCSV0.FileID),
|
||||||
|
}
|
||||||
|
|
||||||
|
err := fileuploadFlyoverAerialServices1.UpdateAll(ctx, exec, *setter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("attachFileuploadCSVCSVFileFlyoverAerialServices0: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileuploadFlyoverAerialServices1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fileuploadCSV0 *FileuploadCSV) InsertCSVFileFlyoverAerialServices(ctx context.Context, exec bob.Executor, related ...*FileuploadFlyoverAerialServiceSetter) error {
|
||||||
|
if len(related) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
fileuploadFlyoverAerialServices1, err := insertFileuploadCSVCSVFileFlyoverAerialServices0(ctx, exec, related, fileuploadCSV0)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fileuploadCSV0.R.CSVFileFlyoverAerialServices = append(fileuploadCSV0.R.CSVFileFlyoverAerialServices, fileuploadFlyoverAerialServices1...)
|
||||||
|
|
||||||
|
for _, rel := range fileuploadFlyoverAerialServices1 {
|
||||||
|
rel.R.CSVFileCSV = fileuploadCSV0
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fileuploadCSV0 *FileuploadCSV) AttachCSVFileFlyoverAerialServices(ctx context.Context, exec bob.Executor, related ...*FileuploadFlyoverAerialService) error {
|
||||||
|
if len(related) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
fileuploadFlyoverAerialServices1 := FileuploadFlyoverAerialServiceSlice(related)
|
||||||
|
|
||||||
|
_, err = attachFileuploadCSVCSVFileFlyoverAerialServices0(ctx, exec, len(related), fileuploadFlyoverAerialServices1, fileuploadCSV0)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fileuploadCSV0.R.CSVFileFlyoverAerialServices = append(fileuploadCSV0.R.CSVFileFlyoverAerialServices, fileuploadFlyoverAerialServices1...)
|
||||||
|
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.R.CSVFileCSV = fileuploadCSV0
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func insertFileuploadCSVCSVFilePools0(ctx context.Context, exec bob.Executor, fileuploadPools1 []*FileuploadPoolSetter, fileuploadCSV0 *FileuploadCSV) (FileuploadPoolSlice, error) {
|
func insertFileuploadCSVCSVFilePools0(ctx context.Context, exec bob.Executor, fileuploadPools1 []*FileuploadPoolSetter, fileuploadCSV0 *FileuploadCSV) (FileuploadPoolSlice, error) {
|
||||||
for i := range fileuploadPools1 {
|
for i := range fileuploadPools1 {
|
||||||
fileuploadPools1[i].CSVFile = omit.From(fileuploadCSV0.FileID)
|
fileuploadPools1[i].CSVFile = omit.From(fileuploadCSV0.FileID)
|
||||||
|
|
@ -724,6 +817,20 @@ func (o *FileuploadCSV) Preload(name string, retrieved any) error {
|
||||||
|
|
||||||
o.R.CSVFileErrorCSVS = rels
|
o.R.CSVFileErrorCSVS = rels
|
||||||
|
|
||||||
|
for _, rel := range rels {
|
||||||
|
if rel != nil {
|
||||||
|
rel.R.CSVFileCSV = o
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
case "CSVFileFlyoverAerialServices":
|
||||||
|
rels, ok := retrieved.(FileuploadFlyoverAerialServiceSlice)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("fileuploadCSV cannot load %T as %q", retrieved, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.CSVFileFlyoverAerialServices = rels
|
||||||
|
|
||||||
for _, rel := range rels {
|
for _, rel := range rels {
|
||||||
if rel != nil {
|
if rel != nil {
|
||||||
rel.R.CSVFileCSV = o
|
rel.R.CSVFileCSV = o
|
||||||
|
|
@ -772,9 +879,10 @@ func buildFileuploadCSVPreloader() fileuploadCSVPreloader {
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileuploadCSVThenLoader[Q orm.Loadable] struct {
|
type fileuploadCSVThenLoader[Q orm.Loadable] struct {
|
||||||
File func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
File func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CSVFileErrorCSVS func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CSVFileErrorCSVS func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CSVFilePools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CSVFileFlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
CSVFilePools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildFileuploadCSVThenLoader[Q orm.Loadable]() fileuploadCSVThenLoader[Q] {
|
func buildFileuploadCSVThenLoader[Q orm.Loadable]() fileuploadCSVThenLoader[Q] {
|
||||||
|
|
@ -784,6 +892,9 @@ func buildFileuploadCSVThenLoader[Q orm.Loadable]() fileuploadCSVThenLoader[Q] {
|
||||||
type CSVFileErrorCSVSLoadInterface interface {
|
type CSVFileErrorCSVSLoadInterface interface {
|
||||||
LoadCSVFileErrorCSVS(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCSVFileErrorCSVS(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
type CSVFileFlyoverAerialServicesLoadInterface interface {
|
||||||
|
LoadCSVFileFlyoverAerialServices(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
|
}
|
||||||
type CSVFilePoolsLoadInterface interface {
|
type CSVFilePoolsLoadInterface interface {
|
||||||
LoadCSVFilePools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCSVFilePools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
|
@ -801,6 +912,12 @@ func buildFileuploadCSVThenLoader[Q orm.Loadable]() fileuploadCSVThenLoader[Q] {
|
||||||
return retrieved.LoadCSVFileErrorCSVS(ctx, exec, mods...)
|
return retrieved.LoadCSVFileErrorCSVS(ctx, exec, mods...)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
CSVFileFlyoverAerialServices: thenLoadBuilder[Q](
|
||||||
|
"CSVFileFlyoverAerialServices",
|
||||||
|
func(ctx context.Context, exec bob.Executor, retrieved CSVFileFlyoverAerialServicesLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
return retrieved.LoadCSVFileFlyoverAerialServices(ctx, exec, mods...)
|
||||||
|
},
|
||||||
|
),
|
||||||
CSVFilePools: thenLoadBuilder[Q](
|
CSVFilePools: thenLoadBuilder[Q](
|
||||||
"CSVFilePools",
|
"CSVFilePools",
|
||||||
func(ctx context.Context, exec bob.Executor, retrieved CSVFilePoolsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func(ctx context.Context, exec bob.Executor, retrieved CSVFilePoolsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
|
@ -923,6 +1040,67 @@ func (os FileuploadCSVSlice) LoadCSVFileErrorCSVS(ctx context.Context, exec bob.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadCSVFileFlyoverAerialServices loads the fileuploadCSV's CSVFileFlyoverAerialServices into the .R struct
|
||||||
|
func (o *FileuploadCSV) LoadCSVFileFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if o == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the relationship
|
||||||
|
o.R.CSVFileFlyoverAerialServices = nil
|
||||||
|
|
||||||
|
related, err := o.CSVFileFlyoverAerialServices(mods...).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.R.CSVFileCSV = o
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.CSVFileFlyoverAerialServices = related
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadCSVFileFlyoverAerialServices loads the fileuploadCSV's CSVFileFlyoverAerialServices into the .R struct
|
||||||
|
func (os FileuploadCSVSlice) LoadCSVFileFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if len(os) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
fileuploadFlyoverAerialServices, err := os.CSVFileFlyoverAerialServices(mods...).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, o := range os {
|
||||||
|
if o == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.CSVFileFlyoverAerialServices = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, o := range os {
|
||||||
|
if o == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rel := range fileuploadFlyoverAerialServices {
|
||||||
|
|
||||||
|
if !(o.FileID == rel.CSVFile) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
rel.R.CSVFileCSV = o
|
||||||
|
|
||||||
|
o.R.CSVFileFlyoverAerialServices = append(o.R.CSVFileFlyoverAerialServices, rel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// LoadCSVFilePools loads the fileuploadCSV's CSVFilePools into the .R struct
|
// LoadCSVFilePools loads the fileuploadCSV's CSVFilePools into the .R struct
|
||||||
func (o *FileuploadCSV) LoadCSVFilePools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func (o *FileuploadCSV) LoadCSVFilePools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
if o == nil {
|
if o == nil {
|
||||||
|
|
@ -986,8 +1164,9 @@ func (os FileuploadCSVSlice) LoadCSVFilePools(ctx context.Context, exec bob.Exec
|
||||||
|
|
||||||
// fileuploadCSVC is where relationship counts are stored.
|
// fileuploadCSVC is where relationship counts are stored.
|
||||||
type fileuploadCSVC struct {
|
type fileuploadCSVC struct {
|
||||||
CSVFileErrorCSVS *int64
|
CSVFileErrorCSVS *int64
|
||||||
CSVFilePools *int64
|
CSVFileFlyoverAerialServices *int64
|
||||||
|
CSVFilePools *int64
|
||||||
}
|
}
|
||||||
|
|
||||||
// PreloadCount sets a count in the C struct by name
|
// PreloadCount sets a count in the C struct by name
|
||||||
|
|
@ -999,6 +1178,8 @@ func (o *FileuploadCSV) PreloadCount(name string, count int64) error {
|
||||||
switch name {
|
switch name {
|
||||||
case "CSVFileErrorCSVS":
|
case "CSVFileErrorCSVS":
|
||||||
o.C.CSVFileErrorCSVS = &count
|
o.C.CSVFileErrorCSVS = &count
|
||||||
|
case "CSVFileFlyoverAerialServices":
|
||||||
|
o.C.CSVFileFlyoverAerialServices = &count
|
||||||
case "CSVFilePools":
|
case "CSVFilePools":
|
||||||
o.C.CSVFilePools = &count
|
o.C.CSVFilePools = &count
|
||||||
}
|
}
|
||||||
|
|
@ -1006,8 +1187,9 @@ func (o *FileuploadCSV) PreloadCount(name string, count int64) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileuploadCSVCountPreloader struct {
|
type fileuploadCSVCountPreloader struct {
|
||||||
CSVFileErrorCSVS func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
CSVFileErrorCSVS func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
CSVFilePools func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
CSVFileFlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
|
CSVFilePools func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildFileuploadCSVCountPreloader() fileuploadCSVCountPreloader {
|
func buildFileuploadCSVCountPreloader() fileuploadCSVCountPreloader {
|
||||||
|
|
@ -1029,6 +1211,23 @@ func buildFileuploadCSVCountPreloader() fileuploadCSVCountPreloader {
|
||||||
return psql.Group(psql.Select(subqueryMods...).Expression)
|
return psql.Group(psql.Select(subqueryMods...).Expression)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
CSVFileFlyoverAerialServices: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
||||||
|
return countPreloader[*FileuploadCSV]("CSVFileFlyoverAerialServices", func(parent string) bob.Expression {
|
||||||
|
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
||||||
|
if parent == "" {
|
||||||
|
parent = FileuploadCSVS.Alias()
|
||||||
|
}
|
||||||
|
|
||||||
|
subqueryMods := []bob.Mod[*dialect.SelectQuery]{
|
||||||
|
sm.Columns(psql.Raw("count(*)")),
|
||||||
|
|
||||||
|
sm.From(FileuploadFlyoverAerialServices.Name()),
|
||||||
|
sm.Where(psql.Quote(FileuploadFlyoverAerialServices.Alias(), "csv_file").EQ(psql.Quote(parent, "file_id"))),
|
||||||
|
}
|
||||||
|
subqueryMods = append(subqueryMods, mods...)
|
||||||
|
return psql.Group(psql.Select(subqueryMods...).Expression)
|
||||||
|
})
|
||||||
|
},
|
||||||
CSVFilePools: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
CSVFilePools: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
||||||
return countPreloader[*FileuploadCSV]("CSVFilePools", func(parent string) bob.Expression {
|
return countPreloader[*FileuploadCSV]("CSVFilePools", func(parent string) bob.Expression {
|
||||||
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
||||||
|
|
@ -1050,14 +1249,18 @@ func buildFileuploadCSVCountPreloader() fileuploadCSVCountPreloader {
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileuploadCSVCountThenLoader[Q orm.Loadable] struct {
|
type fileuploadCSVCountThenLoader[Q orm.Loadable] struct {
|
||||||
CSVFileErrorCSVS func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CSVFileErrorCSVS func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CSVFilePools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CSVFileFlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
CSVFilePools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildFileuploadCSVCountThenLoader[Q orm.Loadable]() fileuploadCSVCountThenLoader[Q] {
|
func buildFileuploadCSVCountThenLoader[Q orm.Loadable]() fileuploadCSVCountThenLoader[Q] {
|
||||||
type CSVFileErrorCSVSCountInterface interface {
|
type CSVFileErrorCSVSCountInterface interface {
|
||||||
LoadCountCSVFileErrorCSVS(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCountCSVFileErrorCSVS(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
type CSVFileFlyoverAerialServicesCountInterface interface {
|
||||||
|
LoadCountCSVFileFlyoverAerialServices(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
|
}
|
||||||
type CSVFilePoolsCountInterface interface {
|
type CSVFilePoolsCountInterface interface {
|
||||||
LoadCountCSVFilePools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCountCSVFilePools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
|
@ -1069,6 +1272,12 @@ func buildFileuploadCSVCountThenLoader[Q orm.Loadable]() fileuploadCSVCountThenL
|
||||||
return retrieved.LoadCountCSVFileErrorCSVS(ctx, exec, mods...)
|
return retrieved.LoadCountCSVFileErrorCSVS(ctx, exec, mods...)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
CSVFileFlyoverAerialServices: countThenLoadBuilder[Q](
|
||||||
|
"CSVFileFlyoverAerialServices",
|
||||||
|
func(ctx context.Context, exec bob.Executor, retrieved CSVFileFlyoverAerialServicesCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
return retrieved.LoadCountCSVFileFlyoverAerialServices(ctx, exec, mods...)
|
||||||
|
},
|
||||||
|
),
|
||||||
CSVFilePools: countThenLoadBuilder[Q](
|
CSVFilePools: countThenLoadBuilder[Q](
|
||||||
"CSVFilePools",
|
"CSVFilePools",
|
||||||
func(ctx context.Context, exec bob.Executor, retrieved CSVFilePoolsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func(ctx context.Context, exec bob.Executor, retrieved CSVFilePoolsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
|
@ -1108,6 +1317,36 @@ func (os FileuploadCSVSlice) LoadCountCSVFileErrorCSVS(ctx context.Context, exec
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadCountCSVFileFlyoverAerialServices loads the count of CSVFileFlyoverAerialServices into the C struct
|
||||||
|
func (o *FileuploadCSV) LoadCountCSVFileFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if o == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
count, err := o.CSVFileFlyoverAerialServices(mods...).Count(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
o.C.CSVFileFlyoverAerialServices = &count
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadCountCSVFileFlyoverAerialServices loads the count of CSVFileFlyoverAerialServices for a slice
|
||||||
|
func (os FileuploadCSVSlice) LoadCountCSVFileFlyoverAerialServices(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.LoadCountCSVFileFlyoverAerialServices(ctx, exec, mods...); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// LoadCountCSVFilePools loads the count of CSVFilePools into the C struct
|
// LoadCountCSVFilePools loads the count of CSVFilePools into the C struct
|
||||||
func (o *FileuploadCSV) LoadCountCSVFilePools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func (o *FileuploadCSV) LoadCountCSVFilePools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
if o == nil {
|
if o == nil {
|
||||||
|
|
@ -1139,10 +1378,11 @@ func (os FileuploadCSVSlice) LoadCountCSVFilePools(ctx context.Context, exec bob
|
||||||
}
|
}
|
||||||
|
|
||||||
type fileuploadCSVJoins[Q dialect.Joinable] struct {
|
type fileuploadCSVJoins[Q dialect.Joinable] struct {
|
||||||
typ string
|
typ string
|
||||||
File modAs[Q, fileuploadFileColumns]
|
File modAs[Q, fileuploadFileColumns]
|
||||||
CSVFileErrorCSVS modAs[Q, fileuploadErrorCSVColumns]
|
CSVFileErrorCSVS modAs[Q, fileuploadErrorCSVColumns]
|
||||||
CSVFilePools modAs[Q, fileuploadPoolColumns]
|
CSVFileFlyoverAerialServices modAs[Q, fileuploadFlyoverAerialServiceColumns]
|
||||||
|
CSVFilePools modAs[Q, fileuploadPoolColumns]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j fileuploadCSVJoins[Q]) aliasedAs(alias string) fileuploadCSVJoins[Q] {
|
func (j fileuploadCSVJoins[Q]) aliasedAs(alias string) fileuploadCSVJoins[Q] {
|
||||||
|
|
@ -1180,6 +1420,20 @@ func buildFileuploadCSVJoins[Q dialect.Joinable](cols fileuploadCSVColumns, typ
|
||||||
return mods
|
return mods
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
CSVFileFlyoverAerialServices: modAs[Q, fileuploadFlyoverAerialServiceColumns]{
|
||||||
|
c: FileuploadFlyoverAerialServices.Columns,
|
||||||
|
f: func(to fileuploadFlyoverAerialServiceColumns) bob.Mod[Q] {
|
||||||
|
mods := make(mods.QueryMods[Q], 0, 1)
|
||||||
|
|
||||||
|
{
|
||||||
|
mods = append(mods, dialect.Join[Q](typ, FileuploadFlyoverAerialServices.Name().As(to.Alias())).On(
|
||||||
|
to.CSVFile.EQ(cols.FileID),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return mods
|
||||||
|
},
|
||||||
|
},
|
||||||
CSVFilePools: modAs[Q, fileuploadPoolColumns]{
|
CSVFilePools: modAs[Q, fileuploadPoolColumns]{
|
||||||
c: FileuploadPools.Columns,
|
c: FileuploadPools.Columns,
|
||||||
f: func(to fileuploadPoolColumns) bob.Mod[Q] {
|
f: func(to fileuploadPoolColumns) bob.Mod[Q] {
|
||||||
|
|
|
||||||
1158
db/models/fileupload.flyover_aerial_service.bob.go
Normal file
1158
db/models/fileupload.flyover_aerial_service.bob.go
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -113,6 +113,7 @@ type organizationR struct {
|
||||||
Zones2s FieldseekerZones2Slice // fieldseeker.zones2.zones2_organization_id_fkey
|
Zones2s FieldseekerZones2Slice // fieldseeker.zones2.zones2_organization_id_fkey
|
||||||
FieldseekerSyncs FieldseekerSyncSlice // fieldseeker_sync.fieldseeker_sync_organization_id_fkey
|
FieldseekerSyncs FieldseekerSyncSlice // fieldseeker_sync.fieldseeker_sync_organization_id_fkey
|
||||||
Files FileuploadFileSlice // fileupload.file.file_organization_id_fkey
|
Files FileuploadFileSlice // fileupload.file.file_organization_id_fkey
|
||||||
|
FlyoverAerialServices FileuploadFlyoverAerialServiceSlice // fileupload.flyover_aerial_service.flyover_aerial_service_organization_id_fkey
|
||||||
Pools FileuploadPoolSlice // fileupload.pool.pool_organization_id_fkey
|
Pools FileuploadPoolSlice // fileupload.pool.pool_organization_id_fkey
|
||||||
H3Aggregations H3AggregationSlice // h3_aggregation.h3_aggregation_organization_id_fkey
|
H3Aggregations H3AggregationSlice // h3_aggregation.h3_aggregation_organization_id_fkey
|
||||||
NoteAudios NoteAudioSlice // note_audio.note_audio_organization_id_fkey
|
NoteAudios NoteAudioSlice // note_audio.note_audio_organization_id_fkey
|
||||||
|
|
@ -1735,6 +1736,30 @@ func (os OrganizationSlice) Files(mods ...bob.Mod[*dialect.SelectQuery]) Fileupl
|
||||||
)...)
|
)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FlyoverAerialServices starts a query for related objects on fileupload.flyover_aerial_service
|
||||||
|
func (o *Organization) FlyoverAerialServices(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadFlyoverAerialServicesQuery {
|
||||||
|
return FileuploadFlyoverAerialServices.Query(append(mods,
|
||||||
|
sm.Where(FileuploadFlyoverAerialServices.Columns.OrganizationID.EQ(psql.Arg(o.ID))),
|
||||||
|
)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (os OrganizationSlice) FlyoverAerialServices(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadFlyoverAerialServicesQuery {
|
||||||
|
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 FileuploadFlyoverAerialServices.Query(append(mods,
|
||||||
|
sm.Where(psql.Group(FileuploadFlyoverAerialServices.Columns.OrganizationID).OP("IN", PKArgExpr)),
|
||||||
|
)...)
|
||||||
|
}
|
||||||
|
|
||||||
// Pools starts a query for related objects on fileupload.pool
|
// Pools starts a query for related objects on fileupload.pool
|
||||||
func (o *Organization) Pools(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadPoolsQuery {
|
func (o *Organization) Pools(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadPoolsQuery {
|
||||||
return FileuploadPools.Query(append(mods,
|
return FileuploadPools.Query(append(mods,
|
||||||
|
|
@ -4281,6 +4306,74 @@ func (organization0 *Organization) AttachFiles(ctx context.Context, exec bob.Exe
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func insertOrganizationFlyoverAerialServices0(ctx context.Context, exec bob.Executor, fileuploadFlyoverAerialServices1 []*FileuploadFlyoverAerialServiceSetter, organization0 *Organization) (FileuploadFlyoverAerialServiceSlice, error) {
|
||||||
|
for i := range fileuploadFlyoverAerialServices1 {
|
||||||
|
fileuploadFlyoverAerialServices1[i].OrganizationID = omit.From(organization0.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
ret, err := FileuploadFlyoverAerialServices.Insert(bob.ToMods(fileuploadFlyoverAerialServices1...)).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return ret, fmt.Errorf("insertOrganizationFlyoverAerialServices0: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func attachOrganizationFlyoverAerialServices0(ctx context.Context, exec bob.Executor, count int, fileuploadFlyoverAerialServices1 FileuploadFlyoverAerialServiceSlice, organization0 *Organization) (FileuploadFlyoverAerialServiceSlice, error) {
|
||||||
|
setter := &FileuploadFlyoverAerialServiceSetter{
|
||||||
|
OrganizationID: omit.From(organization0.ID),
|
||||||
|
}
|
||||||
|
|
||||||
|
err := fileuploadFlyoverAerialServices1.UpdateAll(ctx, exec, *setter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("attachOrganizationFlyoverAerialServices0: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileuploadFlyoverAerialServices1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (organization0 *Organization) InsertFlyoverAerialServices(ctx context.Context, exec bob.Executor, related ...*FileuploadFlyoverAerialServiceSetter) error {
|
||||||
|
if len(related) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
fileuploadFlyoverAerialServices1, err := insertOrganizationFlyoverAerialServices0(ctx, exec, related, organization0)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
organization0.R.FlyoverAerialServices = append(organization0.R.FlyoverAerialServices, fileuploadFlyoverAerialServices1...)
|
||||||
|
|
||||||
|
for _, rel := range fileuploadFlyoverAerialServices1 {
|
||||||
|
rel.R.Organization = organization0
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (organization0 *Organization) AttachFlyoverAerialServices(ctx context.Context, exec bob.Executor, related ...*FileuploadFlyoverAerialService) error {
|
||||||
|
if len(related) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
fileuploadFlyoverAerialServices1 := FileuploadFlyoverAerialServiceSlice(related)
|
||||||
|
|
||||||
|
_, err = attachOrganizationFlyoverAerialServices0(ctx, exec, len(related), fileuploadFlyoverAerialServices1, organization0)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
organization0.R.FlyoverAerialServices = append(organization0.R.FlyoverAerialServices, fileuploadFlyoverAerialServices1...)
|
||||||
|
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.R.Organization = organization0
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func insertOrganizationPools0(ctx context.Context, exec bob.Executor, fileuploadPools1 []*FileuploadPoolSetter, organization0 *Organization) (FileuploadPoolSlice, error) {
|
func insertOrganizationPools0(ctx context.Context, exec bob.Executor, fileuploadPools1 []*FileuploadPoolSetter, organization0 *Organization) (FileuploadPoolSlice, error) {
|
||||||
for i := range fileuploadPools1 {
|
for i := range fileuploadPools1 {
|
||||||
fileuploadPools1[i].OrganizationID = omit.From(organization0.ID)
|
fileuploadPools1[i].OrganizationID = omit.From(organization0.ID)
|
||||||
|
|
@ -5473,6 +5566,20 @@ func (o *Organization) Preload(name string, retrieved any) error {
|
||||||
|
|
||||||
o.R.Files = rels
|
o.R.Files = rels
|
||||||
|
|
||||||
|
for _, rel := range rels {
|
||||||
|
if rel != nil {
|
||||||
|
rel.R.Organization = o
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
case "FlyoverAerialServices":
|
||||||
|
rels, ok := retrieved.(FileuploadFlyoverAerialServiceSlice)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("organization cannot load %T as %q", retrieved, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.FlyoverAerialServices = rels
|
||||||
|
|
||||||
for _, rel := range rels {
|
for _, rel := range rels {
|
||||||
if rel != nil {
|
if rel != nil {
|
||||||
rel.R.Organization = o
|
rel.R.Organization = o
|
||||||
|
|
@ -5691,6 +5798,7 @@ type organizationThenLoader[Q orm.Loadable] struct {
|
||||||
Zones2s func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
Zones2s func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
FieldseekerSyncs func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
FieldseekerSyncs func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
Files func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
Files func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
FlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
Pools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
Pools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
H3Aggregations func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
H3Aggregations func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
NoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
NoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
|
@ -5806,6 +5914,9 @@ func buildOrganizationThenLoader[Q orm.Loadable]() organizationThenLoader[Q] {
|
||||||
type FilesLoadInterface interface {
|
type FilesLoadInterface interface {
|
||||||
LoadFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
type FlyoverAerialServicesLoadInterface interface {
|
||||||
|
LoadFlyoverAerialServices(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
|
}
|
||||||
type PoolsLoadInterface interface {
|
type PoolsLoadInterface interface {
|
||||||
LoadPools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadPools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
|
@ -6042,6 +6153,12 @@ func buildOrganizationThenLoader[Q orm.Loadable]() organizationThenLoader[Q] {
|
||||||
return retrieved.LoadFiles(ctx, exec, mods...)
|
return retrieved.LoadFiles(ctx, exec, mods...)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
FlyoverAerialServices: thenLoadBuilder[Q](
|
||||||
|
"FlyoverAerialServices",
|
||||||
|
func(ctx context.Context, exec bob.Executor, retrieved FlyoverAerialServicesLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
return retrieved.LoadFlyoverAerialServices(ctx, exec, mods...)
|
||||||
|
},
|
||||||
|
),
|
||||||
Pools: thenLoadBuilder[Q](
|
Pools: thenLoadBuilder[Q](
|
||||||
"Pools",
|
"Pools",
|
||||||
func(ctx context.Context, exec bob.Executor, retrieved PoolsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func(ctx context.Context, exec bob.Executor, retrieved PoolsLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
|
@ -8219,6 +8336,67 @@ func (os OrganizationSlice) LoadFiles(ctx context.Context, exec bob.Executor, mo
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadFlyoverAerialServices loads the organization's FlyoverAerialServices into the .R struct
|
||||||
|
func (o *Organization) LoadFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if o == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the relationship
|
||||||
|
o.R.FlyoverAerialServices = nil
|
||||||
|
|
||||||
|
related, err := o.FlyoverAerialServices(mods...).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.R.Organization = o
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.FlyoverAerialServices = related
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadFlyoverAerialServices loads the organization's FlyoverAerialServices into the .R struct
|
||||||
|
func (os OrganizationSlice) LoadFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if len(os) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
fileuploadFlyoverAerialServices, err := os.FlyoverAerialServices(mods...).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, o := range os {
|
||||||
|
if o == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.FlyoverAerialServices = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, o := range os {
|
||||||
|
if o == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rel := range fileuploadFlyoverAerialServices {
|
||||||
|
|
||||||
|
if !(o.ID == rel.OrganizationID) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
rel.R.Organization = o
|
||||||
|
|
||||||
|
o.R.FlyoverAerialServices = append(o.R.FlyoverAerialServices, rel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// LoadPools loads the organization's Pools into the .R struct
|
// LoadPools loads the organization's Pools into the .R struct
|
||||||
func (o *Organization) LoadPools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func (o *Organization) LoadPools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
if o == nil {
|
if o == nil {
|
||||||
|
|
@ -8862,6 +9040,7 @@ type organizationC struct {
|
||||||
Zones2s *int64
|
Zones2s *int64
|
||||||
FieldseekerSyncs *int64
|
FieldseekerSyncs *int64
|
||||||
Files *int64
|
Files *int64
|
||||||
|
FlyoverAerialServices *int64
|
||||||
Pools *int64
|
Pools *int64
|
||||||
H3Aggregations *int64
|
H3Aggregations *int64
|
||||||
NoteAudios *int64
|
NoteAudios *int64
|
||||||
|
|
@ -8947,6 +9126,8 @@ func (o *Organization) PreloadCount(name string, count int64) error {
|
||||||
o.C.FieldseekerSyncs = &count
|
o.C.FieldseekerSyncs = &count
|
||||||
case "Files":
|
case "Files":
|
||||||
o.C.Files = &count
|
o.C.Files = &count
|
||||||
|
case "FlyoverAerialServices":
|
||||||
|
o.C.FlyoverAerialServices = &count
|
||||||
case "Pools":
|
case "Pools":
|
||||||
o.C.Pools = &count
|
o.C.Pools = &count
|
||||||
case "H3Aggregations":
|
case "H3Aggregations":
|
||||||
|
|
@ -9002,6 +9183,7 @@ type organizationCountPreloader struct {
|
||||||
Zones2s func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
Zones2s func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
FieldseekerSyncs func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
FieldseekerSyncs func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
Files func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
Files func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
|
FlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
Pools func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
Pools func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
H3Aggregations func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
H3Aggregations func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
NoteAudios func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
NoteAudios func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
|
|
@ -9598,6 +9780,23 @@ func buildOrganizationCountPreloader() organizationCountPreloader {
|
||||||
return psql.Group(psql.Select(subqueryMods...).Expression)
|
return psql.Group(psql.Select(subqueryMods...).Expression)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
FlyoverAerialServices: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
||||||
|
return countPreloader[*Organization]("FlyoverAerialServices", func(parent string) bob.Expression {
|
||||||
|
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
||||||
|
if parent == "" {
|
||||||
|
parent = Organizations.Alias()
|
||||||
|
}
|
||||||
|
|
||||||
|
subqueryMods := []bob.Mod[*dialect.SelectQuery]{
|
||||||
|
sm.Columns(psql.Raw("count(*)")),
|
||||||
|
|
||||||
|
sm.From(FileuploadFlyoverAerialServices.Name()),
|
||||||
|
sm.Where(psql.Quote(FileuploadFlyoverAerialServices.Alias(), "organization_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 {
|
Pools: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
||||||
return countPreloader[*Organization]("Pools", func(parent string) bob.Expression {
|
return countPreloader[*Organization]("Pools", func(parent string) bob.Expression {
|
||||||
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
||||||
|
|
@ -9772,6 +9971,7 @@ type organizationCountThenLoader[Q orm.Loadable] struct {
|
||||||
Zones2s func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
Zones2s func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
FieldseekerSyncs func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
FieldseekerSyncs func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
Files func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
Files func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
FlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
Pools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
Pools func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
H3Aggregations func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
H3Aggregations func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
NoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
NoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
|
@ -9885,6 +10085,9 @@ func buildOrganizationCountThenLoader[Q orm.Loadable]() organizationCountThenLoa
|
||||||
type FilesCountInterface interface {
|
type FilesCountInterface interface {
|
||||||
LoadCountFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCountFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
type FlyoverAerialServicesCountInterface interface {
|
||||||
|
LoadCountFlyoverAerialServices(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
|
}
|
||||||
type PoolsCountInterface interface {
|
type PoolsCountInterface interface {
|
||||||
LoadCountPools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCountPools(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
|
@ -10115,6 +10318,12 @@ func buildOrganizationCountThenLoader[Q orm.Loadable]() organizationCountThenLoa
|
||||||
return retrieved.LoadCountFiles(ctx, exec, mods...)
|
return retrieved.LoadCountFiles(ctx, exec, mods...)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
FlyoverAerialServices: countThenLoadBuilder[Q](
|
||||||
|
"FlyoverAerialServices",
|
||||||
|
func(ctx context.Context, exec bob.Executor, retrieved FlyoverAerialServicesCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
return retrieved.LoadCountFlyoverAerialServices(ctx, exec, mods...)
|
||||||
|
},
|
||||||
|
),
|
||||||
Pools: countThenLoadBuilder[Q](
|
Pools: countThenLoadBuilder[Q](
|
||||||
"Pools",
|
"Pools",
|
||||||
func(ctx context.Context, exec bob.Executor, retrieved PoolsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func(ctx context.Context, exec bob.Executor, retrieved PoolsCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
|
@ -11186,6 +11395,36 @@ func (os OrganizationSlice) LoadCountFiles(ctx context.Context, exec bob.Executo
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadCountFlyoverAerialServices loads the count of FlyoverAerialServices into the C struct
|
||||||
|
func (o *Organization) LoadCountFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if o == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
count, err := o.FlyoverAerialServices(mods...).Count(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
o.C.FlyoverAerialServices = &count
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadCountFlyoverAerialServices loads the count of FlyoverAerialServices for a slice
|
||||||
|
func (os OrganizationSlice) LoadCountFlyoverAerialServices(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.LoadCountFlyoverAerialServices(ctx, exec, mods...); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// LoadCountPools loads the count of Pools into the C struct
|
// LoadCountPools loads the count of Pools into the C struct
|
||||||
func (o *Organization) LoadCountPools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func (o *Organization) LoadCountPools(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
if o == nil {
|
if o == nil {
|
||||||
|
|
@ -11462,6 +11701,7 @@ type organizationJoins[Q dialect.Joinable] struct {
|
||||||
Zones2s modAs[Q, fieldseekerZones2Columns]
|
Zones2s modAs[Q, fieldseekerZones2Columns]
|
||||||
FieldseekerSyncs modAs[Q, fieldseekerSyncColumns]
|
FieldseekerSyncs modAs[Q, fieldseekerSyncColumns]
|
||||||
Files modAs[Q, fileuploadFileColumns]
|
Files modAs[Q, fileuploadFileColumns]
|
||||||
|
FlyoverAerialServices modAs[Q, fileuploadFlyoverAerialServiceColumns]
|
||||||
Pools modAs[Q, fileuploadPoolColumns]
|
Pools modAs[Q, fileuploadPoolColumns]
|
||||||
H3Aggregations modAs[Q, h3AggregationColumns]
|
H3Aggregations modAs[Q, h3AggregationColumns]
|
||||||
NoteAudios modAs[Q, noteAudioColumns]
|
NoteAudios modAs[Q, noteAudioColumns]
|
||||||
|
|
@ -11973,6 +12213,20 @@ func buildOrganizationJoins[Q dialect.Joinable](cols organizationColumns, typ st
|
||||||
return mods
|
return mods
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
FlyoverAerialServices: modAs[Q, fileuploadFlyoverAerialServiceColumns]{
|
||||||
|
c: FileuploadFlyoverAerialServices.Columns,
|
||||||
|
f: func(to fileuploadFlyoverAerialServiceColumns) bob.Mod[Q] {
|
||||||
|
mods := make(mods.QueryMods[Q], 0, 1)
|
||||||
|
|
||||||
|
{
|
||||||
|
mods = append(mods, dialect.Join[Q](typ, FileuploadFlyoverAerialServices.Name().As(to.Alias())).On(
|
||||||
|
to.OrganizationID.EQ(cols.ID),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return mods
|
||||||
|
},
|
||||||
|
},
|
||||||
Pools: modAs[Q, fileuploadPoolColumns]{
|
Pools: modAs[Q, fileuploadPoolColumns]{
|
||||||
c: FileuploadPools.Columns,
|
c: FileuploadPools.Columns,
|
||||||
f: func(to fileuploadPoolColumns) bob.Mod[Q] {
|
f: func(to fileuploadPoolColumns) bob.Mod[Q] {
|
||||||
|
|
|
||||||
|
|
@ -58,20 +58,21 @@ type UsersQuery = *psql.ViewQuery[*User, UserSlice]
|
||||||
|
|
||||||
// userR is where relationships are stored.
|
// userR is where relationships are stored.
|
||||||
type userR struct {
|
type userR struct {
|
||||||
UserOauthTokens ArcgisOauthTokenSlice // arcgis.oauth_token.oauth_token_user_id_fkey
|
UserOauthTokens ArcgisOauthTokenSlice // arcgis.oauth_token.oauth_token_user_id_fkey
|
||||||
PublicUserUser ArcgisUserSlice // arcgis.user_.user__public_user_id_fkey
|
PublicUserUser ArcgisUserSlice // arcgis.user_.user__public_user_id_fkey
|
||||||
CreatorComplianceReportRequests ComplianceReportRequestSlice // compliance_report_request.compliance_report_request_creator_fkey
|
CreatorComplianceReportRequests ComplianceReportRequestSlice // compliance_report_request.compliance_report_request_creator_fkey
|
||||||
CreatorFiles FileuploadFileSlice // fileupload.file.file_creator_id_fkey
|
CreatorFiles FileuploadFileSlice // fileupload.file.file_creator_id_fkey
|
||||||
FileuploadPool FileuploadPoolSlice // fileupload.pool.pool_creator_id_fkey
|
CreatorFlyoverAerialServices FileuploadFlyoverAerialServiceSlice // fileupload.flyover_aerial_service.flyover_aerial_service_creator_id_fkey
|
||||||
CreatorNoteAudios NoteAudioSlice // note_audio.note_audio_creator_id_fkey
|
FileuploadPool FileuploadPoolSlice // fileupload.pool.pool_creator_id_fkey
|
||||||
DeletorNoteAudios NoteAudioSlice // note_audio.note_audio_deletor_id_fkey
|
CreatorNoteAudios NoteAudioSlice // note_audio.note_audio_creator_id_fkey
|
||||||
CreatorNoteImages NoteImageSlice // note_image.note_image_creator_id_fkey
|
DeletorNoteAudios NoteAudioSlice // note_audio.note_audio_deletor_id_fkey
|
||||||
DeletorNoteImages NoteImageSlice // note_image.note_image_deletor_id_fkey
|
CreatorNoteImages NoteImageSlice // note_image.note_image_creator_id_fkey
|
||||||
UserNotifications NotificationSlice // notification.notification_user_id_fkey
|
DeletorNoteImages NoteImageSlice // note_image.note_image_deletor_id_fkey
|
||||||
CreatorPools PoolSlice // pool.pool_creator_id_fkey
|
UserNotifications NotificationSlice // notification.notification_user_id_fkey
|
||||||
CreatorResidents ResidentSlice // resident.resident_creator_fkey
|
CreatorPools PoolSlice // pool.pool_creator_id_fkey
|
||||||
CreatorSites SiteSlice // site.site_creator_id_fkey
|
CreatorResidents ResidentSlice // resident.resident_creator_fkey
|
||||||
Organization *Organization // user_.user__organization_id_fkey
|
CreatorSites SiteSlice // site.site_creator_id_fkey
|
||||||
|
Organization *Organization // user_.user__organization_id_fkey
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildUserColumns(alias string) userColumns {
|
func buildUserColumns(alias string) userColumns {
|
||||||
|
|
@ -736,6 +737,30 @@ func (os UserSlice) CreatorFiles(mods ...bob.Mod[*dialect.SelectQuery]) Fileuplo
|
||||||
)...)
|
)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreatorFlyoverAerialServices starts a query for related objects on fileupload.flyover_aerial_service
|
||||||
|
func (o *User) CreatorFlyoverAerialServices(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadFlyoverAerialServicesQuery {
|
||||||
|
return FileuploadFlyoverAerialServices.Query(append(mods,
|
||||||
|
sm.Where(FileuploadFlyoverAerialServices.Columns.CreatorID.EQ(psql.Arg(o.ID))),
|
||||||
|
)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (os UserSlice) CreatorFlyoverAerialServices(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadFlyoverAerialServicesQuery {
|
||||||
|
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 FileuploadFlyoverAerialServices.Query(append(mods,
|
||||||
|
sm.Where(psql.Group(FileuploadFlyoverAerialServices.Columns.CreatorID).OP("IN", PKArgExpr)),
|
||||||
|
)...)
|
||||||
|
}
|
||||||
|
|
||||||
// FileuploadPool starts a query for related objects on fileupload.pool
|
// FileuploadPool starts a query for related objects on fileupload.pool
|
||||||
func (o *User) FileuploadPool(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadPoolsQuery {
|
func (o *User) FileuploadPool(mods ...bob.Mod[*dialect.SelectQuery]) FileuploadPoolsQuery {
|
||||||
return FileuploadPools.Query(append(mods,
|
return FileuploadPools.Query(append(mods,
|
||||||
|
|
@ -1248,6 +1273,74 @@ func (user0 *User) AttachCreatorFiles(ctx context.Context, exec bob.Executor, re
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func insertUserCreatorFlyoverAerialServices0(ctx context.Context, exec bob.Executor, fileuploadFlyoverAerialServices1 []*FileuploadFlyoverAerialServiceSetter, user0 *User) (FileuploadFlyoverAerialServiceSlice, error) {
|
||||||
|
for i := range fileuploadFlyoverAerialServices1 {
|
||||||
|
fileuploadFlyoverAerialServices1[i].CreatorID = omit.From(user0.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
ret, err := FileuploadFlyoverAerialServices.Insert(bob.ToMods(fileuploadFlyoverAerialServices1...)).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return ret, fmt.Errorf("insertUserCreatorFlyoverAerialServices0: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func attachUserCreatorFlyoverAerialServices0(ctx context.Context, exec bob.Executor, count int, fileuploadFlyoverAerialServices1 FileuploadFlyoverAerialServiceSlice, user0 *User) (FileuploadFlyoverAerialServiceSlice, error) {
|
||||||
|
setter := &FileuploadFlyoverAerialServiceSetter{
|
||||||
|
CreatorID: omit.From(user0.ID),
|
||||||
|
}
|
||||||
|
|
||||||
|
err := fileuploadFlyoverAerialServices1.UpdateAll(ctx, exec, *setter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("attachUserCreatorFlyoverAerialServices0: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileuploadFlyoverAerialServices1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (user0 *User) InsertCreatorFlyoverAerialServices(ctx context.Context, exec bob.Executor, related ...*FileuploadFlyoverAerialServiceSetter) error {
|
||||||
|
if len(related) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
fileuploadFlyoverAerialServices1, err := insertUserCreatorFlyoverAerialServices0(ctx, exec, related, user0)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
user0.R.CreatorFlyoverAerialServices = append(user0.R.CreatorFlyoverAerialServices, fileuploadFlyoverAerialServices1...)
|
||||||
|
|
||||||
|
for _, rel := range fileuploadFlyoverAerialServices1 {
|
||||||
|
rel.R.CreatorUser = user0
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (user0 *User) AttachCreatorFlyoverAerialServices(ctx context.Context, exec bob.Executor, related ...*FileuploadFlyoverAerialService) error {
|
||||||
|
if len(related) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
fileuploadFlyoverAerialServices1 := FileuploadFlyoverAerialServiceSlice(related)
|
||||||
|
|
||||||
|
_, err = attachUserCreatorFlyoverAerialServices0(ctx, exec, len(related), fileuploadFlyoverAerialServices1, user0)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
user0.R.CreatorFlyoverAerialServices = append(user0.R.CreatorFlyoverAerialServices, fileuploadFlyoverAerialServices1...)
|
||||||
|
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.R.CreatorUser = user0
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func insertUserFileuploadPool0(ctx context.Context, exec bob.Executor, fileuploadPools1 []*FileuploadPoolSetter, user0 *User) (FileuploadPoolSlice, error) {
|
func insertUserFileuploadPool0(ctx context.Context, exec bob.Executor, fileuploadPools1 []*FileuploadPoolSetter, user0 *User) (FileuploadPoolSlice, error) {
|
||||||
for i := range fileuploadPools1 {
|
for i := range fileuploadPools1 {
|
||||||
fileuploadPools1[i].CreatorID = omit.From(user0.ID)
|
fileuploadPools1[i].CreatorID = omit.From(user0.ID)
|
||||||
|
|
@ -2002,6 +2095,20 @@ func (o *User) Preload(name string, retrieved any) error {
|
||||||
|
|
||||||
o.R.CreatorFiles = rels
|
o.R.CreatorFiles = rels
|
||||||
|
|
||||||
|
for _, rel := range rels {
|
||||||
|
if rel != nil {
|
||||||
|
rel.R.CreatorUser = o
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
case "CreatorFlyoverAerialServices":
|
||||||
|
rels, ok := retrieved.(FileuploadFlyoverAerialServiceSlice)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("user cannot load %T as %q", retrieved, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.CreatorFlyoverAerialServices = rels
|
||||||
|
|
||||||
for _, rel := range rels {
|
for _, rel := range rels {
|
||||||
if rel != nil {
|
if rel != nil {
|
||||||
rel.R.CreatorUser = o
|
rel.R.CreatorUser = o
|
||||||
|
|
@ -2178,6 +2285,7 @@ type userThenLoader[Q orm.Loadable] struct {
|
||||||
PublicUserUser func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
PublicUserUser func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CreatorComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CreatorComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CreatorFiles func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CreatorFiles func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
CreatorFlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
FileuploadPool func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
FileuploadPool func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CreatorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CreatorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
DeletorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
DeletorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
|
@ -2203,6 +2311,9 @@ func buildUserThenLoader[Q orm.Loadable]() userThenLoader[Q] {
|
||||||
type CreatorFilesLoadInterface interface {
|
type CreatorFilesLoadInterface interface {
|
||||||
LoadCreatorFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCreatorFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
type CreatorFlyoverAerialServicesLoadInterface interface {
|
||||||
|
LoadCreatorFlyoverAerialServices(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
|
}
|
||||||
type FileuploadPoolLoadInterface interface {
|
type FileuploadPoolLoadInterface interface {
|
||||||
LoadFileuploadPool(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadFileuploadPool(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
|
@ -2259,6 +2370,12 @@ func buildUserThenLoader[Q orm.Loadable]() userThenLoader[Q] {
|
||||||
return retrieved.LoadCreatorFiles(ctx, exec, mods...)
|
return retrieved.LoadCreatorFiles(ctx, exec, mods...)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
CreatorFlyoverAerialServices: thenLoadBuilder[Q](
|
||||||
|
"CreatorFlyoverAerialServices",
|
||||||
|
func(ctx context.Context, exec bob.Executor, retrieved CreatorFlyoverAerialServicesLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
return retrieved.LoadCreatorFlyoverAerialServices(ctx, exec, mods...)
|
||||||
|
},
|
||||||
|
),
|
||||||
FileuploadPool: thenLoadBuilder[Q](
|
FileuploadPool: thenLoadBuilder[Q](
|
||||||
"FileuploadPool",
|
"FileuploadPool",
|
||||||
func(ctx context.Context, exec bob.Executor, retrieved FileuploadPoolLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func(ctx context.Context, exec bob.Executor, retrieved FileuploadPoolLoadInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
|
@ -2566,6 +2683,67 @@ func (os UserSlice) LoadCreatorFiles(ctx context.Context, exec bob.Executor, mod
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadCreatorFlyoverAerialServices loads the user's CreatorFlyoverAerialServices into the .R struct
|
||||||
|
func (o *User) LoadCreatorFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if o == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the relationship
|
||||||
|
o.R.CreatorFlyoverAerialServices = nil
|
||||||
|
|
||||||
|
related, err := o.CreatorFlyoverAerialServices(mods...).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rel := range related {
|
||||||
|
rel.R.CreatorUser = o
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.CreatorFlyoverAerialServices = related
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadCreatorFlyoverAerialServices loads the user's CreatorFlyoverAerialServices into the .R struct
|
||||||
|
func (os UserSlice) LoadCreatorFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if len(os) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
fileuploadFlyoverAerialServices, err := os.CreatorFlyoverAerialServices(mods...).All(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, o := range os {
|
||||||
|
if o == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
o.R.CreatorFlyoverAerialServices = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, o := range os {
|
||||||
|
if o == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rel := range fileuploadFlyoverAerialServices {
|
||||||
|
|
||||||
|
if !(o.ID == rel.CreatorID) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
rel.R.CreatorUser = o
|
||||||
|
|
||||||
|
o.R.CreatorFlyoverAerialServices = append(o.R.CreatorFlyoverAerialServices, rel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// LoadFileuploadPool loads the user's FileuploadPool into the .R struct
|
// LoadFileuploadPool loads the user's FileuploadPool into the .R struct
|
||||||
func (o *User) LoadFileuploadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func (o *User) LoadFileuploadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
if o == nil {
|
if o == nil {
|
||||||
|
|
@ -3179,6 +3357,7 @@ type userC struct {
|
||||||
PublicUserUser *int64
|
PublicUserUser *int64
|
||||||
CreatorComplianceReportRequests *int64
|
CreatorComplianceReportRequests *int64
|
||||||
CreatorFiles *int64
|
CreatorFiles *int64
|
||||||
|
CreatorFlyoverAerialServices *int64
|
||||||
FileuploadPool *int64
|
FileuploadPool *int64
|
||||||
CreatorNoteAudios *int64
|
CreatorNoteAudios *int64
|
||||||
DeletorNoteAudios *int64
|
DeletorNoteAudios *int64
|
||||||
|
|
@ -3205,6 +3384,8 @@ func (o *User) PreloadCount(name string, count int64) error {
|
||||||
o.C.CreatorComplianceReportRequests = &count
|
o.C.CreatorComplianceReportRequests = &count
|
||||||
case "CreatorFiles":
|
case "CreatorFiles":
|
||||||
o.C.CreatorFiles = &count
|
o.C.CreatorFiles = &count
|
||||||
|
case "CreatorFlyoverAerialServices":
|
||||||
|
o.C.CreatorFlyoverAerialServices = &count
|
||||||
case "FileuploadPool":
|
case "FileuploadPool":
|
||||||
o.C.FileuploadPool = &count
|
o.C.FileuploadPool = &count
|
||||||
case "CreatorNoteAudios":
|
case "CreatorNoteAudios":
|
||||||
|
|
@ -3232,6 +3413,7 @@ type userCountPreloader struct {
|
||||||
PublicUserUser func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
PublicUserUser func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
CreatorComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
CreatorComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
CreatorFiles func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
CreatorFiles func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
|
CreatorFlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
FileuploadPool func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
FileuploadPool func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
CreatorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
CreatorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
DeletorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
DeletorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) psql.Preloader
|
||||||
|
|
@ -3313,6 +3495,23 @@ func buildUserCountPreloader() userCountPreloader {
|
||||||
return psql.Group(psql.Select(subqueryMods...).Expression)
|
return psql.Group(psql.Select(subqueryMods...).Expression)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
CreatorFlyoverAerialServices: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
||||||
|
return countPreloader[*User]("CreatorFlyoverAerialServices", func(parent string) bob.Expression {
|
||||||
|
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
||||||
|
if parent == "" {
|
||||||
|
parent = Users.Alias()
|
||||||
|
}
|
||||||
|
|
||||||
|
subqueryMods := []bob.Mod[*dialect.SelectQuery]{
|
||||||
|
sm.Columns(psql.Raw("count(*)")),
|
||||||
|
|
||||||
|
sm.From(FileuploadFlyoverAerialServices.Name()),
|
||||||
|
sm.Where(psql.Quote(FileuploadFlyoverAerialServices.Alias(), "creator_id").EQ(psql.Quote(parent, "id"))),
|
||||||
|
}
|
||||||
|
subqueryMods = append(subqueryMods, mods...)
|
||||||
|
return psql.Group(psql.Select(subqueryMods...).Expression)
|
||||||
|
})
|
||||||
|
},
|
||||||
FileuploadPool: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
FileuploadPool: func(mods ...bob.Mod[*dialect.SelectQuery]) psql.Preloader {
|
||||||
return countPreloader[*User]("FileuploadPool", func(parent string) bob.Expression {
|
return countPreloader[*User]("FileuploadPool", func(parent string) bob.Expression {
|
||||||
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
// Build a correlated subquery: (SELECT COUNT(*) FROM related WHERE fk = parent.pk)
|
||||||
|
|
@ -3474,6 +3673,7 @@ type userCountThenLoader[Q orm.Loadable] struct {
|
||||||
PublicUserUser func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
PublicUserUser func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CreatorComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CreatorComplianceReportRequests func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CreatorFiles func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CreatorFiles func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
CreatorFlyoverAerialServices func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
FileuploadPool func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
FileuploadPool func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
CreatorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
CreatorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
DeletorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
DeletorNoteAudios func(...bob.Mod[*dialect.SelectQuery]) orm.Loader[Q]
|
||||||
|
|
@ -3498,6 +3698,9 @@ func buildUserCountThenLoader[Q orm.Loadable]() userCountThenLoader[Q] {
|
||||||
type CreatorFilesCountInterface interface {
|
type CreatorFilesCountInterface interface {
|
||||||
LoadCountCreatorFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCountCreatorFiles(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
type CreatorFlyoverAerialServicesCountInterface interface {
|
||||||
|
LoadCountCreatorFlyoverAerialServices(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
|
}
|
||||||
type FileuploadPoolCountInterface interface {
|
type FileuploadPoolCountInterface interface {
|
||||||
LoadCountFileuploadPool(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
LoadCountFileuploadPool(context.Context, bob.Executor, ...bob.Mod[*dialect.SelectQuery]) error
|
||||||
}
|
}
|
||||||
|
|
@ -3551,6 +3754,12 @@ func buildUserCountThenLoader[Q orm.Loadable]() userCountThenLoader[Q] {
|
||||||
return retrieved.LoadCountCreatorFiles(ctx, exec, mods...)
|
return retrieved.LoadCountCreatorFiles(ctx, exec, mods...)
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
CreatorFlyoverAerialServices: countThenLoadBuilder[Q](
|
||||||
|
"CreatorFlyoverAerialServices",
|
||||||
|
func(ctx context.Context, exec bob.Executor, retrieved CreatorFlyoverAerialServicesCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
return retrieved.LoadCountCreatorFlyoverAerialServices(ctx, exec, mods...)
|
||||||
|
},
|
||||||
|
),
|
||||||
FileuploadPool: countThenLoadBuilder[Q](
|
FileuploadPool: countThenLoadBuilder[Q](
|
||||||
"FileuploadPool",
|
"FileuploadPool",
|
||||||
func(ctx context.Context, exec bob.Executor, retrieved FileuploadPoolCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func(ctx context.Context, exec bob.Executor, retrieved FileuploadPoolCountInterface, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
|
@ -3728,6 +3937,36 @@ func (os UserSlice) LoadCountCreatorFiles(ctx context.Context, exec bob.Executor
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadCountCreatorFlyoverAerialServices loads the count of CreatorFlyoverAerialServices into the C struct
|
||||||
|
func (o *User) LoadCountCreatorFlyoverAerialServices(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
|
if o == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
count, err := o.CreatorFlyoverAerialServices(mods...).Count(ctx, exec)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
o.C.CreatorFlyoverAerialServices = &count
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadCountCreatorFlyoverAerialServices loads the count of CreatorFlyoverAerialServices for a slice
|
||||||
|
func (os UserSlice) LoadCountCreatorFlyoverAerialServices(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.LoadCountCreatorFlyoverAerialServices(ctx, exec, mods...); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// LoadCountFileuploadPool loads the count of FileuploadPool into the C struct
|
// LoadCountFileuploadPool loads the count of FileuploadPool into the C struct
|
||||||
func (o *User) LoadCountFileuploadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
func (o *User) LoadCountFileuploadPool(ctx context.Context, exec bob.Executor, mods ...bob.Mod[*dialect.SelectQuery]) error {
|
||||||
if o == nil {
|
if o == nil {
|
||||||
|
|
@ -4004,6 +4243,7 @@ type userJoins[Q dialect.Joinable] struct {
|
||||||
PublicUserUser modAs[Q, arcgisuserColumns]
|
PublicUserUser modAs[Q, arcgisuserColumns]
|
||||||
CreatorComplianceReportRequests modAs[Q, complianceReportRequestColumns]
|
CreatorComplianceReportRequests modAs[Q, complianceReportRequestColumns]
|
||||||
CreatorFiles modAs[Q, fileuploadFileColumns]
|
CreatorFiles modAs[Q, fileuploadFileColumns]
|
||||||
|
CreatorFlyoverAerialServices modAs[Q, fileuploadFlyoverAerialServiceColumns]
|
||||||
FileuploadPool modAs[Q, fileuploadPoolColumns]
|
FileuploadPool modAs[Q, fileuploadPoolColumns]
|
||||||
CreatorNoteAudios modAs[Q, noteAudioColumns]
|
CreatorNoteAudios modAs[Q, noteAudioColumns]
|
||||||
DeletorNoteAudios modAs[Q, noteAudioColumns]
|
DeletorNoteAudios modAs[Q, noteAudioColumns]
|
||||||
|
|
@ -4079,6 +4319,20 @@ func buildUserJoins[Q dialect.Joinable](cols userColumns, typ string) userJoins[
|
||||||
return mods
|
return mods
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
CreatorFlyoverAerialServices: modAs[Q, fileuploadFlyoverAerialServiceColumns]{
|
||||||
|
c: FileuploadFlyoverAerialServices.Columns,
|
||||||
|
f: func(to fileuploadFlyoverAerialServiceColumns) bob.Mod[Q] {
|
||||||
|
mods := make(mods.QueryMods[Q], 0, 1)
|
||||||
|
|
||||||
|
{
|
||||||
|
mods = append(mods, dialect.Join[Q](typ, FileuploadFlyoverAerialServices.Name().As(to.Alias())).On(
|
||||||
|
to.CreatorID.EQ(cols.ID),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return mods
|
||||||
|
},
|
||||||
|
},
|
||||||
FileuploadPool: modAs[Q, fileuploadPoolColumns]{
|
FileuploadPool: modAs[Q, fileuploadPoolColumns]{
|
||||||
c: FileuploadPools.Columns,
|
c: FileuploadPools.Columns,
|
||||||
f: func(to fileuploadPoolColumns) bob.Mod[Q] {
|
f: func(to fileuploadPoolColumns) bob.Mod[Q] {
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,8 @@ func displayUploadType(s string) string {
|
||||||
switch s {
|
switch s {
|
||||||
case "PoolList":
|
case "PoolList":
|
||||||
return "Green Pool List"
|
return "Green Pool List"
|
||||||
|
case "Flyover":
|
||||||
|
return "Flyover"
|
||||||
default:
|
default:
|
||||||
return "Unknown upload type"
|
return "Unknown upload type"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -204,12 +204,14 @@ document.addEventListener('DOMContentLoaded', onLoad);
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="d-flex justify-content-between mt-4 mb-5">
|
<div class="d-flex justify-content-between mt-4 mb-5">
|
||||||
<form action="{{ .C.URL.Discard }}" method="POST">
|
<form action="{{ call .URL.Upload.Discard .C.CSVFileID }}" method="POST">
|
||||||
<button type="submit" class="btn btn-outline-danger">Discard</button>
|
<button type="submit" class="btn btn-outline-danger">Discard</button>
|
||||||
</form>
|
</form>
|
||||||
<button class="btn btn-primary" id="confirmUploadBtn">
|
<form action="{{ call .URL.Upload.Commit .C.CSVFileID }}" method="POST">
|
||||||
<i class="bi bi-check2 me-1"></i> Confirm and Submit Data
|
<button class="btn btn-primary" id="confirmUploadBtn">
|
||||||
</button>
|
<i class="bi bi-check2 me-1"></i> Confirm and Submit Data
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<form
|
<form
|
||||||
action="{{ .URL.Upload.PoolBob }}"
|
action="{{ .URL.Upload.PoolFlyover }}"
|
||||||
method="POST"
|
method="POST"
|
||||||
enctype="multipart/form-data"
|
enctype="multipart/form-data"
|
||||||
>
|
>
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
</div>
|
</div>
|
||||||
<a
|
<a
|
||||||
class="btn btn-primary btn-lg w-100"
|
class="btn btn-primary btn-lg w-100"
|
||||||
href="{{ .URL.Upload.PoolBob }}"
|
href="{{ .URL.Upload.PoolFlyover }}"
|
||||||
>
|
>
|
||||||
<i class="bi bi-upload me-2"></i>Let's do this
|
<i class="bi bi-upload me-2"></i>Let's do this
|
||||||
</a>
|
</a>
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@
|
||||||
<td>
|
<td>
|
||||||
<a
|
<a
|
||||||
class="btn btn-sm btn-outline-primary"
|
class="btn btn-sm btn-outline-primary"
|
||||||
href="/upload/{{ .ID }}"
|
href="/configuration/upload/{{ .ID }}"
|
||||||
>View</a
|
>View</a
|
||||||
>
|
>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
||||||
128
platform/csv/csv.go
Normal file
128
platform/csv/csv.go
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
package csv
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
//"encoding/csv"
|
||||||
|
"fmt"
|
||||||
|
//"io"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
//"sync"
|
||||||
|
//"time"
|
||||||
|
|
||||||
|
"github.com/Gleipnir-Technology/bob"
|
||||||
|
"github.com/Gleipnir-Technology/bob/dialect/psql"
|
||||||
|
"github.com/Gleipnir-Technology/bob/dialect/psql/um"
|
||||||
|
//"github.com/Gleipnir-Technology/nidus-sync/config"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/db"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
||||||
|
//"github.com/Gleipnir-Technology/nidus-sync/h3utils"
|
||||||
|
//"github.com/Gleipnir-Technology/nidus-sync/platform/geom"
|
||||||
|
//"github.com/Gleipnir-Technology/nidus-sync/platform/text"
|
||||||
|
//"github.com/Gleipnir-Technology/nidus-sync/stadia"
|
||||||
|
//"github.com/Gleipnir-Technology/nidus-sync/userfile"
|
||||||
|
"github.com/aarondl/opt/omit"
|
||||||
|
//"github.com/aarondl/opt/omitnull"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type csvParserFunc[T any] = func(context.Context, bob.Tx, *models.FileuploadFile, *models.FileuploadCSV) ([]T, error)
|
||||||
|
type csvProcessorFunc[T any] = func(context.Context, bob.Tx, *models.FileuploadFile, *models.FileuploadCSV, []T) error
|
||||||
|
|
||||||
|
func ProcessJob(ctx context.Context, file_id int32, type_ enums.FileuploadCsvtype) error {
|
||||||
|
var err error
|
||||||
|
switch type_ {
|
||||||
|
case enums.FileuploadCsvtypePoollist:
|
||||||
|
err = processCSV(ctx, file_id, parseCSVPoollist, processCSVPoollist)
|
||||||
|
case enums.FileuploadCsvtypeFlyover:
|
||||||
|
err = processCSV(ctx, file_id, parseCSVFlyover, processCSVFlyover)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func processCSV[T any](ctx context.Context, file_id int32, parser csvParserFunc[T], processor csvProcessorFunc[T]) error {
|
||||||
|
file, c, err := loadFileAndCSV(ctx, file_id)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("load file and csv: %w", err)
|
||||||
|
}
|
||||||
|
txn, err := db.PGInstance.BobDB.BeginTx(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to start transaction: %w", err)
|
||||||
|
}
|
||||||
|
defer txn.Rollback(ctx)
|
||||||
|
parsed, err := parser(ctx, txn, file, c)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parse file: %w", err)
|
||||||
|
}
|
||||||
|
_, err = psql.Update(
|
||||||
|
um.Table("fileupload.csv"),
|
||||||
|
um.SetCol("rowcount").ToArg(len(parsed)),
|
||||||
|
um.Where(psql.Quote("file_id").EQ(psql.Arg(file_id))),
|
||||||
|
).Exec(ctx, txn)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("update csv row: %w", err)
|
||||||
|
}
|
||||||
|
err = processor(ctx, txn, file, c, parsed)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("process parsed file: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
file.Update(ctx, txn, &models.FileuploadFileSetter{
|
||||||
|
Status: omit.From(enums.FileuploadFilestatustypeParsed),
|
||||||
|
})
|
||||||
|
log.Info().Int32("file.ID", file.ID).Msg("Set file to parsed")
|
||||||
|
txn.Commit(ctx)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func loadFileAndCSV(ctx context.Context, file_id int32) (*models.FileuploadFile, *models.FileuploadCSV, error) {
|
||||||
|
file, err := models.FindFileuploadFile(ctx, db.PGInstance.BobDB, file_id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, fmt.Errorf("Failed to get file %d from DB: %w", file_id, err)
|
||||||
|
}
|
||||||
|
c, err := models.FindFileuploadCSV(ctx, db.PGInstance.BobDB, file.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, fmt.Errorf("Failed to get csv file %d from DB: %w", file.ID, err)
|
||||||
|
}
|
||||||
|
return file, c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addError(ctx context.Context, txn bob.Tx, c *models.FileuploadCSV, row_number int32, column_number int32, msg string) error {
|
||||||
|
r, err := models.FileuploadErrorCSVS.Insert(&models.FileuploadErrorCSVSetter{
|
||||||
|
Col: omit.From(column_number),
|
||||||
|
CSVFileID: omit.From(c.FileID),
|
||||||
|
// ID
|
||||||
|
Line: omit.From(row_number),
|
||||||
|
Message: omit.From(msg),
|
||||||
|
}).One(ctx, txn)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to add error: %w", err)
|
||||||
|
}
|
||||||
|
log.Info().Int32("id", r.ID).Int32("file_id", c.FileID).Str("msg", msg).Int32("row", row_number).Int32("col", column_number).Msg("Created CSV file error")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func addImportError(file *models.FileuploadFile, err error) {
|
||||||
|
log.Debug().Err(err).Int32("file_id", file.ID).Msg("Fake add import error")
|
||||||
|
}
|
||||||
|
func parseBool(s string) (bool, error) {
|
||||||
|
sl := strings.ToLower(s)
|
||||||
|
boolValue, err := strconv.ParseBool(sl)
|
||||||
|
if err != nil {
|
||||||
|
// Handle some of the stuff that strconv doesn't handle
|
||||||
|
switch sl {
|
||||||
|
case "yes":
|
||||||
|
return true, nil
|
||||||
|
case "no":
|
||||||
|
return false, nil
|
||||||
|
default:
|
||||||
|
return false, fmt.Errorf("unrecognized '%s'", sl)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return boolValue, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func errorMissingHeader(ctx context.Context, txn bob.Tx, c *models.FileuploadCSV, h headerPoolEnum) error {
|
||||||
|
msg := fmt.Sprintf("The file is missing the '%s' header", h.String())
|
||||||
|
return addError(ctx, txn, c, 0, 0, msg)
|
||||||
|
}
|
||||||
307
platform/csv/flyover.go
Normal file
307
platform/csv/flyover.go
Normal file
|
|
@ -0,0 +1,307 @@
|
||||||
|
package csv
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/csv"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/Gleipnir-Technology/bob"
|
||||||
|
"github.com/Gleipnir-Technology/bob/dialect/psql"
|
||||||
|
"github.com/Gleipnir-Technology/bob/dialect/psql/um"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/db"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/h3utils"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/platform/geom"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/platform/text"
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/userfile"
|
||||||
|
"github.com/aarondl/opt/omit"
|
||||||
|
"github.com/aarondl/opt/omitnull"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Enum interface {
|
||||||
|
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~string
|
||||||
|
}
|
||||||
|
|
||||||
|
type headerFlyoverEnum int
|
||||||
|
|
||||||
|
const (
|
||||||
|
headerFlyoverComment headerFlyoverEnum = iota
|
||||||
|
headerFlyoverLatitude
|
||||||
|
headerFlyoverLongitude
|
||||||
|
headerFlyoverNone
|
||||||
|
)
|
||||||
|
|
||||||
|
func (e headerFlyoverEnum) String() string {
|
||||||
|
switch e {
|
||||||
|
case headerFlyoverComment:
|
||||||
|
return "Comment"
|
||||||
|
case headerFlyoverLatitude:
|
||||||
|
return "TargetLat"
|
||||||
|
case headerFlyoverLongitude:
|
||||||
|
return "TargetLon"
|
||||||
|
default:
|
||||||
|
return "bad programmer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var parseCSVFlyover = makeParseCSV(
|
||||||
|
makeParseHeaders(map[string]headerFlyoverEnum{
|
||||||
|
"comment": headerFlyoverComment,
|
||||||
|
"targetlat": headerFlyoverLatitude,
|
||||||
|
"targetlon": headerFlyoverLongitude,
|
||||||
|
"*": headerFlyoverNone,
|
||||||
|
}),
|
||||||
|
insertFlyover,
|
||||||
|
)
|
||||||
|
|
||||||
|
type insertModelFunc[ModelType any, HeaderType Enum] = func(context.Context, bob.Tx, *models.FileuploadFile, *models.FileuploadCSV, int32, []HeaderType, []string, []string) (ModelType, error)
|
||||||
|
type parseCSVFunc[ModelType any] = func(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV) ([]ModelType, error)
|
||||||
|
|
||||||
|
func makeParseCSV[ModelType any, HeaderType Enum](parseHeader parseHeaderFunc[HeaderType], insertModel insertModelFunc[ModelType, HeaderType]) parseCSVFunc[ModelType] {
|
||||||
|
return func(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV) ([]ModelType, error) {
|
||||||
|
rows := make([]ModelType, 0)
|
||||||
|
r, err := userfile.NewFileReader(userfile.CollectionCSV, file.FileUUID)
|
||||||
|
if err != nil {
|
||||||
|
return rows, fmt.Errorf("Failed to get filereader for %d: %w", file.ID, err)
|
||||||
|
}
|
||||||
|
reader := csv.NewReader(r)
|
||||||
|
h, err := reader.Read()
|
||||||
|
if err != nil {
|
||||||
|
return rows, fmt.Errorf("Failed to read header of CSV for file %d: %w", file.ID, err)
|
||||||
|
}
|
||||||
|
header_types, header_names := parseHeader(h)
|
||||||
|
/*
|
||||||
|
TODO: Add support for missing headersi
|
||||||
|
missing_headers := missingRequiredHeaders(header_types)
|
||||||
|
for _, mh := range missing_headers {
|
||||||
|
errorMissingHeader(ctx, txn, c, mh)
|
||||||
|
file.Update(ctx, txn, &models.FileuploadFileSetter{
|
||||||
|
Status: omit.From(enums.FileuploadFilestatustypeError),
|
||||||
|
})
|
||||||
|
return pools, nil
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// Start at 2 because the header is line 1, not line 0
|
||||||
|
line_number := int32(2)
|
||||||
|
for {
|
||||||
|
row, err := reader.Read()
|
||||||
|
if err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
return rows, nil
|
||||||
|
}
|
||||||
|
return rows, fmt.Errorf("Failed to read all CSV records for file %d: %w", file.ID, err)
|
||||||
|
}
|
||||||
|
m, err := insertModel(ctx, txn, file, c, line_number, header_types, header_names, row)
|
||||||
|
rows = append(rows, m)
|
||||||
|
line_number = line_number + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func insertFlyover(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV, line_number int32, header_types []headerFlyoverEnum, header_names []string, row []string) (*models.FileuploadFlyoverAerialService, error) {
|
||||||
|
setter := models.FileuploadFlyoverAerialServiceSetter{
|
||||||
|
Committed: omit.From(false),
|
||||||
|
Condition: omit.From(enums.FileuploadPoolconditiontypeUnknown),
|
||||||
|
Created: omit.From(time.Now()),
|
||||||
|
CreatorID: omit.From(file.CreatorID),
|
||||||
|
CSVFile: omit.From(file.ID),
|
||||||
|
Deleted: omitnull.FromPtr[time.Time](nil),
|
||||||
|
Geom: omitnull.FromPtr[string](nil),
|
||||||
|
H3cell: omitnull.FromPtr[string](nil),
|
||||||
|
// ID - generated
|
||||||
|
OrganizationID: omit.From(file.OrganizationID),
|
||||||
|
}
|
||||||
|
var lat, lng float64
|
||||||
|
var err error
|
||||||
|
for i, value := range row {
|
||||||
|
if value == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
header_type := header_types[i]
|
||||||
|
switch header_type {
|
||||||
|
case headerFlyoverComment:
|
||||||
|
condition, err := parsePoolCondition(value)
|
||||||
|
if err == nil {
|
||||||
|
setter.Condition = omit.From(condition)
|
||||||
|
} else {
|
||||||
|
addError(ctx, txn, c, int32(line_number), int32(i), fmt.Sprintf("'%s' is not a pool condition that we recognize. It should be one of %s", value, poolConditionValidValues()))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
case headerFlyoverLatitude:
|
||||||
|
lat, err = strconv.ParseFloat(value, 10)
|
||||||
|
if err != nil {
|
||||||
|
addError(ctx, txn, c, int32(line_number), int32(i), fmt.Sprintf("'%s' is not decimal value", value))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
case headerFlyoverLongitude:
|
||||||
|
lng, err = strconv.ParseFloat(value, 10)
|
||||||
|
if err != nil {
|
||||||
|
addError(ctx, txn, c, int32(line_number), int32(i), fmt.Sprintf("'%s' is not decimal value", value))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flyover, err := models.FileuploadFlyoverAerialServices.Insert(&setter).One(ctx, txn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Failed to create flyover: %w", err)
|
||||||
|
}
|
||||||
|
cell, err := h3utils.GetCell(lng, lat, 15)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to convert lat %f lng %f to h3 cell", lng, lat)
|
||||||
|
}
|
||||||
|
geom_query := geom.PostgisPointQuery(lng, lat)
|
||||||
|
_, err = psql.Update(
|
||||||
|
um.Table("fileupload.flyover_aerial_service"),
|
||||||
|
um.SetCol("h3cell").ToArg(cell),
|
||||||
|
um.SetCol("geom").To(geom_query),
|
||||||
|
um.Where(psql.Quote("id").EQ(psql.Arg(flyover.ID))),
|
||||||
|
).Exec(ctx, txn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to update flyover geometry: %w", err)
|
||||||
|
}
|
||||||
|
return flyover, nil
|
||||||
|
}
|
||||||
|
func insertPoollistRow(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV, line_number int32, header_types []headerPoolEnum, header_names []string, row []string) (*models.FileuploadPool, error) {
|
||||||
|
tags := make(map[string]string, 0)
|
||||||
|
// Start with a setter with default values, comment out the required fields to ensure they're set
|
||||||
|
setter := models.FileuploadPoolSetter{
|
||||||
|
// AddressCity: omit.From(),
|
||||||
|
// AddressPostalCode: omit.From(),
|
||||||
|
// AddressStreet: omit.From(),
|
||||||
|
Committed: omit.From(false),
|
||||||
|
Condition: omit.From(enums.FileuploadPoolconditiontypeUnknown),
|
||||||
|
Created: omit.From(time.Now()),
|
||||||
|
CreatorID: omit.From(file.CreatorID),
|
||||||
|
CSVFile: omit.From(file.ID),
|
||||||
|
Deleted: omitnull.FromPtr[time.Time](nil),
|
||||||
|
Geom: omitnull.FromPtr[string](nil),
|
||||||
|
H3cell: omitnull.FromPtr[string](nil),
|
||||||
|
// ID - generated
|
||||||
|
IsInDistrict: omit.From(false),
|
||||||
|
IsNew: omit.From(true),
|
||||||
|
LineNumber: omit.From(line_number),
|
||||||
|
Notes: omit.From(""),
|
||||||
|
OrganizationID: omit.From(file.OrganizationID),
|
||||||
|
PropertyOwnerName: omit.From(""),
|
||||||
|
PropertyOwnerPhoneE164: omitnull.FromPtr[string](nil),
|
||||||
|
ResidentOwned: omitnull.FromPtr[bool](nil),
|
||||||
|
ResidentPhoneE164: omitnull.FromPtr[string](nil),
|
||||||
|
// Can't set this via a Setter
|
||||||
|
// Tags: convertToPGData(tags),
|
||||||
|
}
|
||||||
|
for i, value := range row {
|
||||||
|
if value == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
header_type := header_types[i]
|
||||||
|
switch header_type {
|
||||||
|
case headerAddressCity:
|
||||||
|
setter.AddressCity = omit.From(value)
|
||||||
|
case headerAddressPostalCode:
|
||||||
|
setter.AddressPostalCode = omit.From(value)
|
||||||
|
case headerAddressStreet:
|
||||||
|
setter.AddressStreet = omit.From(value)
|
||||||
|
case headerCondition:
|
||||||
|
condition, err := parsePoolCondition(value)
|
||||||
|
if err == nil {
|
||||||
|
setter.Condition = omit.From(condition)
|
||||||
|
} else {
|
||||||
|
addError(ctx, txn, c, int32(line_number), int32(i), fmt.Sprintf("'%s' is not a pool condition that we recognize. It should be one of %s", value, poolConditionValidValues()))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
case headerNotes:
|
||||||
|
setter.Notes = omit.From(value)
|
||||||
|
case headerPropertyOwnerName:
|
||||||
|
setter.PropertyOwnerName = omit.From(value)
|
||||||
|
case headerPropertyOwnerPhone:
|
||||||
|
phone, err := text.ParsePhoneNumber(value)
|
||||||
|
if err != nil {
|
||||||
|
addError(ctx, txn, c, int32(line_number), int32(i), fmt.Sprintf("'%s' is not a phone number that we recognize. Ideally it should be of the form '+12223334444'", value))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
text.EnsureInDB(ctx, txn, *phone)
|
||||||
|
setter.PropertyOwnerPhoneE164 = omitnull.From(text.PhoneString(*phone))
|
||||||
|
case headerResidentOwned:
|
||||||
|
boolValue, err := parseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
addError(ctx, txn, c, int32(line_number), int32(i), fmt.Sprintf("'%s' is not something that we recognize as a true/false value. Please use either 'true' or 'false'", value))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
setter.ResidentOwned = omitnull.From(boolValue)
|
||||||
|
case headerResidentPhone:
|
||||||
|
phone, err := text.ParsePhoneNumber(value)
|
||||||
|
if err != nil {
|
||||||
|
addError(ctx, txn, c, int32(line_number), int32(i), fmt.Sprintf("'%s' is not a phone number that we recognize. Ideally it should be of the form '+12223334444'", value))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
text.EnsureInDB(ctx, txn, *phone)
|
||||||
|
setter.ResidentPhoneE164 = omitnull.From(text.PhoneString(*phone))
|
||||||
|
case headerTag:
|
||||||
|
tags[header_names[i]] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
setter.Tags = omit.From(db.ConvertToPGData(tags))
|
||||||
|
return models.FileuploadPools.Insert(&setter).One(ctx, txn)
|
||||||
|
}
|
||||||
|
|
||||||
|
type parseHeaderFunc[EnumType any] = func(row []string) ([]EnumType, []string)
|
||||||
|
|
||||||
|
func makeParseHeaders[EnumType any](headerToType map[string]EnumType) parseHeaderFunc[EnumType] {
|
||||||
|
return func(row []string) ([]EnumType, []string) {
|
||||||
|
result_enums := make([]EnumType, len(row))
|
||||||
|
result_names := make([]string, len(row))
|
||||||
|
for i, h := range row {
|
||||||
|
ht := strings.TrimSpace(h)
|
||||||
|
hl := strings.ToLower(ht)
|
||||||
|
log.Debug().Str("header", hl).Msg("Saw CSV header")
|
||||||
|
var type_ EnumType
|
||||||
|
type_, ok := headerToType[hl]
|
||||||
|
if !ok {
|
||||||
|
// See if there is a '*' entry which should match anything
|
||||||
|
all_type, ok2 := headerToType["*"]
|
||||||
|
if !ok2 {
|
||||||
|
log.Error().Str("name", hl).Msg("No header type matches column. You should add a '*' to the makeParseHeaders call")
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
type_ = all_type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result_enums[i] = type_
|
||||||
|
result_names[i] = hl
|
||||||
|
}
|
||||||
|
|
||||||
|
return result_enums, result_names
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func processCSVFlyover(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV, rows []*models.FileuploadFlyoverAerialService) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var poolConditionAliases = map[string]string{
|
||||||
|
"covered": "unknown",
|
||||||
|
"dark bottom": "unknown",
|
||||||
|
"no data": "unknown",
|
||||||
|
"empty": "dry",
|
||||||
|
"green": "green",
|
||||||
|
"murky pool": "murky",
|
||||||
|
"putting green": "false pool",
|
||||||
|
"questionable": "unknown",
|
||||||
|
}
|
||||||
|
|
||||||
|
func parsePoolCondition(c string) (enums.FileuploadPoolconditiontype, error) {
|
||||||
|
var condition enums.FileuploadPoolconditiontype
|
||||||
|
col_l := strings.ToLower(c)
|
||||||
|
col_translated, ok := poolConditionAliases[col_l]
|
||||||
|
if ok {
|
||||||
|
col_l = col_translated
|
||||||
|
}
|
||||||
|
err := condition.Scan(col_l)
|
||||||
|
return condition, err
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -66,47 +65,6 @@ func (e headerPoolEnum) String() string {
|
||||||
return "bad programmer"
|
return "bad programmer"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func ProcessJob(ctx context.Context, file_id int32) error {
|
|
||||||
file, err := models.FindFileuploadFile(ctx, db.PGInstance.BobDB, file_id)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Failed to get file %d from DB: %w", file_id, err)
|
|
||||||
}
|
|
||||||
txn, err := db.PGInstance.BobDB.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Failed to start transaction: %w", err)
|
|
||||||
}
|
|
||||||
defer txn.Rollback(ctx)
|
|
||||||
c, err := models.FindFileuploadCSV(ctx, txn, file.ID)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Failed to get csv file %d from DB: %w", file.ID, err)
|
|
||||||
}
|
|
||||||
pools, err := parseFile(ctx, txn, file, c)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("parse file: %w", err)
|
|
||||||
}
|
|
||||||
_, err = psql.Update(
|
|
||||||
um.Table("fileupload.csv"),
|
|
||||||
um.SetCol("rowcount").ToArg(len(pools)),
|
|
||||||
um.Where(psql.Quote("file_id").EQ(psql.Arg(file_id))),
|
|
||||||
).Exec(ctx, txn)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("update csv row: %w", err)
|
|
||||||
}
|
|
||||||
org, err := models.FindOrganization(ctx, db.PGInstance.BobDB, file.OrganizationID)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("get org: %w", err)
|
|
||||||
}
|
|
||||||
err = bulkGeocode(ctx, txn, file, c, pools, org)
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msg("Failure during geocoding")
|
|
||||||
}
|
|
||||||
file.Update(ctx, txn, &models.FileuploadFileSetter{
|
|
||||||
Status: omit.From(enums.FileuploadFilestatustypeParsed),
|
|
||||||
})
|
|
||||||
log.Info().Int32("file.ID", file.ID).Msg("Set file to parsed")
|
|
||||||
txn.Commit(ctx)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func bulkGeocode(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV, pools []*models.FileuploadPool, org *models.Organization) error {
|
func bulkGeocode(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV, pools []*models.FileuploadPool, org *models.Organization) error {
|
||||||
if len(pools) == 0 {
|
if len(pools) == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -215,7 +173,7 @@ func geocode(ctx context.Context, txn bob.Tx, client *stadia.StadiaMaps, job *jo
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func parseFile(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV) ([]*models.FileuploadPool, error) {
|
func parseCSVPoollist(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV) ([]*models.FileuploadPool, error) {
|
||||||
pools := make([]*models.FileuploadPool, 0)
|
pools := make([]*models.FileuploadPool, 0)
|
||||||
r, err := userfile.NewFileReader(userfile.CollectionCSV, file.FileUUID)
|
r, err := userfile.NewFileReader(userfile.CollectionCSV, file.FileUUID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -339,45 +297,18 @@ func parseFile(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *
|
||||||
line_number = line_number + 1
|
line_number = line_number + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func addError(ctx context.Context, txn bob.Tx, c *models.FileuploadCSV, row_number int32, column_number int32, msg string) error {
|
func processCSVPoollist(ctx context.Context, txn bob.Tx, file *models.FileuploadFile, c *models.FileuploadCSV, parsed []*models.FileuploadPool) error {
|
||||||
r, err := models.FileuploadErrorCSVS.Insert(&models.FileuploadErrorCSVSetter{
|
org, err := models.FindOrganization(ctx, db.PGInstance.BobDB, file.OrganizationID)
|
||||||
Col: omit.From(column_number),
|
|
||||||
CSVFileID: omit.From(c.FileID),
|
|
||||||
// ID
|
|
||||||
Line: omit.From(row_number),
|
|
||||||
Message: omit.From(msg),
|
|
||||||
}).One(ctx, txn)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to add error: %w", err)
|
return fmt.Errorf("get org: %w", err)
|
||||||
|
}
|
||||||
|
err = bulkGeocode(ctx, txn, file, c, parsed, org)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("Failure during geocoding")
|
||||||
}
|
}
|
||||||
log.Info().Int32("id", r.ID).Int32("file_id", c.FileID).Str("msg", msg).Int32("row", row_number).Int32("col", column_number).Msg("Created CSV file error")
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func addImportError(file *models.FileuploadFile, err error) {
|
|
||||||
log.Debug().Err(err).Int32("file_id", file.ID).Msg("Fake add import error")
|
|
||||||
}
|
|
||||||
func parseBool(s string) (bool, error) {
|
|
||||||
sl := strings.ToLower(s)
|
|
||||||
boolValue, err := strconv.ParseBool(sl)
|
|
||||||
if err != nil {
|
|
||||||
// Handle some of the stuff that strconv doesn't handle
|
|
||||||
switch sl {
|
|
||||||
case "yes":
|
|
||||||
return true, nil
|
|
||||||
case "no":
|
|
||||||
return false, nil
|
|
||||||
default:
|
|
||||||
return false, fmt.Errorf("unrecognized '%s'", sl)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return boolValue, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func errorMissingHeader(ctx context.Context, txn bob.Tx, c *models.FileuploadCSV, h headerPoolEnum) error {
|
|
||||||
msg := fmt.Sprintf("The file is missing the '%s' header", h.String())
|
|
||||||
return addError(ctx, txn, c, 0, 0, msg)
|
|
||||||
}
|
|
||||||
func maybeAddServiceArea(req *stadia.StructuredGeocodeRequest, org *models.Organization) {
|
func maybeAddServiceArea(req *stadia.StructuredGeocodeRequest, org *models.Organization) {
|
||||||
/*
|
/*
|
||||||
if org.ServiceAreaXmax.IsNull() ||
|
if org.ServiceAreaXmax.IsNull() ||
|
||||||
|
|
|
||||||
42
platform/pdf/pdf.go
Normal file
42
platform/pdf/pdf.go
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
package pdf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
||||||
|
"github.com/chromedp/cdproto/page"
|
||||||
|
"github.com/chromedp/chromedp"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GeneratePDF(ctx context.Context, code string) ([]byte, error) {
|
||||||
|
// create context
|
||||||
|
chrome_ctx, cancel := chromedp.NewContext(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
// capture pdf
|
||||||
|
var buf []byte
|
||||||
|
url := fmt.Sprintf("http://%s/mailer/%s/preview", config.Bind, code)
|
||||||
|
log.Info().Str("url", url).Msg("Getting with headless chrome")
|
||||||
|
if err := chromedp.Run(chrome_ctx, printToPDF(url, &buf)); err != nil {
|
||||||
|
return nil, fmt.Errorf("print to pdf: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// print a specific pdf page.
|
||||||
|
func printToPDF(urlstr string, res *[]byte) chromedp.Tasks {
|
||||||
|
return chromedp.Tasks{
|
||||||
|
chromedp.Navigate(urlstr),
|
||||||
|
chromedp.ActionFunc(func(ctx context.Context) error {
|
||||||
|
buf, _, err := page.PrintToPDF().WithPrintBackground(false).Do(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*res = buf
|
||||||
|
return nil
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -44,16 +44,16 @@ type UploadPoolRow struct {
|
||||||
Street string
|
Street string
|
||||||
Tags map[string]string
|
Tags map[string]string
|
||||||
}
|
}
|
||||||
type PoolUpload struct {
|
type Upload struct {
|
||||||
Created time.Time `db:"created"`
|
Created time.Time `db:"created"`
|
||||||
ID int32 `db:"id"`
|
ID int32 `db:"id"`
|
||||||
Status string `db:"status"`
|
Status string `db:"status"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPoolUpload(ctx context.Context, u *models.User, upload userfile.FileUpload) (PoolUpload, error) {
|
func NewUpload(ctx context.Context, u *models.User, upload userfile.FileUpload, t enums.FileuploadCsvtype) (Upload, error) {
|
||||||
txn, err := db.PGInstance.BobDB.BeginTx(ctx, nil)
|
txn, err := db.PGInstance.BobDB.BeginTx(ctx, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return PoolUpload{}, fmt.Errorf("Failed to begin transaction: %w", err)
|
return Upload{}, fmt.Errorf("Failed to begin transaction: %w", err)
|
||||||
}
|
}
|
||||||
defer txn.Rollback(ctx)
|
defer txn.Rollback(ctx)
|
||||||
|
|
||||||
|
|
@ -69,21 +69,21 @@ func NewPoolUpload(ctx context.Context, u *models.User, upload userfile.FileUplo
|
||||||
FileUUID: omit.From(upload.UUID),
|
FileUUID: omit.From(upload.UUID),
|
||||||
}).One(ctx, txn)
|
}).One(ctx, txn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return PoolUpload{}, fmt.Errorf("Failed to create file upload: %w", err)
|
return Upload{}, fmt.Errorf("Failed to create file upload: %w", err)
|
||||||
}
|
}
|
||||||
_, err = models.FileuploadCSVS.Insert(&models.FileuploadCSVSetter{
|
_, err = models.FileuploadCSVS.Insert(&models.FileuploadCSVSetter{
|
||||||
Committed: omitnull.FromPtr[time.Time](nil),
|
Committed: omitnull.FromPtr[time.Time](nil),
|
||||||
FileID: omit.From(file.ID),
|
FileID: omit.From(file.ID),
|
||||||
Rowcount: omit.From(int32(0)),
|
Rowcount: omit.From(int32(0)),
|
||||||
Type: omit.From(enums.FileuploadCsvtypePoollist),
|
Type: omit.From(t),
|
||||||
}).One(ctx, txn)
|
}).One(ctx, txn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return PoolUpload{}, fmt.Errorf("Failed to create csv: %w", err)
|
return Upload{}, fmt.Errorf("Failed to create csv: %w", err)
|
||||||
}
|
}
|
||||||
log.Info().Int32("id", file.ID).Msg("Created new pool CSV upload")
|
log.Info().Int32("id", file.ID).Msg("Created new pool CSV upload")
|
||||||
txn.Commit(ctx)
|
txn.Commit(ctx)
|
||||||
background.ProcessUpload(file.ID)
|
background.ProcessUpload(file.ID, t)
|
||||||
return PoolUpload{
|
return Upload{
|
||||||
ID: file.ID,
|
ID: file.ID,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
@ -115,7 +115,7 @@ func GetUploadPoolDetail(ctx context.Context, organization_id int32, file_id int
|
||||||
if row.Line == 0 {
|
if row.Line == 0 {
|
||||||
file_errors = append(file_errors, e)
|
file_errors = append(file_errors, e)
|
||||||
} else {
|
} else {
|
||||||
log.Info().Int32("line", row.Line).Msg("Found error")
|
//log.Info().Int32("line", row.Line).Msg("Found error")
|
||||||
by_line, ok := errors_by_line[row.Line]
|
by_line, ok := errors_by_line[row.Line]
|
||||||
if !ok {
|
if !ok {
|
||||||
errors_by_line[row.Line] = []UploadPoolError{e}
|
errors_by_line[row.Line] = []UploadPoolError{e}
|
||||||
|
|
@ -175,8 +175,8 @@ func GetUploadPoolDetail(ctx context.Context, organization_id int32, file_id int
|
||||||
Status: file.Status.String(),
|
Status: file.Status.String(),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
func PoolUploadList(ctx context.Context, organization_id int32) ([]PoolUpload, error) {
|
func PoolUploadList(ctx context.Context, organization_id int32) ([]Upload, error) {
|
||||||
results := make([]PoolUpload, 0)
|
results := make([]Upload, 0)
|
||||||
rows, err := bob.All(ctx, db.PGInstance.BobDB, psql.Select(
|
rows, err := bob.All(ctx, db.PGInstance.BobDB, psql.Select(
|
||||||
sm.Columns(
|
sm.Columns(
|
||||||
// fileupload.csv columns
|
// fileupload.csv columns
|
||||||
|
|
@ -200,7 +200,7 @@ func PoolUploadList(ctx context.Context, organization_id int32) ([]PoolUpload, e
|
||||||
sm.From("fileupload.csv").As("csv"),
|
sm.From("fileupload.csv").As("csv"),
|
||||||
sm.InnerJoin("fileupload.file").As("file").OnEQ(psql.Raw("csv.file_id"), psql.Raw("file.id")),
|
sm.InnerJoin("fileupload.file").As("file").OnEQ(psql.Raw("csv.file_id"), psql.Raw("file.id")),
|
||||||
sm.Where(psql.Raw("file.organization_id").EQ(psql.Arg(organization_id))),
|
sm.Where(psql.Raw("file.organization_id").EQ(psql.Arg(organization_id))),
|
||||||
), scan.StructMapper[PoolUpload]())
|
), scan.StructMapper[Upload]())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return results, fmt.Errorf("Failed to query pool upload rows: %w", err)
|
return results, fmt.Errorf("Failed to query pool upload rows: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,9 @@ type UploadSummary struct {
|
||||||
Type string `db:"type"`
|
Type string `db:"type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func UploadCommit(ctx context.Context, org *models.Organization, file_id int32) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
func UploadDiscard(ctx context.Context, org *models.Organization, file_id int32) error {
|
func UploadDiscard(ctx context.Context, org *models.Organization, file_id int32) error {
|
||||||
_, err := psql.Update(
|
_, err := psql.Update(
|
||||||
um.Table(models.FileuploadFiles.Alias()),
|
um.Table(models.FileuploadFiles.Alias()),
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,16 @@
|
||||||
package sync
|
package sync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
//"strconv"
|
|
||||||
|
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/config"
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/db"
|
"github.com/Gleipnir-Technology/nidus-sync/db"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/html"
|
"github.com/Gleipnir-Technology/nidus-sync/html"
|
||||||
//"github.com/google/uuid"
|
"github.com/Gleipnir-Technology/nidus-sync/platform/pdf"
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -22,8 +24,26 @@ type contentMailer struct {
|
||||||
ReportURL string
|
ReportURL string
|
||||||
}
|
}
|
||||||
|
|
||||||
// func getMailer(ctx context.Context, r *http.Request, org *models.Organization, user *models.User) (*response[contentMailer], *errorWithStatus) {
|
|
||||||
func getMailer(w http.ResponseWriter, r *http.Request) {
|
func getMailer(w http.ResponseWriter, r *http.Request) {
|
||||||
|
code := chi.URLParam(r, "code")
|
||||||
|
if code == "" {
|
||||||
|
http.Error(w, "empty code", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
content, err := pdf.GeneratePDF(r.Context(), code)
|
||||||
|
if err != nil {
|
||||||
|
respondError(w, "generate pdf failure", err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", "application/pdf")
|
||||||
|
disposition := fmt.Sprintf("attachment; filename=\"compliance-mailer-%s.pdf\"", code)
|
||||||
|
w.Header().Set("Content-Disposition", disposition)
|
||||||
|
_, err = io.Copy(w, bytes.NewReader(content))
|
||||||
|
if err != nil {
|
||||||
|
respondError(w, "copy error", err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func getMailerPreview(w http.ResponseWriter, r *http.Request) {
|
func getMailerPreview(w http.ResponseWriter, r *http.Request) {
|
||||||
code := chi.URLParam(r, "code")
|
code := chi.URLParam(r, "code")
|
||||||
|
|
|
||||||
|
|
@ -60,11 +60,12 @@ func Router() chi.Router {
|
||||||
r.Method("GET", "/configuration/pesticide/add", authenticatedHandler(getConfigurationPesticideAdd))
|
r.Method("GET", "/configuration/pesticide/add", authenticatedHandler(getConfigurationPesticideAdd))
|
||||||
r.Method("GET", "/configuration/upload", authenticatedHandler(getUploadList))
|
r.Method("GET", "/configuration/upload", authenticatedHandler(getUploadList))
|
||||||
r.Method("GET", "/configuration/upload/pool", authenticatedHandler(getUploadPool))
|
r.Method("GET", "/configuration/upload/pool", authenticatedHandler(getUploadPool))
|
||||||
r.Method("GET", "/configuration/upload/pool/bob", authenticatedHandler(getUploadPoolBobCreate))
|
r.Method("GET", "/configuration/upload/pool/flyover", authenticatedHandler(getUploadPoolFlyoverCreate))
|
||||||
r.Method("POST", "/configuration/upload/pool/bob", authenticatedHandlerPostMultipart(postUploadPoolBobCreate))
|
r.Method("POST", "/configuration/upload/pool/flyover", authenticatedHandlerPostMultipart(postUploadPoolFlyoverCreate))
|
||||||
r.Method("GET", "/configuration/upload/pool/custom", authenticatedHandler(getUploadPoolCustomCreate))
|
r.Method("GET", "/configuration/upload/pool/custom", authenticatedHandler(getUploadPoolCustomCreate))
|
||||||
r.Method("POST", "/configuration/upload/pool/custom", authenticatedHandlerPostMultipart(postUploadPoolCustomCreate))
|
r.Method("POST", "/configuration/upload/pool/custom", authenticatedHandlerPostMultipart(postUploadPoolCustomCreate))
|
||||||
r.Method("GET", "/configuration/upload/{id}", authenticatedHandler(getUploadByID))
|
r.Method("GET", "/configuration/upload/{id}", authenticatedHandler(getUploadByID))
|
||||||
|
r.Method("POST", "/configuration/upload/{id}/commit", authenticatedHandlerPost(postUploadCommit))
|
||||||
r.Method("POST", "/configuration/upload/{id}/discard", authenticatedHandlerPost(postUploadDiscard))
|
r.Method("POST", "/configuration/upload/{id}/discard", authenticatedHandlerPost(postUploadDiscard))
|
||||||
r.Method("GET", "/configuration/user", authenticatedHandler(getConfigurationUserList))
|
r.Method("GET", "/configuration/user", authenticatedHandler(getConfigurationUserList))
|
||||||
r.Method("GET", "/configuration/user/add", authenticatedHandler(getConfigurationUserAdd))
|
r.Method("GET", "/configuration/user/add", authenticatedHandler(getConfigurationUserAdd))
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,12 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/config"
|
"github.com/Gleipnir-Technology/nidus-sync/db/enums"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/platform"
|
"github.com/Gleipnir-Technology/nidus-sync/platform"
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/userfile"
|
"github.com/Gleipnir-Technology/nidus-sync/userfile"
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type contentUploadList struct {
|
type contentUploadList struct {
|
||||||
|
|
@ -25,25 +26,13 @@ func getUploadList(ctx context.Context, r *http.Request, org *models.Organizatio
|
||||||
}), newErrorMaybe("get upload list: %w", err)
|
}), newErrorMaybe("get upload list: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
type contentUploadURL struct {
|
|
||||||
Discard string // URL for discarding the upload
|
|
||||||
}
|
|
||||||
|
|
||||||
func newContentUploadURL(id int32) contentUploadURL {
|
|
||||||
id_str := strconv.FormatInt(int64(id), 10)
|
|
||||||
return contentUploadURL{
|
|
||||||
Discard: config.MakeURLNidus("/upload/%s/discard", id_str),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type contentUploadDetail struct {
|
type contentUploadDetail struct {
|
||||||
CSVFileID int32
|
CSVFileID int32
|
||||||
Organization *models.Organization
|
Organization *models.Organization
|
||||||
Upload platform.UploadPoolDetail
|
Upload platform.UploadPoolDetail
|
||||||
URL contentUploadURL
|
|
||||||
}
|
}
|
||||||
type contentUploadPoolList struct {
|
type contentUploadPoolList struct {
|
||||||
Uploads []platform.PoolUpload
|
Uploads []platform.Upload
|
||||||
}
|
}
|
||||||
type contentUploadPool struct{}
|
type contentUploadPool struct{}
|
||||||
|
|
||||||
|
|
@ -52,11 +41,11 @@ func getUploadPool(ctx context.Context, r *http.Request, org *models.Organizatio
|
||||||
return newResponse("sync/upload-csv-pool.html", data), nil
|
return newResponse("sync/upload-csv-pool.html", data), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type contentUploadPoolBobCreate struct{}
|
type contentUploadPoolFlyoverCreate struct{}
|
||||||
|
|
||||||
func getUploadPoolBobCreate(ctx context.Context, r *http.Request, org *models.Organization, u *models.User) (*response[contentUploadPoolBobCreate], *errorWithStatus) {
|
func getUploadPoolFlyoverCreate(ctx context.Context, r *http.Request, org *models.Organization, u *models.User) (*response[contentUploadPoolFlyoverCreate], *errorWithStatus) {
|
||||||
data := contentUploadPoolBobCreate{}
|
data := contentUploadPoolFlyoverCreate{}
|
||||||
return newResponse("sync/upload-csv-pool-bob.html", data), nil
|
return newResponse("sync/upload-csv-pool-flyover.html", data), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type contentUploadPoolCustomCreate struct{}
|
type contentUploadPoolCustomCreate struct{}
|
||||||
|
|
@ -66,6 +55,8 @@ func getUploadPoolCustomCreate(ctx context.Context, r *http.Request, org *models
|
||||||
return newResponse("sync/upload-csv-pool-custom.html", data), nil
|
return newResponse("sync/upload-csv-pool-custom.html", data), nil
|
||||||
}
|
}
|
||||||
func getUploadByID(ctx context.Context, r *http.Request, org *models.Organization, u *models.User) (*response[contentUploadDetail], *errorWithStatus) {
|
func getUploadByID(ctx context.Context, r *http.Request, org *models.Organization, u *models.User) (*response[contentUploadDetail], *errorWithStatus) {
|
||||||
|
test := newContentURLUpload()
|
||||||
|
log.Info().Str("output", test.Discard(123)).Send()
|
||||||
file_id_str := chi.URLParam(r, "id")
|
file_id_str := chi.URLParam(r, "id")
|
||||||
file_id_, err := strconv.ParseInt(file_id_str, 10, 32)
|
file_id_, err := strconv.ParseInt(file_id_str, 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -80,11 +71,25 @@ func getUploadByID(ctx context.Context, r *http.Request, org *models.Organizatio
|
||||||
CSVFileID: file_id,
|
CSVFileID: file_id,
|
||||||
Organization: org,
|
Organization: org,
|
||||||
Upload: detail,
|
Upload: detail,
|
||||||
URL: newContentUploadURL(file_id),
|
|
||||||
}
|
}
|
||||||
return newResponse("sync/upload-by-id.html", data), nil
|
return newResponse("sync/upload-by-id.html", data), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FormUploadCommit struct{}
|
||||||
|
|
||||||
|
func postUploadCommit(ctx context.Context, r *http.Request, org *models.Organization, u *models.User, f FormUploadCommit) (string, *errorWithStatus) {
|
||||||
|
file_id_str := chi.URLParam(r, "id")
|
||||||
|
file_id_, err := strconv.ParseInt(file_id_str, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return "", newError("Failed to parse file_id: %w", err)
|
||||||
|
}
|
||||||
|
err = platform.UploadCommit(ctx, org, int32(file_id_))
|
||||||
|
if err != nil {
|
||||||
|
return "", newError("Failed to mark discarded: %w", err)
|
||||||
|
}
|
||||||
|
return "/configuration/upload", nil
|
||||||
|
}
|
||||||
|
|
||||||
type FormUploadDiscard struct{}
|
type FormUploadDiscard struct{}
|
||||||
|
|
||||||
func postUploadDiscard(ctx context.Context, r *http.Request, org *models.Organization, u *models.User, f FormUploadDiscard) (string, *errorWithStatus) {
|
func postUploadDiscard(ctx context.Context, r *http.Request, org *models.Organization, u *models.User, f FormUploadDiscard) (string, *errorWithStatus) {
|
||||||
|
|
@ -97,13 +102,28 @@ func postUploadDiscard(ctx context.Context, r *http.Request, org *models.Organiz
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", newError("Failed to mark discarded: %w", err)
|
return "", newError("Failed to mark discarded: %w", err)
|
||||||
}
|
}
|
||||||
return "/upload", nil
|
return "/configuration/upload", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type FormUploadPool struct{}
|
type FormUploadPool struct{}
|
||||||
|
|
||||||
func postUploadPoolBobCreate(ctx context.Context, r *http.Request, org *models.Organization, u *models.User, f FormUploadPool) (string, *errorWithStatus) {
|
func postUploadPoolFlyoverCreate(ctx context.Context, r *http.Request, org *models.Organization, u *models.User, f FormUploadPool) (string, *errorWithStatus) {
|
||||||
return "", nil
|
uploads, err := userfile.SaveFileUpload(r, "csvfile", userfile.CollectionCSV)
|
||||||
|
if err != nil {
|
||||||
|
return "", newError("Failed to extract image uploads: %s", err)
|
||||||
|
}
|
||||||
|
if len(uploads) == 0 {
|
||||||
|
return "", newErrorStatus(http.StatusBadRequest, "No upload found")
|
||||||
|
}
|
||||||
|
if len(uploads) != 1 {
|
||||||
|
return "", newErrorStatus(http.StatusBadRequest, "You must only submit one file at a time")
|
||||||
|
}
|
||||||
|
upload := uploads[0]
|
||||||
|
saved_upload, err := platform.NewUpload(r.Context(), u, upload, enums.FileuploadCsvtypeFlyover)
|
||||||
|
if err != nil {
|
||||||
|
return "", newError("Failed to create new pool: %w", err)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("/configuration/upload/%d", saved_upload.ID), nil
|
||||||
}
|
}
|
||||||
func postUploadPoolCustomCreate(ctx context.Context, r *http.Request, org *models.Organization, u *models.User, f FormUploadPool) (string, *errorWithStatus) {
|
func postUploadPoolCustomCreate(ctx context.Context, r *http.Request, org *models.Organization, u *models.User, f FormUploadPool) (string, *errorWithStatus) {
|
||||||
uploads, err := userfile.SaveFileUpload(r, "csvfile", userfile.CollectionCSV)
|
uploads, err := userfile.SaveFileUpload(r, "csvfile", userfile.CollectionCSV)
|
||||||
|
|
@ -117,9 +137,9 @@ func postUploadPoolCustomCreate(ctx context.Context, r *http.Request, org *model
|
||||||
return "", newErrorStatus(http.StatusBadRequest, "You must only submit one file at a time")
|
return "", newErrorStatus(http.StatusBadRequest, "You must only submit one file at a time")
|
||||||
}
|
}
|
||||||
upload := uploads[0]
|
upload := uploads[0]
|
||||||
pool_upload, err := platform.NewPoolUpload(r.Context(), u, upload)
|
pool_upload, err := platform.NewUpload(r.Context(), u, upload, enums.FileuploadCsvtypePoollist)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", newError("Failed to create new pool: %w", err)
|
return "", newError("Failed to create new pool: %w", err)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("/upload/%d", pool_upload.ID), nil
|
return fmt.Sprintf("/configuration/upload/%d", pool_upload.ID), nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
sync/url.go
18
sync/url.go
|
|
@ -1,6 +1,8 @@
|
||||||
package sync
|
package sync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/Gleipnir-Technology/nidus-sync/config"
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -74,17 +76,29 @@ func newContentURLSidebar() contentURLSidebar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type urlForID = func(int) string
|
||||||
|
|
||||||
|
func makeURLForID(pattern string) urlForID {
|
||||||
|
return func(id int) string {
|
||||||
|
return config.MakeURLNidus(pattern, strconv.Itoa(id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type contentURLUpload struct {
|
type contentURLUpload struct {
|
||||||
|
Commit urlForID
|
||||||
|
Discard urlForID
|
||||||
Pool string
|
Pool string
|
||||||
PoolBob string
|
|
||||||
PoolCustom string
|
PoolCustom string
|
||||||
|
PoolFlyover string
|
||||||
SamplePoolCSV string
|
SamplePoolCSV string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newContentURLUpload() contentURLUpload {
|
func newContentURLUpload() contentURLUpload {
|
||||||
return contentURLUpload{
|
return contentURLUpload{
|
||||||
|
Commit: makeURLForID("/configuration/upload/%s/commit"),
|
||||||
|
Discard: makeURLForID("/configuration/upload/%s/discard"),
|
||||||
Pool: config.MakeURLNidus("/configuration/upload/pool"),
|
Pool: config.MakeURLNidus("/configuration/upload/pool"),
|
||||||
PoolBob: config.MakeURLNidus("/configuration/upload/pool/bob"),
|
PoolFlyover: config.MakeURLNidus("/configuration/upload/pool/flyover"),
|
||||||
PoolCustom: config.MakeURLNidus("/configuration/upload/pool/custom"),
|
PoolCustom: config.MakeURLNidus("/configuration/upload/pool/custom"),
|
||||||
SamplePoolCSV: config.MakeURLNidus("/static/file/sample-pool.csv"),
|
SamplePoolCSV: config.MakeURLNidus("/static/file/sample-pool.csv"),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,12 @@
|
||||||
INSERT INTO compliance_report_request(created, creator, id, public_id, site_id, site_version)
|
INSERT INTO compliance_report_request(created, creator, id, public_id, site_id, site_version)
|
||||||
VALUES (NOW(), :user_id, DEFAULT, :public_id, :site_id, 1);
|
VALUES (NOW(), :user_id, DEFAULT, :public_id, :site_id, 1);
|
||||||
|
|
||||||
|
|
||||||
|
-- INSERT INTO compliance_report_request (created, creator, public_id, site_id, site_version)
|
||||||
|
-- SELECT
|
||||||
|
-- NOW(),
|
||||||
|
-- 1,
|
||||||
|
-- generate_alphanumeric_code(8),
|
||||||
|
-- id,
|
||||||
|
-- version
|
||||||
|
-- FROM site;
|
||||||
|
|
|
||||||
40
tools/insert-site-from-upload.sql
Normal file
40
tools/insert-site-from-upload.sql
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
-- This query is just a one-off to quickly get uploaded data turned into sites.
|
||||||
|
INSERT INTO site (
|
||||||
|
address_id,
|
||||||
|
created,
|
||||||
|
creator_id,
|
||||||
|
notes,
|
||||||
|
organization_id,
|
||||||
|
owner_name,
|
||||||
|
parcel_id,
|
||||||
|
tags,
|
||||||
|
version
|
||||||
|
)
|
||||||
|
SELECT DISTINCT ON (closest_address.id)
|
||||||
|
closest_address.id AS address_id,
|
||||||
|
fas.created,
|
||||||
|
fas.creator_id,
|
||||||
|
'' AS notes,
|
||||||
|
fas.organization_id,
|
||||||
|
'' AS owner_name,
|
||||||
|
containing_parcel.id AS parcel_id,
|
||||||
|
''::hstore AS tags,
|
||||||
|
1 AS version
|
||||||
|
FROM fileupload.flyover_aerial_service fas
|
||||||
|
CROSS JOIN LATERAL (
|
||||||
|
SELECT a.id
|
||||||
|
FROM address a
|
||||||
|
ORDER BY a.geom <-> fas.geom
|
||||||
|
LIMIT 1
|
||||||
|
) closest_address
|
||||||
|
CROSS JOIN LATERAL (
|
||||||
|
SELECT p.id
|
||||||
|
FROM parcel p
|
||||||
|
WHERE ST_Contains(p.geometry, fas.geom)
|
||||||
|
LIMIT 1
|
||||||
|
) containing_parcel
|
||||||
|
WHERE fas.geom IS NOT NULL
|
||||||
|
AND fas.deleted IS NULL
|
||||||
|
ORDER BY closest_address.id, fas.created ASC -- Keep the earliest created per address
|
||||||
|
ON CONFLICT (address_id) DO NOTHING; -- Skip if address already has a site
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue