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/go-jet/jet/v2/qrm" "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 Organizer *model.Contacts } Notes []model.Notes Contacts []model.Contacts } 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, ImageContacts.AllColumns, Contacts.AllColumns, ImageNotes.AllColumns, Notes.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)). LEFT_JOIN(ImageContacts, ImageContacts.ImageID.EQ(UserImages.ImageID)). LEFT_JOIN(Contacts, Contacts.ID.EQ(ImageContacts.ContactID)). LEFT_JOIN(ImageNotes, ImageNotes.ImageID.EQ(UserImages.ImageID)). LEFT_JOIN(Notes, Notes.ID.EQ(ImageNotes.NoteID))). 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 (m UserModel) GetUserIdFromEmail(ctx context.Context, email string) (uuid.UUID, error) { getUserIdStmt := Users.SELECT(Users.ID).WHERE(Users.Email.EQ(String(email))) user := model.Users{} err := getUserIdStmt.QueryContext(ctx, m.dbPool, &user) return user.ID, err } func (m UserModel) DoesUserExist(ctx context.Context, email string) bool { getUserIdStmt := Users.SELECT(Users.ID).WHERE(Users.Email.EQ(String(email))) user := model.Users{} err := getUserIdStmt.QueryContext(ctx, m.dbPool, &user) return err != qrm.ErrNoRows } func (m UserModel) Save(ctx context.Context, user model.Users) (model.Users, error) { insertUserStmt := Users.INSERT(Users.Email).VALUES(user.Email).RETURNING(Users.AllColumns) insertedUser := model.Users{} err := insertUserStmt.QueryContext(ctx, m.dbPool, &insertedUser) return insertedUser, err } func NewUserModel(db *sql.DB) UserModel { return UserModel{dbPool: db} }