package models import ( "context" "database/sql" "errors" "fmt" "log" "screenmark/screenmark/.gen/haystack/haystack/model" . "screenmark/screenmark/.gen/haystack/haystack/table" . "github.com/go-jet/jet/v2/postgres" "github.com/google/uuid" ) type UserModel struct { dbPool *sql.DB } type ImageWithProperties struct { ID uuid.UUID Image model.Image Tags []struct { model.ImageTags Tag model.UserTags } Links []model.ImageLinks Text []model.ImageText Locations []model.Locations Events []struct { model.Events Location *model.Locations `alias:"Location.*"` } } func getUserIdFromImage(ctx context.Context, dbPool *sql.DB, imageId uuid.UUID) (uuid.UUID, error) { getUserIdStmt := UserImages.SELECT(UserImages.UserID).WHERE(UserImages.ImageID.EQ(UUID(imageId))) log.Println(getUserIdStmt.DebugSql()) userImages := []model.UserImages{} err := getUserIdStmt.QueryContext(ctx, dbPool, &userImages) if err != nil { return uuid.Nil, err } if len(userImages) != 1 { return uuid.Nil, errors.New("Expected exactly one choice.") } return userImages[0].UserID, nil } func (m UserModel) ListWithProperties(ctx context.Context, userId uuid.UUID) ([]ImageWithProperties, error) { listWithPropertiesStmt := SELECT( UserImages.ID.AS("ImageWithProperties.ID"), Image.ID, Image.ImageName, ImageTags.AllColumns, UserTags.AllColumns, ImageText.AllColumns, ImageLinks.AllColumns, ImageLocations.AllColumns, Locations.AllColumns, ImageEvents.AllColumns, Events.AllColumns, ). FROM( UserImages.INNER_JOIN(Image, Image.ID.EQ(UserImages.ImageID)). LEFT_JOIN(ImageTags, ImageTags.ImageID.EQ(Image.ID)). LEFT_JOIN(UserTags, UserTags.ID.EQ(ImageTags.TagID)). LEFT_JOIN(ImageText, ImageText.ImageID.EQ(Image.ID)). LEFT_JOIN(ImageLinks, ImageLinks.ImageID.EQ(Image.ID)). LEFT_JOIN(ImageLocations, ImageLocations.ImageID.EQ(UserImages.ImageID)). LEFT_JOIN(Locations, Locations.ID.EQ(ImageLocations.LocationID)). LEFT_JOIN(ImageEvents, ImageEvents.ImageID.EQ(UserImages.ImageID)). LEFT_JOIN(Events, Events.ID.EQ(ImageEvents.EventID))). WHERE(UserImages.UserID.EQ(UUID(userId))) fmt.Println(listWithPropertiesStmt.DebugSql()) images := []ImageWithProperties{} err := listWithPropertiesStmt.QueryContext(ctx, m.dbPool, &images) if err != nil { return images, err } return images, err } func NewUserModel(db *sql.DB) UserModel { return UserModel{dbPool: db} }