package models
import "theskyscape.com/repo/skykit"
// Image stores uploaded images separately from decks to avoid memory bloat
type Image struct {
skykit.Model
OwnerID string
DeckID string // Optional - which deck this belongs to
ContentType string // e.g., "image/png"
Data string // Base64-encoded image data (no data: prefix)
}
// GetImage retrieves an image by ID
func GetImage(id string) (*Image, error) {
return Images.Get(id)
}
// GetImageByOwner retrieves an image only if owned by the given user
func GetImageByOwner(id, ownerID string) (*Image, error) {
return Images.First("WHERE ID = ? AND OwnerID = ?", id, ownerID)
}
// CreateImage stores image data and returns the image record
func CreateImage(ownerID, deckID, contentType, base64Data string) (*Image, error) {
img := Images.New()
img.OwnerID = ownerID
img.DeckID = deckID
img.ContentType = contentType
img.Data = base64Data
return Images.Insert(img)
}
// DeleteImagesForDeck removes all images associated with a deck
func DeleteImagesForDeck(deckID string) error {
images, err := Images.Search("WHERE DeckID = ?", deckID)
if err != nil {
return err
}
for _, img := range images {
Images.Delete(img)
}
return nil
}
// DeleteImageByURL deletes an image given its URL (e.g., "/images/abc123")
func DeleteImageByURL(url string) error {
if url == "" {
return nil
}
// Extract ID from URL like "/images/abc123"
const prefix = "/images/"
if len(url) <= len(prefix) {
return nil
}
id := url[len(prefix):]
img, err := GetImage(id)
if err != nil {
return nil // Image doesn't exist, nothing to delete
}
return Images.Delete(img)
}
Add rich text formatting and block styling to editor
Pitch decks to help promote Skyscape Apps