Pull notifications from the database

Previously we were storing them, just not showing them.
This commit is contained in:
Eli Ribble 2025-11-11 22:53:48 +00:00
parent 337e5f7a7d
commit bf3dedf7cd
No known key found for this signature in database
18 changed files with 905 additions and 586 deletions

View file

@ -458,9 +458,10 @@ func markTokenFailed(ctx context.Context, oauth *models.OauthToken) {
return return
} }
notificationSetter := models.NotificationSetter{ notificationSetter := models.NotificationSetter{
Message: omitnull.From("Oauth token invalidated"), Created: omit.From(time.Now()),
Link: omitnull.From("/oauth/refresh"), Message: omit.From("Oauth token invalidated"),
Type: omitnull.From(enums.NotificationtypeOauthTokenInvalidated), Link: omit.From("/oauth/refresh"),
Type: omit.From(enums.NotificationtypeOauthTokenInvalidated),
} }
err = user.InsertUserNotifications(ctx, PGInstance.BobDB, &notificationSetter) err = user.InsertUserNotifications(ctx, PGInstance.BobDB, &notificationSetter)
if err != nil { if err != nil {

View file

@ -429,6 +429,15 @@ var HistoryPolygonlocations = Table[
Generated: false, Generated: false,
AutoIncr: false, AutoIncr: false,
}, },
Created: column{
Name: "created",
DBType: "timestamp without time zone",
Default: "NULL",
Comment: "",
Nullable: true,
Generated: false,
AutoIncr: false,
},
}, },
Indexes: historyPolygonlocationIndexes{ Indexes: historyPolygonlocationIndexes{
HistoryPolygonlocationPkey: index{ HistoryPolygonlocationPkey: index{
@ -521,11 +530,12 @@ type historyPolygonlocationColumns struct {
GeometryX column GeometryX column
GeometryY column GeometryY column
Version column Version column
Created column
} }
func (c historyPolygonlocationColumns) AsSlice() []column { func (c historyPolygonlocationColumns) AsSlice() []column {
return []column{ return []column{
c.OrganizationID, c.Accessdesc, c.Acres, c.Active, c.Comments, c.Creationdate, c.Creator, c.Description, c.Externalid, c.Editdate, c.Editor, c.Filter, c.Globalid, c.Habitat, c.Hectares, c.Jurisdiction, c.Larvinspectinterval, c.Lastinspectactiontaken, c.Lastinspectactivity, c.Lastinspectavglarvae, c.Lastinspectavgpupae, c.Lastinspectbreeding, c.Lastinspectconditions, c.Lastinspectdate, c.Lastinspectfieldspecies, c.Lastinspectlstages, c.Lasttreatactivity, c.Lasttreatdate, c.Lasttreatproduct, c.Lasttreatqty, c.Lasttreatqtyunit, c.Locationnumber, c.Name, c.Nextactiondatescheduled, c.Objectid, c.Priority, c.Symbology, c.ShapeArea, c.ShapeLength, c.Usetype, c.Waterorigin, c.Zone, c.Zone2, c.GeometryX, c.GeometryY, c.Version, c.OrganizationID, c.Accessdesc, c.Acres, c.Active, c.Comments, c.Creationdate, c.Creator, c.Description, c.Externalid, c.Editdate, c.Editor, c.Filter, c.Globalid, c.Habitat, c.Hectares, c.Jurisdiction, c.Larvinspectinterval, c.Lastinspectactiontaken, c.Lastinspectactivity, c.Lastinspectavglarvae, c.Lastinspectavgpupae, c.Lastinspectbreeding, c.Lastinspectconditions, c.Lastinspectdate, c.Lastinspectfieldspecies, c.Lastinspectlstages, c.Lasttreatactivity, c.Lasttreatdate, c.Lasttreatproduct, c.Lasttreatqty, c.Lasttreatqtyunit, c.Locationnumber, c.Name, c.Nextactiondatescheduled, c.Objectid, c.Priority, c.Symbology, c.ShapeArea, c.ShapeLength, c.Usetype, c.Waterorigin, c.Zone, c.Zone2, c.GeometryX, c.GeometryY, c.Version, c.Created,
} }
} }

View file

@ -348,6 +348,15 @@ var HistoryProposedtreatmentareas = Table[
Generated: false, Generated: false,
AutoIncr: false, AutoIncr: false,
}, },
Created: column{
Name: "created",
DBType: "timestamp without time zone",
Default: "NULL",
Comment: "",
Nullable: true,
Generated: false,
AutoIncr: false,
},
}, },
Indexes: historyProposedtreatmentareaIndexes{ Indexes: historyProposedtreatmentareaIndexes{
HistoryProposedtreatmentareaPkey: index{ HistoryProposedtreatmentareaPkey: index{
@ -431,11 +440,12 @@ type historyProposedtreatmentareaColumns struct {
GeometryX column GeometryX column
GeometryY column GeometryY column
Version column Version column
Created column
} }
func (c historyProposedtreatmentareaColumns) AsSlice() []column { func (c historyProposedtreatmentareaColumns) AsSlice() []column {
return []column{ return []column{
c.OrganizationID, c.Acres, c.Comments, c.Completed, c.Completedby, c.Completeddate, c.Creationdate, c.Creator, c.Duedate, c.Exported, c.Editdate, c.Editor, c.Globalid, c.Hectares, c.Issprayroute, c.Lasttreatactivity, c.Lasttreatdate, c.Lasttreatproduct, c.Lasttreatqty, c.Lasttreatqtyunit, c.Method, c.Name, c.Objectid, c.Priority, c.Reviewed, c.Reviewedby, c.Revieweddate, c.ShapeArea, c.ShapeLength, c.Targetapprate, c.Targetproduct, c.Targetspecies, c.Zone, c.Zone2, c.GeometryX, c.GeometryY, c.Version, c.OrganizationID, c.Acres, c.Comments, c.Completed, c.Completedby, c.Completeddate, c.Creationdate, c.Creator, c.Duedate, c.Exported, c.Editdate, c.Editor, c.Globalid, c.Hectares, c.Issprayroute, c.Lasttreatactivity, c.Lasttreatdate, c.Lasttreatproduct, c.Lasttreatqty, c.Lasttreatqtyunit, c.Method, c.Name, c.Objectid, c.Priority, c.Reviewed, c.Reviewedby, c.Revieweddate, c.ShapeArea, c.ShapeLength, c.Targetapprate, c.Targetproduct, c.Targetspecies, c.Zone, c.Zone2, c.GeometryX, c.GeometryY, c.Version, c.Created,
} }
} }

View file

@ -537,6 +537,15 @@ var HistoryTreatments = Table[
Generated: false, Generated: false,
AutoIncr: false, AutoIncr: false,
}, },
Created: column{
Name: "created",
DBType: "timestamp without time zone",
Default: "NULL",
Comment: "",
Nullable: true,
Generated: false,
AutoIncr: false,
},
}, },
Indexes: historyTreatmentIndexes{ Indexes: historyTreatmentIndexes{
HistoryTreatmentPkey: index{ HistoryTreatmentPkey: index{
@ -641,11 +650,12 @@ type historyTreatmentColumns struct {
GeometryY column GeometryY column
TempSitecond column TempSitecond column
Version column Version column
Created column
} }
func (c historyTreatmentColumns) AsSlice() []column { func (c historyTreatmentColumns) AsSlice() []column {
return []column{ return []column{
c.OrganizationID, c.Activity, c.Areaunit, c.Avetemp, c.Barrierrouteid, c.Cbcount, c.Comments, c.Containercount, c.Creationdate, c.Creator, c.Enddatetime, c.Equiptype, c.Editdate, c.Editor, c.Fieldtech, c.Flowrate, c.Globalid, c.Habitat, c.InspID, c.Invloc, c.Linelocid, c.Locationname, c.Method, c.Objectid, c.Pointlocid, c.Polygonlocid, c.Product, c.Ptaid, c.Qty, c.Qtyunit, c.Raingauge, c.Recordstatus, c.Reviewed, c.Reviewedby, c.Revieweddate, c.Sdid, c.Sitecond, c.Srid, c.Startdatetime, c.Targetspecies, c.Tirecount, c.Treatacres, c.Treatarea, c.Treathectares, c.Treatmenthours, c.Treatmentlength, c.Treatmentlengthunits, c.Totalcostprodcut, c.Ulvrouteid, c.Warningoverride, c.Winddir, c.Windspeed, c.Zone, c.Zone2, c.GeometryX, c.GeometryY, c.TempSitecond, c.Version, c.OrganizationID, c.Activity, c.Areaunit, c.Avetemp, c.Barrierrouteid, c.Cbcount, c.Comments, c.Containercount, c.Creationdate, c.Creator, c.Enddatetime, c.Equiptype, c.Editdate, c.Editor, c.Fieldtech, c.Flowrate, c.Globalid, c.Habitat, c.InspID, c.Invloc, c.Linelocid, c.Locationname, c.Method, c.Objectid, c.Pointlocid, c.Polygonlocid, c.Product, c.Ptaid, c.Qty, c.Qtyunit, c.Raingauge, c.Recordstatus, c.Reviewed, c.Reviewedby, c.Revieweddate, c.Sdid, c.Sitecond, c.Srid, c.Startdatetime, c.Targetspecies, c.Tirecount, c.Treatacres, c.Treatarea, c.Treathectares, c.Treatmenthours, c.Treatmentlength, c.Treatmentlengthunits, c.Totalcostprodcut, c.Ulvrouteid, c.Warningoverride, c.Winddir, c.Windspeed, c.Zone, c.Zone2, c.GeometryX, c.GeometryY, c.TempSitecond, c.Version, c.Created,
} }
} }

View file

@ -24,39 +24,48 @@ var Notifications = Table[
Generated: false, Generated: false,
AutoIncr: false, AutoIncr: false,
}, },
UserID: column{ Created: column{
Name: "user_id", Name: "created",
DBType: "integer", DBType: "timestamp without time zone",
Default: "NULL", Default: "",
Comment: "", Comment: "",
Nullable: true, Nullable: false,
Generated: false,
AutoIncr: false,
},
Message: column{
Name: "message",
DBType: "text",
Default: "NULL",
Comment: "",
Nullable: true,
Generated: false, Generated: false,
AutoIncr: false, AutoIncr: false,
}, },
Link: column{ Link: column{
Name: "link", Name: "link",
DBType: "text", DBType: "text",
Default: "NULL", Default: "",
Comment: "", Comment: "",
Nullable: true, Nullable: false,
Generated: false,
AutoIncr: false,
},
Message: column{
Name: "message",
DBType: "text",
Default: "",
Comment: "",
Nullable: false,
Generated: false, Generated: false,
AutoIncr: false, AutoIncr: false,
}, },
Type: column{ Type: column{
Name: "type", Name: "type",
DBType: "public.notificationtype", DBType: "public.notificationtype",
Default: "NULL", Default: "",
Comment: "", Comment: "",
Nullable: true, Nullable: false,
Generated: false,
AutoIncr: false,
},
UserID: column{
Name: "user_id",
DBType: "integer",
Default: "",
Comment: "",
Nullable: false,
Generated: false, Generated: false,
AutoIncr: false, AutoIncr: false,
}, },
@ -102,15 +111,16 @@ var Notifications = Table[
type notificationColumns struct { type notificationColumns struct {
ID column ID column
UserID column Created column
Message column
Link column Link column
Message column
Type column Type column
UserID column
} }
func (c notificationColumns) AsSlice() []column { func (c notificationColumns) AsSlice() []column {
return []column{ return []column{
c.ID, c.UserID, c.Message, c.Link, c.Type, c.ID, c.Created, c.Link, c.Message, c.Type, c.UserID,
} }
} }

View file

@ -2453,6 +2453,7 @@ func (f *Factory) FromExistingHistoryPolygonlocation(m *models.HistoryPolygonloc
o.GeometryX = func() null.Val[float64] { return m.GeometryX } o.GeometryX = func() null.Val[float64] { return m.GeometryX }
o.GeometryY = func() null.Val[float64] { return m.GeometryY } o.GeometryY = func() null.Val[float64] { return m.GeometryY }
o.Version = func() int32 { return m.Version } o.Version = func() int32 { return m.Version }
o.Created = func() null.Val[time.Time] { return m.Created }
ctx := context.Background() ctx := context.Background()
if m.R.Organization != nil { if m.R.Organization != nil {
@ -2626,6 +2627,7 @@ func (f *Factory) FromExistingHistoryProposedtreatmentarea(m *models.HistoryProp
o.GeometryX = func() null.Val[float64] { return m.GeometryX } o.GeometryX = func() null.Val[float64] { return m.GeometryX }
o.GeometryY = func() null.Val[float64] { return m.GeometryY } o.GeometryY = func() null.Val[float64] { return m.GeometryY }
o.Version = func() int32 { return m.Version } o.Version = func() int32 { return m.Version }
o.Created = func() null.Val[time.Time] { return m.Created }
ctx := context.Background() ctx := context.Background()
if m.R.Organization != nil { if m.R.Organization != nil {
@ -3438,6 +3440,7 @@ func (f *Factory) FromExistingHistoryTreatment(m *models.HistoryTreatment) *Hist
o.GeometryY = func() null.Val[float64] { return m.GeometryY } o.GeometryY = func() null.Val[float64] { return m.GeometryY }
o.TempSitecond = func() null.Val[string] { return m.TempSitecond } o.TempSitecond = func() null.Val[string] { return m.TempSitecond }
o.Version = func() int32 { return m.Version } o.Version = func() int32 { return m.Version }
o.Created = func() null.Val[time.Time] { return m.Created }
ctx := context.Background() ctx := context.Background()
if m.R.Organization != nil { if m.R.Organization != nil {
@ -3611,10 +3614,11 @@ func (f *Factory) FromExistingNotification(m *models.Notification) *Notification
o := &NotificationTemplate{f: f, alreadyPersisted: true} o := &NotificationTemplate{f: f, alreadyPersisted: true}
o.ID = func() int32 { return m.ID } o.ID = func() int32 { return m.ID }
o.UserID = func() null.Val[int32] { return m.UserID } o.Created = func() time.Time { return m.Created }
o.Message = func() null.Val[string] { return m.Message } o.Link = func() string { return m.Link }
o.Link = func() null.Val[string] { return m.Link } o.Message = func() string { return m.Message }
o.Type = func() null.Val[enums.Notificationtype] { return m.Type } o.Type = func() enums.Notificationtype { return m.Type }
o.UserID = func() int32 { return m.UserID }
ctx := context.Background() ctx := context.Background()
if m.R.UserUser != nil { if m.R.UserUser != nil {

View file

@ -6,6 +6,7 @@ package factory
import ( import (
"context" "context"
"testing" "testing"
"time"
models "github.com/Gleipnir-Technology/nidus-sync/models" models "github.com/Gleipnir-Technology/nidus-sync/models"
"github.com/aarondl/opt/null" "github.com/aarondl/opt/null"
@ -82,6 +83,7 @@ type HistoryPolygonlocationTemplate struct {
GeometryX func() null.Val[float64] GeometryX func() null.Val[float64]
GeometryY func() null.Val[float64] GeometryY func() null.Val[float64]
Version func() int32 Version func() int32
Created func() null.Val[time.Time]
r historyPolygonlocationR r historyPolygonlocationR
f *Factory f *Factory
@ -304,6 +306,10 @@ func (o HistoryPolygonlocationTemplate) BuildSetter() *models.HistoryPolygonloca
val := o.Version() val := o.Version()
m.Version = omit.From(val) m.Version = omit.From(val)
} }
if o.Created != nil {
val := o.Created()
m.Created = omitnull.FromNull(val)
}
return m return m
} }
@ -464,6 +470,9 @@ func (o HistoryPolygonlocationTemplate) Build() *models.HistoryPolygonlocation {
if o.Version != nil { if o.Version != nil {
m.Version = o.Version() m.Version = o.Version()
} }
if o.Created != nil {
m.Created = o.Created()
}
o.setModelRels(m) o.setModelRels(m)
@ -661,6 +670,7 @@ func (m historyPolygonlocationMods) RandomizeAllColumns(f *faker.Faker) HistoryP
HistoryPolygonlocationMods.RandomGeometryX(f), HistoryPolygonlocationMods.RandomGeometryX(f),
HistoryPolygonlocationMods.RandomGeometryY(f), HistoryPolygonlocationMods.RandomGeometryY(f),
HistoryPolygonlocationMods.RandomVersion(f), HistoryPolygonlocationMods.RandomVersion(f),
HistoryPolygonlocationMods.RandomCreated(f),
} }
} }
@ -3036,6 +3046,59 @@ func (m historyPolygonlocationMods) RandomVersion(f *faker.Faker) HistoryPolygon
}) })
} }
// Set the model columns to this value
func (m historyPolygonlocationMods) Created(val null.Val[time.Time]) HistoryPolygonlocationMod {
return HistoryPolygonlocationModFunc(func(_ context.Context, o *HistoryPolygonlocationTemplate) {
o.Created = func() null.Val[time.Time] { return val }
})
}
// Set the Column from the function
func (m historyPolygonlocationMods) CreatedFunc(f func() null.Val[time.Time]) HistoryPolygonlocationMod {
return HistoryPolygonlocationModFunc(func(_ context.Context, o *HistoryPolygonlocationTemplate) {
o.Created = f
})
}
// Clear any values for the column
func (m historyPolygonlocationMods) UnsetCreated() HistoryPolygonlocationMod {
return HistoryPolygonlocationModFunc(func(_ context.Context, o *HistoryPolygonlocationTemplate) {
o.Created = 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 historyPolygonlocationMods) RandomCreated(f *faker.Faker) HistoryPolygonlocationMod {
return HistoryPolygonlocationModFunc(func(_ context.Context, o *HistoryPolygonlocationTemplate) {
o.Created = 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 historyPolygonlocationMods) RandomCreatedNotNull(f *faker.Faker) HistoryPolygonlocationMod {
return HistoryPolygonlocationModFunc(func(_ context.Context, o *HistoryPolygonlocationTemplate) {
o.Created = func() null.Val[time.Time] {
if f == nil {
f = &defaultFaker
}
val := random_time_Time(f)
return null.From(val)
}
})
}
func (m historyPolygonlocationMods) WithParentsCascading() HistoryPolygonlocationMod { func (m historyPolygonlocationMods) WithParentsCascading() HistoryPolygonlocationMod {
return HistoryPolygonlocationModFunc(func(ctx context.Context, o *HistoryPolygonlocationTemplate) { return HistoryPolygonlocationModFunc(func(ctx context.Context, o *HistoryPolygonlocationTemplate) {
if isDone, _ := historyPolygonlocationWithParentsCascadingCtx.Value(ctx); isDone { if isDone, _ := historyPolygonlocationWithParentsCascadingCtx.Value(ctx); isDone {

View file

@ -6,6 +6,7 @@ package factory
import ( import (
"context" "context"
"testing" "testing"
"time"
models "github.com/Gleipnir-Technology/nidus-sync/models" models "github.com/Gleipnir-Technology/nidus-sync/models"
"github.com/aarondl/opt/null" "github.com/aarondl/opt/null"
@ -73,6 +74,7 @@ type HistoryProposedtreatmentareaTemplate struct {
GeometryX func() null.Val[float64] GeometryX func() null.Val[float64]
GeometryY func() null.Val[float64] GeometryY func() null.Val[float64]
Version func() int32 Version func() int32
Created func() null.Val[time.Time]
r historyProposedtreatmentareaR r historyProposedtreatmentareaR
f *Factory f *Factory
@ -259,6 +261,10 @@ func (o HistoryProposedtreatmentareaTemplate) BuildSetter() *models.HistoryPropo
val := o.Version() val := o.Version()
m.Version = omit.From(val) m.Version = omit.From(val)
} }
if o.Created != nil {
val := o.Created()
m.Created = omitnull.FromNull(val)
}
return m return m
} }
@ -392,6 +398,9 @@ func (o HistoryProposedtreatmentareaTemplate) Build() *models.HistoryProposedtre
if o.Version != nil { if o.Version != nil {
m.Version = o.Version() m.Version = o.Version()
} }
if o.Created != nil {
m.Created = o.Created()
}
o.setModelRels(m) o.setModelRels(m)
@ -580,6 +589,7 @@ func (m historyProposedtreatmentareaMods) RandomizeAllColumns(f *faker.Faker) Hi
HistoryProposedtreatmentareaMods.RandomGeometryX(f), HistoryProposedtreatmentareaMods.RandomGeometryX(f),
HistoryProposedtreatmentareaMods.RandomGeometryY(f), HistoryProposedtreatmentareaMods.RandomGeometryY(f),
HistoryProposedtreatmentareaMods.RandomVersion(f), HistoryProposedtreatmentareaMods.RandomVersion(f),
HistoryProposedtreatmentareaMods.RandomCreated(f),
} }
} }
@ -2478,6 +2488,59 @@ func (m historyProposedtreatmentareaMods) RandomVersion(f *faker.Faker) HistoryP
}) })
} }
// Set the model columns to this value
func (m historyProposedtreatmentareaMods) Created(val null.Val[time.Time]) HistoryProposedtreatmentareaMod {
return HistoryProposedtreatmentareaModFunc(func(_ context.Context, o *HistoryProposedtreatmentareaTemplate) {
o.Created = func() null.Val[time.Time] { return val }
})
}
// Set the Column from the function
func (m historyProposedtreatmentareaMods) CreatedFunc(f func() null.Val[time.Time]) HistoryProposedtreatmentareaMod {
return HistoryProposedtreatmentareaModFunc(func(_ context.Context, o *HistoryProposedtreatmentareaTemplate) {
o.Created = f
})
}
// Clear any values for the column
func (m historyProposedtreatmentareaMods) UnsetCreated() HistoryProposedtreatmentareaMod {
return HistoryProposedtreatmentareaModFunc(func(_ context.Context, o *HistoryProposedtreatmentareaTemplate) {
o.Created = 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 historyProposedtreatmentareaMods) RandomCreated(f *faker.Faker) HistoryProposedtreatmentareaMod {
return HistoryProposedtreatmentareaModFunc(func(_ context.Context, o *HistoryProposedtreatmentareaTemplate) {
o.Created = 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 historyProposedtreatmentareaMods) RandomCreatedNotNull(f *faker.Faker) HistoryProposedtreatmentareaMod {
return HistoryProposedtreatmentareaModFunc(func(_ context.Context, o *HistoryProposedtreatmentareaTemplate) {
o.Created = func() null.Val[time.Time] {
if f == nil {
f = &defaultFaker
}
val := random_time_Time(f)
return null.From(val)
}
})
}
func (m historyProposedtreatmentareaMods) WithParentsCascading() HistoryProposedtreatmentareaMod { func (m historyProposedtreatmentareaMods) WithParentsCascading() HistoryProposedtreatmentareaMod {
return HistoryProposedtreatmentareaModFunc(func(ctx context.Context, o *HistoryProposedtreatmentareaTemplate) { return HistoryProposedtreatmentareaModFunc(func(ctx context.Context, o *HistoryProposedtreatmentareaTemplate) {
if isDone, _ := historyProposedtreatmentareaWithParentsCascadingCtx.Value(ctx); isDone { if isDone, _ := historyProposedtreatmentareaWithParentsCascadingCtx.Value(ctx); isDone {

View file

@ -6,6 +6,7 @@ package factory
import ( import (
"context" "context"
"testing" "testing"
"time"
models "github.com/Gleipnir-Technology/nidus-sync/models" models "github.com/Gleipnir-Technology/nidus-sync/models"
"github.com/aarondl/opt/null" "github.com/aarondl/opt/null"
@ -94,6 +95,7 @@ type HistoryTreatmentTemplate struct {
GeometryY func() null.Val[float64] GeometryY func() null.Val[float64]
TempSitecond func() null.Val[string] TempSitecond func() null.Val[string]
Version func() int32 Version func() int32
Created func() null.Val[time.Time]
r historyTreatmentR r historyTreatmentR
f *Factory f *Factory
@ -364,6 +366,10 @@ func (o HistoryTreatmentTemplate) BuildSetter() *models.HistoryTreatmentSetter {
val := o.Version() val := o.Version()
m.Version = omit.From(val) m.Version = omit.From(val)
} }
if o.Created != nil {
val := o.Created()
m.Created = omitnull.FromNull(val)
}
return m return m
} }
@ -560,6 +566,9 @@ func (o HistoryTreatmentTemplate) Build() *models.HistoryTreatment {
if o.Version != nil { if o.Version != nil {
m.Version = o.Version() m.Version = o.Version()
} }
if o.Created != nil {
m.Created = o.Created()
}
o.setModelRels(m) o.setModelRels(m)
@ -769,6 +778,7 @@ func (m historyTreatmentMods) RandomizeAllColumns(f *faker.Faker) HistoryTreatme
HistoryTreatmentMods.RandomGeometryY(f), HistoryTreatmentMods.RandomGeometryY(f),
HistoryTreatmentMods.RandomTempSitecond(f), HistoryTreatmentMods.RandomTempSitecond(f),
HistoryTreatmentMods.RandomVersion(f), HistoryTreatmentMods.RandomVersion(f),
HistoryTreatmentMods.RandomCreated(f),
} }
} }
@ -3780,6 +3790,59 @@ func (m historyTreatmentMods) RandomVersion(f *faker.Faker) HistoryTreatmentMod
}) })
} }
// Set the model columns to this value
func (m historyTreatmentMods) Created(val null.Val[time.Time]) HistoryTreatmentMod {
return HistoryTreatmentModFunc(func(_ context.Context, o *HistoryTreatmentTemplate) {
o.Created = func() null.Val[time.Time] { return val }
})
}
// Set the Column from the function
func (m historyTreatmentMods) CreatedFunc(f func() null.Val[time.Time]) HistoryTreatmentMod {
return HistoryTreatmentModFunc(func(_ context.Context, o *HistoryTreatmentTemplate) {
o.Created = f
})
}
// Clear any values for the column
func (m historyTreatmentMods) UnsetCreated() HistoryTreatmentMod {
return HistoryTreatmentModFunc(func(_ context.Context, o *HistoryTreatmentTemplate) {
o.Created = 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 historyTreatmentMods) RandomCreated(f *faker.Faker) HistoryTreatmentMod {
return HistoryTreatmentModFunc(func(_ context.Context, o *HistoryTreatmentTemplate) {
o.Created = 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 historyTreatmentMods) RandomCreatedNotNull(f *faker.Faker) HistoryTreatmentMod {
return HistoryTreatmentModFunc(func(_ context.Context, o *HistoryTreatmentTemplate) {
o.Created = func() null.Val[time.Time] {
if f == nil {
f = &defaultFaker
}
val := random_time_Time(f)
return null.From(val)
}
})
}
func (m historyTreatmentMods) WithParentsCascading() HistoryTreatmentMod { func (m historyTreatmentMods) WithParentsCascading() HistoryTreatmentMod {
return HistoryTreatmentModFunc(func(ctx context.Context, o *HistoryTreatmentTemplate) { return HistoryTreatmentModFunc(func(ctx context.Context, o *HistoryTreatmentTemplate) {
if isDone, _ := historyTreatmentWithParentsCascadingCtx.Value(ctx); isDone { if isDone, _ := historyTreatmentWithParentsCascadingCtx.Value(ctx); isDone {

View file

@ -6,12 +6,11 @@ package factory
import ( import (
"context" "context"
"testing" "testing"
"time"
enums "github.com/Gleipnir-Technology/nidus-sync/enums" enums "github.com/Gleipnir-Technology/nidus-sync/enums"
models "github.com/Gleipnir-Technology/nidus-sync/models" models "github.com/Gleipnir-Technology/nidus-sync/models"
"github.com/aarondl/opt/null"
"github.com/aarondl/opt/omit" "github.com/aarondl/opt/omit"
"github.com/aarondl/opt/omitnull"
"github.com/jaswdr/faker/v2" "github.com/jaswdr/faker/v2"
"github.com/stephenafamo/bob" "github.com/stephenafamo/bob"
) )
@ -38,10 +37,11 @@ func (mods NotificationModSlice) Apply(ctx context.Context, n *NotificationTempl
// all columns are optional and should be set by mods // all columns are optional and should be set by mods
type NotificationTemplate struct { type NotificationTemplate struct {
ID func() int32 ID func() int32
UserID func() null.Val[int32] Created func() time.Time
Message func() null.Val[string] Link func() string
Link func() null.Val[string] Message func() string
Type func() null.Val[enums.Notificationtype] Type func() enums.Notificationtype
UserID func() int32
r notificationR r notificationR
f *Factory f *Factory
@ -70,7 +70,7 @@ func (t NotificationTemplate) setModelRels(o *models.Notification) {
if t.r.UserUser != nil { if t.r.UserUser != nil {
rel := t.r.UserUser.o.Build() rel := t.r.UserUser.o.Build()
rel.R.UserNotifications = append(rel.R.UserNotifications, o) rel.R.UserNotifications = append(rel.R.UserNotifications, o)
o.UserID = null.From(rel.ID) // h2 o.UserID = rel.ID // h2
o.R.UserUser = rel o.R.UserUser = rel
} }
} }
@ -84,21 +84,25 @@ func (o NotificationTemplate) BuildSetter() *models.NotificationSetter {
val := o.ID() val := o.ID()
m.ID = omit.From(val) m.ID = omit.From(val)
} }
if o.UserID != nil { if o.Created != nil {
val := o.UserID() val := o.Created()
m.UserID = omitnull.FromNull(val) m.Created = omit.From(val)
}
if o.Message != nil {
val := o.Message()
m.Message = omitnull.FromNull(val)
} }
if o.Link != nil { if o.Link != nil {
val := o.Link() val := o.Link()
m.Link = omitnull.FromNull(val) m.Link = omit.From(val)
}
if o.Message != nil {
val := o.Message()
m.Message = omit.From(val)
} }
if o.Type != nil { if o.Type != nil {
val := o.Type() val := o.Type()
m.Type = omitnull.FromNull(val) m.Type = omit.From(val)
}
if o.UserID != nil {
val := o.UserID()
m.UserID = omit.From(val)
} }
return m return m
@ -125,18 +129,21 @@ func (o NotificationTemplate) Build() *models.Notification {
if o.ID != nil { if o.ID != nil {
m.ID = o.ID() m.ID = o.ID()
} }
if o.UserID != nil { if o.Created != nil {
m.UserID = o.UserID() m.Created = o.Created()
}
if o.Message != nil {
m.Message = o.Message()
} }
if o.Link != nil { if o.Link != nil {
m.Link = o.Link() m.Link = o.Link()
} }
if o.Message != nil {
m.Message = o.Message()
}
if o.Type != nil { if o.Type != nil {
m.Type = o.Type() m.Type = o.Type()
} }
if o.UserID != nil {
m.UserID = o.UserID()
}
o.setModelRels(m) o.setModelRels(m)
@ -157,6 +164,26 @@ func (o NotificationTemplate) BuildMany(number int) models.NotificationSlice {
} }
func ensureCreatableNotification(m *models.NotificationSetter) { func ensureCreatableNotification(m *models.NotificationSetter) {
if !(m.Created.IsValue()) {
val := random_time_Time(nil)
m.Created = omit.From(val)
}
if !(m.Link.IsValue()) {
val := random_string(nil)
m.Link = omit.From(val)
}
if !(m.Message.IsValue()) {
val := random_string(nil)
m.Message = omit.From(val)
}
if !(m.Type.IsValue()) {
val := random_enums_Notificationtype(nil)
m.Type = omit.From(val)
}
if !(m.UserID.IsValue()) {
val := random_int32(nil)
m.UserID = omit.From(val)
}
} }
// insertOptRels creates and inserts any optional the relationships on *models.Notification // insertOptRels creates and inserts any optional the relationships on *models.Notification
@ -165,25 +192,6 @@ func ensureCreatableNotification(m *models.NotificationSetter) {
func (o *NotificationTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.Notification) error { func (o *NotificationTemplate) insertOptRels(ctx context.Context, exec bob.Executor, m *models.Notification) error {
var err error var err error
isUserUserDone, _ := notificationRelUserUserCtx.Value(ctx)
if !isUserUserDone && o.r.UserUser != nil {
ctx = notificationRelUserUserCtx.WithValue(ctx, true)
if o.r.UserUser.o.alreadyPersisted {
m.R.UserUser = o.r.UserUser.o.Build()
} else {
var rel0 *models.User
rel0, err = o.r.UserUser.o.Create(ctx, exec)
if err != nil {
return err
}
err = m.AttachUserUser(ctx, exec, rel0)
if err != nil {
return err
}
}
}
return err return err
} }
@ -194,11 +202,30 @@ func (o *NotificationTemplate) Create(ctx context.Context, exec bob.Executor) (*
opt := o.BuildSetter() opt := o.BuildSetter()
ensureCreatableNotification(opt) ensureCreatableNotification(opt)
if o.r.UserUser == nil {
NotificationMods.WithNewUserUser().Apply(ctx, o)
}
var rel0 *models.User
if o.r.UserUser.o.alreadyPersisted {
rel0 = o.r.UserUser.o.Build()
} else {
rel0, err = o.r.UserUser.o.Create(ctx, exec)
if err != nil {
return nil, err
}
}
opt.UserID = omit.From(rel0.ID)
m, err := models.Notifications.Insert(opt).One(ctx, exec) m, err := models.Notifications.Insert(opt).One(ctx, exec)
if err != nil { if err != nil {
return nil, err return nil, err
} }
m.R.UserUser = rel0
if err := o.insertOptRels(ctx, exec, m); err != nil { if err := o.insertOptRels(ctx, exec, m); err != nil {
return nil, err return nil, err
} }
@ -277,10 +304,11 @@ type notificationMods struct{}
func (m notificationMods) RandomizeAllColumns(f *faker.Faker) NotificationMod { func (m notificationMods) RandomizeAllColumns(f *faker.Faker) NotificationMod {
return NotificationModSlice{ return NotificationModSlice{
NotificationMods.RandomID(f), NotificationMods.RandomID(f),
NotificationMods.RandomUserID(f), NotificationMods.RandomCreated(f),
NotificationMods.RandomMessage(f),
NotificationMods.RandomLink(f), NotificationMods.RandomLink(f),
NotificationMods.RandomMessage(f),
NotificationMods.RandomType(f), NotificationMods.RandomType(f),
NotificationMods.RandomUserID(f),
} }
} }
@ -316,120 +344,45 @@ func (m notificationMods) RandomID(f *faker.Faker) NotificationMod {
} }
// Set the model columns to this value // Set the model columns to this value
func (m notificationMods) UserID(val null.Val[int32]) NotificationMod { func (m notificationMods) Created(val time.Time) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = func() null.Val[int32] { return val } o.Created = func() time.Time { return val }
}) })
} }
// Set the Column from the function // Set the Column from the function
func (m notificationMods) UserIDFunc(f func() null.Val[int32]) NotificationMod { func (m notificationMods) CreatedFunc(f func() time.Time) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = f o.Created = f
}) })
} }
// Clear any values for the column // Clear any values for the column
func (m notificationMods) UnsetUserID() NotificationMod { func (m notificationMods) UnsetCreated() NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = nil o.Created = nil
}) })
} }
// Generates a random value for the column using the given faker // Generates a random value for the column using the given faker
// if faker is nil, a default faker is used // if faker is nil, a default faker is used
// The generated value is sometimes null func (m notificationMods) RandomCreated(f *faker.Faker) NotificationMod {
func (m notificationMods) RandomUserID(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = func() null.Val[int32] { o.Created = func() time.Time {
if f == nil { return random_time_Time(f)
f = &defaultFaker
}
val := random_int32(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 notificationMods) RandomUserIDNotNull(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = func() null.Val[int32] {
if f == nil {
f = &defaultFaker
}
val := random_int32(f)
return null.From(val)
} }
}) })
} }
// Set the model columns to this value // Set the model columns to this value
func (m notificationMods) Message(val null.Val[string]) NotificationMod { func (m notificationMods) Link(val string) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = func() null.Val[string] { return val } o.Link = func() string { return val }
}) })
} }
// Set the Column from the function // Set the Column from the function
func (m notificationMods) MessageFunc(f func() null.Val[string]) NotificationMod { func (m notificationMods) LinkFunc(f func() string) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = f
})
}
// Clear any values for the column
func (m notificationMods) UnsetMessage() NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = 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 notificationMods) RandomMessage(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = 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 notificationMods) RandomMessageNotNull(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = 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 notificationMods) Link(val null.Val[string]) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Link = func() null.Val[string] { return val }
})
}
// Set the Column from the function
func (m notificationMods) LinkFunc(f func() null.Val[string]) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Link = f o.Link = f
}) })
@ -444,45 +397,54 @@ func (m notificationMods) UnsetLink() NotificationMod {
// Generates a random value for the column using the given faker // Generates a random value for the column using the given faker
// if faker is nil, a default faker is used // if faker is nil, a default faker is used
// The generated value is sometimes null
func (m notificationMods) RandomLink(f *faker.Faker) NotificationMod { func (m notificationMods) RandomLink(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Link = func() null.Val[string] { o.Link = func() string {
if f == nil { return random_string(f)
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 notificationMods) RandomLinkNotNull(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Link = func() null.Val[string] {
if f == nil {
f = &defaultFaker
}
val := random_string(f)
return null.From(val)
} }
}) })
} }
// Set the model columns to this value // Set the model columns to this value
func (m notificationMods) Type(val null.Val[enums.Notificationtype]) NotificationMod { func (m notificationMods) Message(val string) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Type = func() null.Val[enums.Notificationtype] { return val } o.Message = func() string { return val }
}) })
} }
// Set the Column from the function // Set the Column from the function
func (m notificationMods) TypeFunc(f func() null.Val[enums.Notificationtype]) NotificationMod { func (m notificationMods) MessageFunc(f func() string) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = f
})
}
// Clear any values for the column
func (m notificationMods) UnsetMessage() NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = nil
})
}
// Generates a random value for the column using the given faker
// if faker is nil, a default faker is used
func (m notificationMods) RandomMessage(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Message = func() string {
return random_string(f)
}
})
}
// Set the model columns to this value
func (m notificationMods) Type(val enums.Notificationtype) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Type = func() enums.Notificationtype { return val }
})
}
// Set the Column from the function
func (m notificationMods) TypeFunc(f func() enums.Notificationtype) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Type = f o.Type = f
}) })
@ -497,32 +459,41 @@ func (m notificationMods) UnsetType() NotificationMod {
// Generates a random value for the column using the given faker // Generates a random value for the column using the given faker
// if faker is nil, a default faker is used // if faker is nil, a default faker is used
// The generated value is sometimes null
func (m notificationMods) RandomType(f *faker.Faker) NotificationMod { func (m notificationMods) RandomType(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Type = func() null.Val[enums.Notificationtype] { o.Type = func() enums.Notificationtype {
if f == nil { return random_enums_Notificationtype(f)
f = &defaultFaker }
})
} }
val := random_enums_Notificationtype(f) // Set the model columns to this value
return null.From(val) func (m notificationMods) UserID(val int32) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = func() int32 { return val }
})
} }
// Set the Column from the function
func (m notificationMods) UserIDFunc(f func() int32) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = f
})
}
// Clear any values for the column
func (m notificationMods) UnsetUserID() NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.UserID = nil
}) })
} }
// Generates a random value for the column using the given faker // Generates a random value for the column using the given faker
// if faker is nil, a default faker is used // if faker is nil, a default faker is used
// The generated value is never null func (m notificationMods) RandomUserID(f *faker.Faker) NotificationMod {
func (m notificationMods) RandomTypeNotNull(f *faker.Faker) NotificationMod {
return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) { return NotificationModFunc(func(_ context.Context, o *NotificationTemplate) {
o.Type = func() null.Val[enums.Notificationtype] { o.UserID = func() int32 {
if f == nil { return random_int32(f)
f = &defaultFaker
}
val := random_enums_Notificationtype(f)
return null.From(val)
} }
}) })
} }

