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) (model.Image, error) { saveImageStmt := Image.INSERT(Image.ImageName, Image.Image, Image.Description, Image.UserID). VALUES(name, image, "", userID). RETURNING(Image.AllColumns) newImage := model.Image{} err := saveImageStmt.QueryContext(ctx, m.dbPool, &newImage) return newImage, err } func (m ImageModel) Get(ctx context.Context, imageID uuid.UUID) (model.Image, bool, error) { getImageStmt := Image.SELECT(Image.AllColumns).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) UpdateDescription(ctx context.Context, imageID uuid.UUID, description string) error { updateImageDescriptionStmt := Image.UPDATE(Image.Description). SET(Image.Description.SET(String(description))). WHERE(Image.ID.EQ(UUID(imageID))) _, err := updateImageDescriptionStmt.ExecContext(ctx, m.dbPool) return err } func (m ImageModel) UpdateProcess(ctx context.Context, imageID uuid.UUID, process model.Progress) error { updateImageDescriptionStmt := Image.UPDATE(Image.Status). SET(process). WHERE(Image.ID.EQ(UUID(imageID))) _, err := updateImageDescriptionStmt.ExecContext(ctx, m.dbPool) return 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} }