package models import ( "context" "database/sql" "fmt" "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 ImageModel struct { dbPool *sql.DB } func (m ImageModel) Save(ctx context.Context, name string, image []byte, userID uuid.UUID) error { saveImageStmt := Image.INSERT(Image.ImageName, Image.Image, Image.UserID). VALUES(name, image, userID) _, err := saveImageStmt.ExecContext(ctx, m.dbPool) return err } func (m ImageModel) Get(ctx context.Context, imageID uuid.UUID) (model.Image, bool, error) { getImageStmt := Image.SELECT(Image.AllColumns.Except(Image.Image)).WHERE(Image.ID.EQ(UUID(imageID))) image := model.Image{} err := getImageStmt.QueryContext(ctx, m.dbPool, &image) return image, err != qrm.ErrNoRows, err } func (m ImageModel) Update(ctx context.Context, image model.Image) (model.Image, error) { updateImageStmt := Image.UPDATE(Image.MutableColumns.Except(Image.Image)). MODEL(image). WHERE(Image.ID.EQ(UUID(image.ID))). RETURNING(Image.AllColumns.Except(Image.Image)) updatedImage := model.Image{} err := updateImageStmt.QueryContext(ctx, m.dbPool, &updatedImage) return updatedImage, err } func (m ImageModel) Delete(ctx context.Context, imageID, userID uuid.UUID) (bool, error) { deleteImageStmt := Image.DELETE().WHERE(Image.ID.EQ(UUID(imageID)).AND(Image.UserID.EQ(UUID(userID)))) r, err := deleteImageStmt.ExecContext(ctx, m.dbPool) if err != nil { return false, fmt.Errorf("deleting image: %w", err) } rowsAffected, err := r.RowsAffected() if err != nil { return false, fmt.Errorf("unreachable: %w", err) } return rowsAffected > 0, nil } func NewImageModel(db *sql.DB) ImageModel { return ImageModel{dbPool: db} }