View file

@ -90,7 +90,7 @@ func (t UserTemplate) setModelRels(o *models.User) {
for _, r := range t.r.UserNotifications { for _, r := range t.r.UserNotifications {
related := r.o.BuildMany(r.number) related := r.o.BuildMany(r.number)
for _, rel := range related { for _, rel := range related {
rel.UserID = null.From(o.ID) // h2 rel.UserID = o.ID // h2
rel.R.UserUser = o rel.R.UserUser = o
} }
rel = append(rel, related...) rel = append(rel, related...)

33
html.go
View file

@ -14,6 +14,7 @@ import (
"strings" "strings"
"time" "time"
enums "github.com/Gleipnir-Technology/nidus-sync/enums"
"github.com/Gleipnir-Technology/nidus-sync/models" "github.com/Gleipnir-Technology/nidus-sync/models"
"github.com/aarondl/opt/null" "github.com/aarondl/opt/null"
//"github.com/riverqueue/river/rivershared/util/slogutil" //"github.com/riverqueue/river/rivershared/util/slogutil"
@ -169,7 +170,7 @@ func htmlDashboard(ctx context.Context, w http.ResponseWriter, user *models.User
Status: "Completed", Status: "Completed",
}) })
} }
notifications, err := notificationsForUser(user) notifications, err := notificationsForUser(ctx, user)
if err != nil { if err != nil {
respondError(w, "Failed to get notifications", err, http.StatusInternalServerError) respondError(w, "Failed to get notifications", err, http.StatusInternalServerError)
return return
@ -427,15 +428,31 @@ type Notification struct {
Type string Type string
} }
func notificationsForUser(u *models.User) ([]Notification, error) { func notificationsForUser(ctx context.Context, u *models.User) ([]Notification, error) {
return []Notification{Notification{ results := make([]Notification, 0)
Link: "/foo/bar", notifications, err := u.UserNotifications().All(ctx, PGInstance.BobDB)
Message: "hey, your oauth is broken.", if err != nil {
Time: time.Now(), return results, fmt.Errorf("Failed to get notifications: %v", err)
Type: "alert", }
}}, nil for _, n := range notifications {
results = append(results, Notification{
Link: n.Link,
Message: n.Message,
Time: n.Created,
Type: notificationTypeName(n.Type),
})
}
return results, nil
} }
func notificationTypeName(t enums.Notificationtype) string {
switch t {
case enums.NotificationtypeOauthTokenInvalidated:
return "alert"
default:
return "unknown-type"
}
}
func renderOrError(w http.ResponseWriter, template BuiltTemplate, context interface{}) { func renderOrError(w http.ResponseWriter, template BuiltTemplate, context interface{}) {
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
err := template.ExecuteTemplate(buf, context) err := template.ExecuteTemplate(buf, context)

View file

@ -4,10 +4,11 @@ CREATE TYPE NotificationType AS ENUM (
CREATE TABLE notification ( CREATE TABLE notification (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES user_(id), created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
message TEXT, link TEXT NOT NULL,
link TEXT, message TEXT NOT NULL,
type NotificationType); type NotificationType NOT NULL,
user_id INTEGER REFERENCES user_(id) NOT NULL);

View file

@ -7,6 +7,7 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"time"
"github.com/aarondl/opt/null" "github.com/aarondl/opt/null"
"github.com/aarondl/opt/omit" "github.com/aarondl/opt/omit"
@ -71,6 +72,7 @@ type HistoryPolygonlocation struct {
GeometryX null.Val[float64] `db:"geometry_x" ` GeometryX null.Val[float64] `db:"geometry_x" `
GeometryY null.Val[float64] `db:"geometry_y" ` GeometryY null.Val[float64] `db:"geometry_y" `
Version int32 `db:"version,pk" ` Version int32 `db:"version,pk" `
Created null.Val[time.Time] `db:"created" `
R historyPolygonlocationR `db:"-" ` R historyPolygonlocationR `db:"-" `
} }
@ -93,7 +95,7 @@ type historyPolygonlocationR struct {
func buildHistoryPolygonlocationColumns(alias string) historyPolygonlocationColumns { func buildHistoryPolygonlocationColumns(alias string) historyPolygonlocationColumns {
return historyPolygonlocationColumns{ return historyPolygonlocationColumns{
ColumnsExpr: expr.NewColumnsExpr( ColumnsExpr: expr.NewColumnsExpr(
"organization_id", "accessdesc", "acres", "active", "comments", "creationdate", "creator", "description", "externalid", "editdate", "editor", "filter", "globalid", "habitat", "hectares", "jurisdiction", "larvinspectinterval", "lastinspectactiontaken", "lastinspectactivity", "lastinspectavglarvae", "lastinspectavgpupae", "lastinspectbreeding", "lastinspectconditions", "lastinspectdate", "lastinspectfieldspecies", "lastinspectlstages", "lasttreatactivity", "lasttreatdate", "lasttreatproduct", "lasttreatqty", "lasttreatqtyunit", "locationnumber", "name", "nextactiondatescheduled", "objectid", "priority", "symbology", "shape__area", "shape__length", "usetype", "waterorigin", "zone", "zone2", "geometry_x", "geometry_y", "version", "organization_id", "accessdesc", "acres", "active", "comments", "creationdate", "creator", "description", "externalid", "editdate", "editor", "filter", "globalid", "habitat", "hectares", "jurisdiction", "larvinspectinterval", "lastinspectactiontaken", "lastinspectactivity", "lastinspectavglarvae", "lastinspectavgpupae", "lastinspectbreeding", "lastinspectconditions", "lastinspectdate", "lastinspectfieldspecies", "lastinspectlstages", "lasttreatactivity", "lasttreatdate", "lasttreatproduct", "lasttreatqty", "lasttreatqtyunit", "locationnumber", "name", "nextactiondatescheduled", "objectid", "priority", "symbology", "shape__area", "shape__length", "usetype", "waterorigin", "zone", "zone2", "geometry_x", "geometry_y", "version", "created",
).WithParent("history_polygonlocation"), ).WithParent("history_polygonlocation"),
tableAlias: alias, tableAlias: alias,
OrganizationID: psql.Quote(alias, "organization_id"), OrganizationID: psql.Quote(alias, "organization_id"),
@ -142,6 +144,7 @@ func buildHistoryPolygonlocationColumns(alias string) historyPolygonlocationColu
GeometryX: psql.Quote(alias, "geometry_x"), GeometryX: psql.Quote(alias, "geometry_x"),
GeometryY: psql.Quote(alias, "geometry_y"), GeometryY: psql.Quote(alias, "geometry_y"),
Version: psql.Quote(alias, "version"), Version: psql.Quote(alias, "version"),
Created: psql.Quote(alias, "created"),
} }
} }
@ -194,6 +197,7 @@ type historyPolygonlocationColumns struct {
GeometryX psql.Expression GeometryX psql.Expression
GeometryY psql.Expression GeometryY psql.Expression
Version psql.Expression Version psql.Expression
Created psql.Expression
} }
func (c historyPolygonlocationColumns) Alias() string { func (c historyPolygonlocationColumns) Alias() string {
@ -254,10 +258,11 @@ type HistoryPolygonlocationSetter struct {
GeometryX omitnull.Val[float64] `db:"geometry_x" ` GeometryX omitnull.Val[float64] `db:"geometry_x" `
GeometryY omitnull.Val[float64] `db:"geometry_y" ` GeometryY omitnull.Val[float64] `db:"geometry_y" `
Version omit.Val[int32] `db:"version,pk" ` Version omit.Val[int32] `db:"version,pk" `
Created omitnull.Val[time.Time] `db:"created" `
} }
func (s HistoryPolygonlocationSetter) SetColumns() []string { func (s HistoryPolygonlocationSetter) SetColumns() []string {
vals := make([]string, 0, 46) vals := make([]string, 0, 47)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
vals = append(vals, "organization_id") vals = append(vals, "organization_id")
} }
@ -396,6 +401,9 @@ func (s HistoryPolygonlocationSetter) SetColumns() []string {
if s.Version.IsValue() { if s.Version.IsValue() {
vals = append(vals, "version") vals = append(vals, "version")
} }
if !s.Created.IsUnset() {
vals = append(vals, "created")
}
return vals return vals
} }
@ -538,6 +546,9 @@ func (s HistoryPolygonlocationSetter) Overwrite(t *HistoryPolygonlocation) {
if s.Version.IsValue() { if s.Version.IsValue() {
t.Version = s.Version.MustGet() t.Version = s.Version.MustGet()
} }
if !s.Created.IsUnset() {
t.Created = s.Created.MustGetNull()
}
} }
func (s *HistoryPolygonlocationSetter) Apply(q *dialect.InsertQuery) { func (s *HistoryPolygonlocationSetter) Apply(q *dialect.InsertQuery) {
@ -546,7 +557,7 @@ func (s *HistoryPolygonlocationSetter) Apply(q *dialect.InsertQuery) {
}) })
q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) { q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) {
vals := make([]bob.Expression, 46) vals := make([]bob.Expression, 47)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
vals[0] = psql.Arg(s.OrganizationID.MustGet()) vals[0] = psql.Arg(s.OrganizationID.MustGet())
} else { } else {
@ -823,6 +834,12 @@ func (s *HistoryPolygonlocationSetter) Apply(q *dialect.InsertQuery) {
vals[45] = psql.Raw("DEFAULT") vals[45] = psql.Raw("DEFAULT")
} }
if !s.Created.IsUnset() {
vals[46] = psql.Arg(s.Created.MustGetNull())
} else {
vals[46] = psql.Raw("DEFAULT")
}
return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "")
})) }))
} }
@ -832,7 +849,7 @@ func (s HistoryPolygonlocationSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery]
} }
func (s HistoryPolygonlocationSetter) Expressions(prefix ...string) []bob.Expression { func (s HistoryPolygonlocationSetter) Expressions(prefix ...string) []bob.Expression {
exprs := make([]bob.Expression, 0, 46) exprs := make([]bob.Expression, 0, 47)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
@ -1156,6 +1173,13 @@ func (s HistoryPolygonlocationSetter) Expressions(prefix ...string) []bob.Expres
}}) }})
} }
if !s.Created.IsUnset() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "created")...),
psql.Arg(s.Created),
}})
}
return exprs return exprs
} }
@ -1511,6 +1535,7 @@ type historyPolygonlocationWhere[Q psql.Filterable] struct {
GeometryX psql.WhereNullMod[Q, float64] GeometryX psql.WhereNullMod[Q, float64]
GeometryY psql.WhereNullMod[Q, float64] GeometryY psql.WhereNullMod[Q, float64]
Version psql.WhereMod[Q, int32] Version psql.WhereMod[Q, int32]
Created psql.WhereNullMod[Q, time.Time]
} }
func (historyPolygonlocationWhere[Q]) AliasedAs(alias string) historyPolygonlocationWhere[Q] { func (historyPolygonlocationWhere[Q]) AliasedAs(alias string) historyPolygonlocationWhere[Q] {
@ -1565,6 +1590,7 @@ func buildHistoryPolygonlocationWhere[Q psql.Filterable](cols historyPolygonloca
GeometryX: psql.WhereNull[Q, float64](cols.GeometryX), GeometryX: psql.WhereNull[Q, float64](cols.GeometryX),
GeometryY: psql.WhereNull[Q, float64](cols.GeometryY), GeometryY: psql.WhereNull[Q, float64](cols.GeometryY),
Version: psql.Where[Q, int32](cols.Version), Version: psql.Where[Q, int32](cols.Version),
Created: psql.WhereNull[Q, time.Time](cols.Created),
} }
} }

View file

@ -7,6 +7,7 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"time"
"github.com/aarondl/opt/null" "github.com/aarondl/opt/null"
"github.com/aarondl/opt/omit" "github.com/aarondl/opt/omit"
@ -62,6 +63,7 @@ type HistoryProposedtreatmentarea struct {
GeometryX null.Val[float64] `db:"geometry_x" ` GeometryX null.Val[float64] `db:"geometry_x" `
GeometryY null.Val[float64] `db:"geometry_y" ` GeometryY null.Val[float64] `db:"geometry_y" `
Version int32 `db:"version,pk" ` Version int32 `db:"version,pk" `
Created null.Val[time.Time] `db:"created" `
R historyProposedtreatmentareaR `db:"-" ` R historyProposedtreatmentareaR `db:"-" `
} }
@ -84,7 +86,7 @@ type historyProposedtreatmentareaR struct {
func buildHistoryProposedtreatmentareaColumns(alias string) historyProposedtreatmentareaColumns { func buildHistoryProposedtreatmentareaColumns(alias string) historyProposedtreatmentareaColumns {
return historyProposedtreatmentareaColumns{ return historyProposedtreatmentareaColumns{
ColumnsExpr: expr.NewColumnsExpr( ColumnsExpr: expr.NewColumnsExpr(
"organization_id", "acres", "comments", "completed", "completedby", "completeddate", "creationdate", "creator", "duedate", "exported", "editdate", "editor", "globalid", "hectares", "issprayroute", "lasttreatactivity", "lasttreatdate", "lasttreatproduct", "lasttreatqty", "lasttreatqtyunit", "method", "name", "objectid", "priority", "reviewed", "reviewedby", "revieweddate", "shape__area", "shape__length", "targetapprate", "targetproduct", "targetspecies", "zone", "zone2", "geometry_x", "geometry_y", "version", "organization_id", "acres", "comments", "completed", "completedby", "completeddate", "creationdate", "creator", "duedate", "exported", "editdate", "editor", "globalid", "hectares", "issprayroute", "lasttreatactivity", "lasttreatdate", "lasttreatproduct", "lasttreatqty", "lasttreatqtyunit", "method", "name", "objectid", "priority", "reviewed", "reviewedby", "revieweddate", "shape__area", "shape__length", "targetapprate", "targetproduct", "targetspecies", "zone", "zone2", "geometry_x", "geometry_y", "version", "created",
).WithParent("history_proposedtreatmentarea"), ).WithParent("history_proposedtreatmentarea"),
tableAlias: alias, tableAlias: alias,
OrganizationID: psql.Quote(alias, "organization_id"), OrganizationID: psql.Quote(alias, "organization_id"),
@ -124,6 +126,7 @@ func buildHistoryProposedtreatmentareaColumns(alias string) historyProposedtreat
GeometryX: psql.Quote(alias, "geometry_x"), GeometryX: psql.Quote(alias, "geometry_x"),
GeometryY: psql.Quote(alias, "geometry_y"), GeometryY: psql.Quote(alias, "geometry_y"),
Version: psql.Quote(alias, "version"), Version: psql.Quote(alias, "version"),
Created: psql.Quote(alias, "created"),
} }
} }
@ -167,6 +170,7 @@ type historyProposedtreatmentareaColumns struct {
GeometryX psql.Expression GeometryX psql.Expression
GeometryY psql.Expression GeometryY psql.Expression
Version psql.Expression Version psql.Expression
Created psql.Expression
} }
func (c historyProposedtreatmentareaColumns) Alias() string { func (c historyProposedtreatmentareaColumns) Alias() string {
@ -218,10 +222,11 @@ type HistoryProposedtreatmentareaSetter struct {
GeometryX omitnull.Val[float64] `db:"geometry_x" ` GeometryX omitnull.Val[float64] `db:"geometry_x" `
GeometryY omitnull.Val[float64] `db:"geometry_y" ` GeometryY omitnull.Val[float64] `db:"geometry_y" `
Version omit.Val[int32] `db:"version,pk" ` Version omit.Val[int32] `db:"version,pk" `
Created omitnull.Val[time.Time] `db:"created" `
} }
func (s HistoryProposedtreatmentareaSetter) SetColumns() []string { func (s HistoryProposedtreatmentareaSetter) SetColumns() []string {
vals := make([]string, 0, 37) vals := make([]string, 0, 38)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
vals = append(vals, "organization_id") vals = append(vals, "organization_id")
} }
@ -333,6 +338,9 @@ func (s HistoryProposedtreatmentareaSetter) SetColumns() []string {
if s.Version.IsValue() { if s.Version.IsValue() {
vals = append(vals, "version") vals = append(vals, "version")
} }
if !s.Created.IsUnset() {
vals = append(vals, "created")
}
return vals return vals
} }
@ -448,6 +456,9 @@ func (s HistoryProposedtreatmentareaSetter) Overwrite(t *HistoryProposedtreatmen
if s.Version.IsValue() { if s.Version.IsValue() {
t.Version = s.Version.MustGet() t.Version = s.Version.MustGet()
} }
if !s.Created.IsUnset() {
t.Created = s.Created.MustGetNull()
}
} }
func (s *HistoryProposedtreatmentareaSetter) Apply(q *dialect.InsertQuery) { func (s *HistoryProposedtreatmentareaSetter) Apply(q *dialect.InsertQuery) {
@ -456,7 +467,7 @@ func (s *HistoryProposedtreatmentareaSetter) Apply(q *dialect.InsertQuery) {
}) })
q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) { q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) {
vals := make([]bob.Expression, 37) vals := make([]bob.Expression, 38)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
vals[0] = psql.Arg(s.OrganizationID.MustGet()) vals[0] = psql.Arg(s.OrganizationID.MustGet())
} else { } else {
@ -679,6 +690,12 @@ func (s *HistoryProposedtreatmentareaSetter) Apply(q *dialect.InsertQuery) {
vals[36] = psql.Raw("DEFAULT") vals[36] = psql.Raw("DEFAULT")
} }
if !s.Created.IsUnset() {
vals[37] = psql.Arg(s.Created.MustGetNull())
} else {
vals[37] = psql.Raw("DEFAULT")
}
return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "")
})) }))
} }
@ -688,7 +705,7 @@ func (s HistoryProposedtreatmentareaSetter) UpdateMod() bob.Mod[*dialect.UpdateQ
} }
func (s HistoryProposedtreatmentareaSetter) Expressions(prefix ...string) []bob.Expression { func (s HistoryProposedtreatmentareaSetter) Expressions(prefix ...string) []bob.Expression {
exprs := make([]bob.Expression, 0, 37) exprs := make([]bob.Expression, 0, 38)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
@ -949,6 +966,13 @@ func (s HistoryProposedtreatmentareaSetter) Expressions(prefix ...string) []bob.
}}) }})
} }
if !s.Created.IsUnset() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "created")...),
psql.Arg(s.Created),
}})
}
return exprs return exprs
} }
@ -1295,6 +1319,7 @@ type historyProposedtreatmentareaWhere[Q psql.Filterable] struct {
GeometryX psql.WhereNullMod[Q, float64] GeometryX psql.WhereNullMod[Q, float64]
GeometryY psql.WhereNullMod[Q, float64] GeometryY psql.WhereNullMod[Q, float64]
Version psql.WhereMod[Q, int32] Version psql.WhereMod[Q, int32]
Created psql.WhereNullMod[Q, time.Time]
} }
func (historyProposedtreatmentareaWhere[Q]) AliasedAs(alias string) historyProposedtreatmentareaWhere[Q] { func (historyProposedtreatmentareaWhere[Q]) AliasedAs(alias string) historyProposedtreatmentareaWhere[Q] {
@ -1340,6 +1365,7 @@ func buildHistoryProposedtreatmentareaWhere[Q psql.Filterable](cols historyPropo
GeometryX: psql.WhereNull[Q, float64](cols.GeometryX), GeometryX: psql.WhereNull[Q, float64](cols.GeometryX),
GeometryY: psql.WhereNull[Q, float64](cols.GeometryY), GeometryY: psql.WhereNull[Q, float64](cols.GeometryY),
Version: psql.Where[Q, int32](cols.Version), Version: psql.Where[Q, int32](cols.Version),
Created: psql.WhereNull[Q, time.Time](cols.Created),
} }
} }

View file

@ -7,6 +7,7 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"time"
"github.com/aarondl/opt/null" "github.com/aarondl/opt/null"
"github.com/aarondl/opt/omit" "github.com/aarondl/opt/omit"
@ -83,6 +84,7 @@ type HistoryTreatment struct {
GeometryY null.Val[float64] `db:"geometry_y" ` GeometryY null.Val[float64] `db:"geometry_y" `
TempSitecond null.Val[string] `db:"temp_sitecond" ` TempSitecond null.Val[string] `db:"temp_sitecond" `
Version int32 `db:"version,pk" ` Version int32 `db:"version,pk" `
Created null.Val[time.Time] `db:"created" `
R historyTreatmentR `db:"-" ` R historyTreatmentR `db:"-" `
} }
@ -105,7 +107,7 @@ type historyTreatmentR struct {
func buildHistoryTreatmentColumns(alias string) historyTreatmentColumns { func buildHistoryTreatmentColumns(alias string) historyTreatmentColumns {
return historyTreatmentColumns{ return historyTreatmentColumns{
ColumnsExpr: expr.NewColumnsExpr( ColumnsExpr: expr.NewColumnsExpr(
"organization_id", "activity", "areaunit", "avetemp", "barrierrouteid", "cbcount", "comments", "containercount", "creationdate", "creator", "enddatetime", "equiptype", "editdate", "editor", "fieldtech", "flowrate", "globalid", "habitat", "insp_id", "invloc", "linelocid", "locationname", "method", "objectid", "pointlocid", "polygonlocid", "product", "ptaid", "qty", "qtyunit", "raingauge", "recordstatus", "reviewed", "reviewedby", "revieweddate", "sdid", "sitecond", "srid", "startdatetime", "targetspecies", "tirecount", "treatacres", "treatarea", "treathectares", "treatmenthours", "treatmentlength", "treatmentlengthunits", "totalcostprodcut", "ulvrouteid", "warningoverride", "winddir", "windspeed", "zone", "zone2", "geometry_x", "geometry_y", "temp_sitecond", "version", "organization_id", "activity", "areaunit", "avetemp", "barrierrouteid", "cbcount", "comments", "containercount", "creationdate", "creator", "enddatetime", "equiptype", "editdate", "editor", "fieldtech", "flowrate", "globalid", "habitat", "insp_id", "invloc", "linelocid", "locationname", "method", "objectid", "pointlocid", "polygonlocid", "product", "ptaid", "qty", "qtyunit", "raingauge", "recordstatus", "reviewed", "reviewedby", "revieweddate", "sdid", "sitecond", "srid", "startdatetime", "targetspecies", "tirecount", "treatacres", "treatarea", "treathectares", "treatmenthours", "treatmentlength", "treatmentlengthunits", "totalcostprodcut", "ulvrouteid", "warningoverride", "winddir", "windspeed", "zone", "zone2", "geometry_x", "geometry_y", "temp_sitecond", "version", "created",
).WithParent("history_treatment"), ).WithParent("history_treatment"),
tableAlias: alias, tableAlias: alias,
OrganizationID: psql.Quote(alias, "organization_id"), OrganizationID: psql.Quote(alias, "organization_id"),
@ -166,6 +168,7 @@ func buildHistoryTreatmentColumns(alias string) historyTreatmentColumns {
GeometryY: psql.Quote(alias, "geometry_y"), GeometryY: psql.Quote(alias, "geometry_y"),
TempSitecond: psql.Quote(alias, "temp_sitecond"), TempSitecond: psql.Quote(alias, "temp_sitecond"),
Version: psql.Quote(alias, "version"), Version: psql.Quote(alias, "version"),
Created: psql.Quote(alias, "created"),
} }
} }
@ -230,6 +233,7 @@ type historyTreatmentColumns struct {
GeometryY psql.Expression GeometryY psql.Expression
TempSitecond psql.Expression TempSitecond psql.Expression
Version psql.Expression Version psql.Expression
Created psql.Expression
} }
func (c historyTreatmentColumns) Alias() string { func (c historyTreatmentColumns) Alias() string {
@ -302,10 +306,11 @@ type HistoryTreatmentSetter struct {
GeometryY omitnull.Val[float64] `db:"geometry_y" ` GeometryY omitnull.Val[float64] `db:"geometry_y" `
TempSitecond omitnull.Val[string] `db:"temp_sitecond" ` TempSitecond omitnull.Val[string] `db:"temp_sitecond" `
Version omit.Val[int32] `db:"version,pk" ` Version omit.Val[int32] `db:"version,pk" `
Created omitnull.Val[time.Time] `db:"created" `
} }
func (s HistoryTreatmentSetter) SetColumns() []string { func (s HistoryTreatmentSetter) SetColumns() []string {
vals := make([]string, 0, 58) vals := make([]string, 0, 59)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
vals = append(vals, "organization_id") vals = append(vals, "organization_id")
} }
@ -480,6 +485,9 @@ func (s HistoryTreatmentSetter) SetColumns() []string {
if s.Version.IsValue() { if s.Version.IsValue() {
vals = append(vals, "version") vals = append(vals, "version")
} }
if !s.Created.IsUnset() {
vals = append(vals, "created")
}
return vals return vals
} }
@ -658,6 +666,9 @@ func (s HistoryTreatmentSetter) Overwrite(t *HistoryTreatment) {
if s.Version.IsValue() { if s.Version.IsValue() {
t.Version = s.Version.MustGet() t.Version = s.Version.MustGet()
} }
if !s.Created.IsUnset() {
t.Created = s.Created.MustGetNull()
}
} }
func (s *HistoryTreatmentSetter) Apply(q *dialect.InsertQuery) { func (s *HistoryTreatmentSetter) Apply(q *dialect.InsertQuery) {
@ -666,7 +677,7 @@ func (s *HistoryTreatmentSetter) Apply(q *dialect.InsertQuery) {
}) })
q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) { q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) {
vals := make([]bob.Expression, 58) vals := make([]bob.Expression, 59)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
vals[0] = psql.Arg(s.OrganizationID.MustGet()) vals[0] = psql.Arg(s.OrganizationID.MustGet())
} else { } else {
@ -1015,6 +1026,12 @@ func (s *HistoryTreatmentSetter) Apply(q *dialect.InsertQuery) {
vals[57] = psql.Raw("DEFAULT") vals[57] = psql.Raw("DEFAULT")
} }
if !s.Created.IsUnset() {
vals[58] = psql.Arg(s.Created.MustGetNull())
} else {
vals[58] = psql.Raw("DEFAULT")
}
return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "")
})) }))
} }
@ -1024,7 +1041,7 @@ func (s HistoryTreatmentSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] {
} }
func (s HistoryTreatmentSetter) Expressions(prefix ...string) []bob.Expression { func (s HistoryTreatmentSetter) Expressions(prefix ...string) []bob.Expression {
exprs := make([]bob.Expression, 0, 58) exprs := make([]bob.Expression, 0, 59)
if s.OrganizationID.IsValue() { if s.OrganizationID.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
@ -1432,6 +1449,13 @@ func (s HistoryTreatmentSetter) Expressions(prefix ...string) []bob.Expression {
}}) }})
} }
if !s.Created.IsUnset() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "created")...),
psql.Arg(s.Created),
}})
}
return exprs return exprs
} }
@ -1799,6 +1823,7 @@ type historyTreatmentWhere[Q psql.Filterable] struct {
GeometryY psql.WhereNullMod[Q, float64] GeometryY psql.WhereNullMod[Q, float64]
TempSitecond psql.WhereNullMod[Q, string] TempSitecond psql.WhereNullMod[Q, string]
Version psql.WhereMod[Q, int32] Version psql.WhereMod[Q, int32]
Created psql.WhereNullMod[Q, time.Time]
} }
func (historyTreatmentWhere[Q]) AliasedAs(alias string) historyTreatmentWhere[Q] { func (historyTreatmentWhere[Q]) AliasedAs(alias string) historyTreatmentWhere[Q] {
@ -1865,6 +1890,7 @@ func buildHistoryTreatmentWhere[Q psql.Filterable](cols historyTreatmentColumns)
GeometryY: psql.WhereNull[Q, float64](cols.GeometryY), GeometryY: psql.WhereNull[Q, float64](cols.GeometryY),
TempSitecond: psql.WhereNull[Q, string](cols.TempSitecond), TempSitecond: psql.WhereNull[Q, string](cols.TempSitecond),
Version: psql.Where[Q, int32](cols.Version), Version: psql.Where[Q, int32](cols.Version),
Created: psql.WhereNull[Q, time.Time](cols.Created),
} }
} }

View file

@ -7,11 +7,10 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"time"
enums "github.com/Gleipnir-Technology/nidus-sync/enums" enums "github.com/Gleipnir-Technology/nidus-sync/enums"
"github.com/aarondl/opt/null"
"github.com/aarondl/opt/omit" "github.com/aarondl/opt/omit"
"github.com/aarondl/opt/omitnull"
"github.com/stephenafamo/bob" "github.com/stephenafamo/bob"
"github.com/stephenafamo/bob/dialect/psql" "github.com/stephenafamo/bob/dialect/psql"
"github.com/stephenafamo/bob/dialect/psql/dialect" "github.com/stephenafamo/bob/dialect/psql/dialect"
@ -27,10 +26,11 @@ import (
// Notification is an object representing the database table. // Notification is an object representing the database table.
type Notification struct { type Notification struct {
ID int32 `db:"id,pk" ` ID int32 `db:"id,pk" `
UserID null.Val[int32] `db:"user_id" ` Created time.Time `db:"created" `
Message null.Val[string] `db:"message" ` Link string `db:"link" `
Link null.Val[string] `db:"link" ` Message string `db:"message" `
Type null.Val[enums.Notificationtype] `db:"type" ` Type enums.Notificationtype `db:"type" `
UserID int32 `db:"user_id" `
R notificationR `db:"-" ` R notificationR `db:"-" `
} }
@ -53,14 +53,15 @@ type notificationR struct {
func buildNotificationColumns(alias string) notificationColumns { func buildNotificationColumns(alias string) notificationColumns {
return notificationColumns{ return notificationColumns{
ColumnsExpr: expr.NewColumnsExpr( ColumnsExpr: expr.NewColumnsExpr(
"id", "user_id", "message", "link", "type", "id", "created", "link", "message", "type", "user_id",
).WithParent("notification"), ).WithParent("notification"),
tableAlias: alias, tableAlias: alias,
ID: psql.Quote(alias, "id"), ID: psql.Quote(alias, "id"),
UserID: psql.Quote(alias, "user_id"), Created: psql.Quote(alias, "created"),
Message: psql.Quote(alias, "message"),
Link: psql.Quote(alias, "link"), Link: psql.Quote(alias, "link"),
Message: psql.Quote(alias, "message"),
Type: psql.Quote(alias, "type"), Type: psql.Quote(alias, "type"),
UserID: psql.Quote(alias, "user_id"),
} }
} }
@ -68,10 +69,11 @@ type notificationColumns struct {
expr.ColumnsExpr expr.ColumnsExpr
tableAlias string tableAlias string
ID psql.Expression ID psql.Expression
UserID psql.Expression Created psql.Expression
Message psql.Expression
Link psql.Expression Link psql.Expression
Message psql.Expression
Type psql.Expression Type psql.Expression
UserID psql.Expression
} }
func (c notificationColumns) Alias() string { func (c notificationColumns) Alias() string {
@ -87,29 +89,33 @@ func (notificationColumns) AliasedAs(alias string) notificationColumns {
// Generated columns are not included // Generated columns are not included
type NotificationSetter struct { type NotificationSetter struct {
ID omit.Val[int32] `db:"id,pk" ` ID omit.Val[int32] `db:"id,pk" `
UserID omitnull.Val[int32] `db:"user_id" ` Created omit.Val[time.Time] `db:"created" `
Message omitnull.Val[string] `db:"message" ` Link omit.Val[string] `db:"link" `
Link omitnull.Val[string] `db:"link" ` Message omit.Val[string] `db:"message" `
Type omitnull.Val[enums.Notificationtype] `db:"type" ` Type omit.Val[enums.Notificationtype] `db:"type" `
UserID omit.Val[int32] `db:"user_id" `
} }
func (s NotificationSetter) SetColumns() []string { func (s NotificationSetter) SetColumns() []string {
vals := make([]string, 0, 5) vals := make([]string, 0, 6)
if s.ID.IsValue() { if s.ID.IsValue() {
vals = append(vals, "id") vals = append(vals, "id")
} }
if !s.UserID.IsUnset() { if s.Created.IsValue() {
vals = append(vals, "user_id") vals = append(vals, "created")
} }
if !s.Message.IsUnset() { if s.Link.IsValue() {
vals = append(vals, "message")
}
if !s.Link.IsUnset() {
vals = append(vals, "link") vals = append(vals, "link")
} }
if !s.Type.IsUnset() { if s.Message.IsValue() {
vals = append(vals, "message")
}
if s.Type.IsValue() {
vals = append(vals, "type") vals = append(vals, "type")
} }
if s.UserID.IsValue() {
vals = append(vals, "user_id")
}
return vals return vals
} }
@ -117,17 +123,20 @@ func (s NotificationSetter) Overwrite(t *Notification) {
if s.ID.IsValue() { if s.ID.IsValue() {
t.ID = s.ID.MustGet() t.ID = s.ID.MustGet()
} }
if !s.UserID.IsUnset() { if s.Created.IsValue() {
t.UserID = s.UserID.MustGetNull() t.Created = s.Created.MustGet()
} }
if !s.Message.IsUnset() { if s.Link.IsValue() {
t.Message = s.Message.MustGetNull() t.Link = s.Link.MustGet()
} }
if !s.Link.IsUnset() { if s.Message.IsValue() {
t.Link = s.Link.MustGetNull() t.Message = s.Message.MustGet()
} }
if !s.Type.IsUnset() { if s.Type.IsValue() {
t.Type = s.Type.MustGetNull() t.Type = s.Type.MustGet()
}
if s.UserID.IsValue() {
t.UserID = s.UserID.MustGet()
} }
} }
@ -137,37 +146,43 @@ func (s *NotificationSetter) Apply(q *dialect.InsertQuery) {
}) })
q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) { q.AppendValues(bob.ExpressionFunc(func(ctx context.Context, w io.Writer, d bob.Dialect, start int) ([]any, error) {
vals := make([]bob.Expression, 5) vals := make([]bob.Expression, 6)
if s.ID.IsValue() { if s.ID.IsValue() {
vals[0] = psql.Arg(s.ID.MustGet()) vals[0] = psql.Arg(s.ID.MustGet())
} else { } else {
vals[0] = psql.Raw("DEFAULT") vals[0] = psql.Raw("DEFAULT")
} }
if !s.UserID.IsUnset() { if s.Created.IsValue() {
vals[1] = psql.Arg(s.UserID.MustGetNull()) vals[1] = psql.Arg(s.Created.MustGet())
} else { } else {
vals[1] = psql.Raw("DEFAULT") vals[1] = psql.Raw("DEFAULT")
} }
if !s.Message.IsUnset() { if s.Link.IsValue() {
vals[2] = psql.Arg(s.Message.MustGetNull()) vals[2] = psql.Arg(s.Link.MustGet())
} else { } else {
vals[2] = psql.Raw("DEFAULT") vals[2] = psql.Raw("DEFAULT")
} }
if !s.Link.IsUnset() { if s.Message.IsValue() {
vals[3] = psql.Arg(s.Link.MustGetNull()) vals[3] = psql.Arg(s.Message.MustGet())
} else { } else {
vals[3] = psql.Raw("DEFAULT") vals[3] = psql.Raw("DEFAULT")
} }
if !s.Type.IsUnset() { if s.Type.IsValue() {
vals[4] = psql.Arg(s.Type.MustGetNull()) vals[4] = psql.Arg(s.Type.MustGet())
} else { } else {
vals[4] = psql.Raw("DEFAULT") vals[4] = psql.Raw("DEFAULT")
} }
if s.UserID.IsValue() {
vals[5] = psql.Arg(s.UserID.MustGet())
} else {
vals[5] = psql.Raw("DEFAULT")
}
return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "") return bob.ExpressSlice(ctx, w, d, start, vals, "", ", ", "")
})) }))
} }
@ -177,7 +192,7 @@ func (s NotificationSetter) UpdateMod() bob.Mod[*dialect.UpdateQuery] {
} }
func (s NotificationSetter) Expressions(prefix ...string) []bob.Expression { func (s NotificationSetter) Expressions(prefix ...string) []bob.Expression {
exprs := make([]bob.Expression, 0, 5) exprs := make([]bob.Expression, 0, 6)
if s.ID.IsValue() { if s.ID.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
@ -186,34 +201,41 @@ func (s NotificationSetter) Expressions(prefix ...string) []bob.Expression {
}}) }})
} }
if !s.UserID.IsUnset() { if s.Created.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "user_id")...), psql.Quote(append(prefix, "created")...),
psql.Arg(s.UserID), psql.Arg(s.Created),
}}) }})
} }
if !s.Message.IsUnset() { if s.Link.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "message")...),
psql.Arg(s.Message),
}})
}
if !s.Link.IsUnset() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "link")...), psql.Quote(append(prefix, "link")...),
psql.Arg(s.Link), psql.Arg(s.Link),
}}) }})
} }
if !s.Type.IsUnset() { if s.Message.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "message")...),
psql.Arg(s.Message),
}})
}
if s.Type.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{ exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "type")...), psql.Quote(append(prefix, "type")...),
psql.Arg(s.Type), psql.Arg(s.Type),
}}) }})
} }
if s.UserID.IsValue() {
exprs = append(exprs, expr.Join{Sep: " = ", Exprs: []bob.Expression{
psql.Quote(append(prefix, "user_id")...),
psql.Arg(s.UserID),
}})
}
return exprs return exprs
} }
@ -448,7 +470,7 @@ func (o *Notification) UserUser(mods ...bob.Mod[*dialect.SelectQuery]) UsersQuer
} }
func (os NotificationSlice) UserUser(mods ...bob.Mod[*dialect.SelectQuery]) UsersQuery { func (os NotificationSlice) UserUser(mods ...bob.Mod[*dialect.SelectQuery]) UsersQuery {
pkUserID := make(pgtypes.Array[null.Val[int32]], 0, len(os)) pkUserID := make(pgtypes.Array[int32], 0, len(os))
for _, o := range os { for _, o := range os {
if o == nil { if o == nil {
continue continue
@ -466,7 +488,7 @@ func (os NotificationSlice) UserUser(mods ...bob.Mod[*dialect.SelectQuery]) User
func attachNotificationUserUser0(ctx context.Context, exec bob.Executor, count int, notification0 *Notification, user1 *User) (*Notification, error) { func attachNotificationUserUser0(ctx context.Context, exec bob.Executor, count int, notification0 *Notification, user1 *User) (*Notification, error) {
setter := &NotificationSetter{ setter := &NotificationSetter{
UserID: omitnull.From(user1.ID), UserID: omit.From(user1.ID),
} }
err := notification0.Update(ctx, exec, setter) err := notification0.Update(ctx, exec, setter)
@ -514,10 +536,11 @@ func (notification0 *Notification) AttachUserUser(ctx context.Context, exec bob.
type notificationWhere[Q psql.Filterable] struct { type notificationWhere[Q psql.Filterable] struct {
ID psql.WhereMod[Q, int32] ID psql.WhereMod[Q, int32]
UserID psql.WhereNullMod[Q, int32] Created psql.WhereMod[Q, time.Time]
Message psql.WhereNullMod[Q, string] Link psql.WhereMod[Q, string]
Link psql.WhereNullMod[Q, string] Message psql.WhereMod[Q, string]
Type psql.WhereNullMod[Q, enums.Notificationtype] Type psql.WhereMod[Q, enums.Notificationtype]
UserID psql.WhereMod[Q, int32]
} }
func (notificationWhere[Q]) AliasedAs(alias string) notificationWhere[Q] { func (notificationWhere[Q]) AliasedAs(alias string) notificationWhere[Q] {
@ -527,10 +550,11 @@ func (notificationWhere[Q]) AliasedAs(alias string) notificationWhere[Q] {
func buildNotificationWhere[Q psql.Filterable](cols notificationColumns) notificationWhere[Q] { func buildNotificationWhere[Q psql.Filterable](cols notificationColumns) notificationWhere[Q] {
return notificationWhere[Q]{ return notificationWhere[Q]{
ID: psql.Where[Q, int32](cols.ID), ID: psql.Where[Q, int32](cols.ID),
UserID: psql.WhereNull[Q, int32](cols.UserID), Created: psql.Where[Q, time.Time](cols.Created),
Message: psql.WhereNull[Q, string](cols.Message), Link: psql.Where[Q, string](cols.Link),
Link: psql.WhereNull[Q, string](cols.Link), Message: psql.Where[Q, string](cols.Message),
Type: psql.WhereNull[Q, enums.Notificationtype](cols.Type), Type: psql.Where[Q, enums.Notificationtype](cols.Type),
UserID: psql.Where[Q, int32](cols.UserID),
} }
} }
@ -635,11 +659,8 @@ func (os NotificationSlice) LoadUserUser(ctx context.Context, exec bob.Executor,
} }
for _, rel := range users { for _, rel := range users {
if !o.UserID.IsValue() {
continue
}
if !(o.UserID.IsValue() && o.UserID.MustGet() == rel.ID) { if !(o.UserID == rel.ID) {
continue continue
} }

View file

@ -678,7 +678,7 @@ func (os UserSlice) Organization(mods ...bob.Mod[*dialect.SelectQuery]) Organiza
func insertUserUserNotifications0(ctx context.Context, exec bob.Executor, notifications1 []*NotificationSetter, user0 *User) (NotificationSlice, error) { func insertUserUserNotifications0(ctx context.Context, exec bob.Executor, notifications1 []*NotificationSetter, user0 *User) (NotificationSlice, error) {
for i := range notifications1 { for i := range notifications1 {
notifications1[i].UserID = omitnull.From(user0.ID) notifications1[i].UserID = omit.From(user0.ID)
} }
ret, err := Notifications.Insert(bob.ToMods(notifications1...)).All(ctx, exec) ret, err := Notifications.Insert(bob.ToMods(notifications1...)).All(ctx, exec)
@ -691,7 +691,7 @@ func insertUserUserNotifications0(ctx context.Context, exec bob.Executor, notifi
func attachUserUserNotifications0(ctx context.Context, exec bob.Executor, count int, notifications1 NotificationSlice, user0 *User) (NotificationSlice, error) { func attachUserUserNotifications0(ctx context.Context, exec bob.Executor, count int, notifications1 NotificationSlice, user0 *User) (NotificationSlice, error) {
setter := &NotificationSetter{ setter := &NotificationSetter{
UserID: omitnull.From(user0.ID), UserID: omit.From(user0.ID),
} }
err := notifications1.UpdateAll(ctx, exec, *setter) err := notifications1.UpdateAll(ctx, exec, *setter)
@ -1056,10 +1056,7 @@ func (os UserSlice) LoadUserNotifications(ctx context.Context, exec bob.Executor
for _, rel := range notifications { for _, rel := range notifications {
if !rel.UserID.IsValue() { if !(o.ID == rel.UserID) {
continue
}
if !(rel.UserID.IsValue() && o.ID == rel.UserID.MustGet()) {
continue continue
} }