media

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 28, 2026 License: MIT Imports: 30 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewMediaModule

func NewMediaModule(logger logging.Logger, deps *core.Dependencies) core.Module

func SetupMediaRoutes

func SetupMediaRoutes(r chi.Router, h *MediaHandler, jwtMiddleware func(http.Handler) http.Handler)

SetupMediaRoutes registers media routes

Types

type BulkDeleteInput

type BulkDeleteInput struct {
	FileIDs   []uuid.UUID `json:"fileIds"`
	FolderIDs []uuid.UUID `json:"folderIds"`
	Recursive bool        `json:"recursive"`
}

type BulkDeleteResult

type BulkDeleteResult struct {
	DeletedFiles   int `json:"deletedFiles"`
	DeletedFolders int `json:"deletedFolders"`
}

type BulkMoveInput

type BulkMoveInput struct {
	FileIDs             []uuid.UUID `json:"fileIds"`
	FolderIDs           []uuid.UUID `json:"folderIds"`
	DestinationFolderID *uuid.UUID  `json:"destinationFolderId"`
	DestinationRoot     bool        `json:"destinationRoot,omitempty"`
}

type BulkMoveResult

type BulkMoveResult struct {
	MovedFiles   int `json:"movedFiles"`
	MovedFolders int `json:"movedFolders"`
}

type CreateFolderInput

type CreateFolderInput struct {
	Name     string     `json:"name"`
	Path     string     `json:"path"`
	ParentID *uuid.UUID `json:"parentId"`
}

type FolderDeleteResult

type FolderDeleteResult struct {
	DeletedFolders int `json:"deletedFolders"`
	DeletedFiles   int `json:"deletedFiles"`
}

type ListMediaLibraryOptions

type ListMediaLibraryOptions struct {
	ParentID     *uuid.UUID
	Path         string
	Include      string
	Search       string
	MimePrefix   string
	Provider     string
	Page         int
	PageSize     int
	Sort         string
	Order        string
	FoldersFirst bool
}

ListMediaLibraryOptions defines filters for hierarchical media browsing.

type MediaHandler

type MediaHandler struct {
	// contains filtered or unexported fields
}

func NewMediaHandler

func NewMediaHandler(mediaService *MediaService, logger logging.Logger) *MediaHandler

func (*MediaHandler) BulkDelete

func (h *MediaHandler) BulkDelete(w http.ResponseWriter, r *http.Request)

BulkDelete deletes files/folders in one request. @Summary Bulk delete media resources @Tags Media @Accept json @Produce json @Param request body media.BulkDeleteInput true "Bulk delete payload" @Success 200 {object} media.BulkDeleteResult @Failure 400 {object} responder.Error @Failure 404 {object} responder.Error @Failure 409 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/actions/bulk-delete [post]

func (*MediaHandler) BulkMove

func (h *MediaHandler) BulkMove(w http.ResponseWriter, r *http.Request)

BulkMove moves files/folders to a destination folder. @Summary Bulk move media resources @Tags Media @Accept json @Produce json @Param request body media.BulkMoveInput true "Bulk move payload" @Success 200 {object} media.BulkMoveResult @Failure 400 {object} responder.Error @Failure 404 {object} responder.Error @Failure 409 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/actions/bulk-move [post]

func (*MediaHandler) CreateFolder

func (h *MediaHandler) CreateFolder(w http.ResponseWriter, r *http.Request)

CreateFolder creates a media folder. @Summary Create media folder @Tags Media @Accept json @Produce json @Param request body media.CreateFolderInput true "Create folder payload" @Success 201 {object} responder.Response @Failure 400 {object} responder.Error @Failure 409 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/folders [post]

func (*MediaHandler) DeleteFolder

func (h *MediaHandler) DeleteFolder(w http.ResponseWriter, r *http.Request)

DeleteFolder deletes a media folder. @Summary Delete media folder @Description Non-empty folder deletion requires recursive=true. @Tags Media @Accept json @Produce json @Param id path string true "Folder ID" @Param recursive query bool false "Recursive delete" default(false) @Success 200 {object} media.FolderDeleteResult @Failure 400 {object} responder.Error @Failure 404 {object} responder.Error @Failure 409 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/folders/{id} [delete]

func (*MediaHandler) DeleteMedia

func (h *MediaHandler) DeleteMedia(w http.ResponseWriter, r *http.Request)

DeleteMedia deletes a media file @Summary Delete a media file @Tags Media @Accept json @Produce json @Param id path string true "Media ID" @Success 200 {object} map[string]string @Failure 400 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/{id} [delete]

func (*MediaHandler) GetMedia

func (h *MediaHandler) GetMedia(w http.ResponseWriter, r *http.Request)

GetMedia returns media details @Summary Get media details @Tags Media @Accept json @Produce json @Param id path string true "Media ID" @Success 200 {object} responder.Response @Failure 400 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/{id} [get]

func (*MediaHandler) GetSignedURL

func (h *MediaHandler) GetSignedURL(w http.ResponseWriter, r *http.Request)

GetSignedURL generates a temporary access URL @Summary Generate signed URL for private media @Tags Media @Accept json @Produce json @Param id path string true "Media ID" @Param expiry query int false "URL expiry time in seconds" default(3600) @Success 200 {object} map[string]string @Failure 400 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/{id}/signed [get]

func (*MediaHandler) ListMedia

func (h *MediaHandler) ListMedia(w http.ResponseWriter, r *http.Request)

ListMedia returns hierarchical mixed media nodes (folders + files). @Summary List media library nodes @Description Return mixed folder/file nodes under a folder context. This is the primary media library browse endpoint. @Tags Media @Accept json @Produce json @Param page query int false "Page number" default(1) @Param pageSize query int false "Page size" default(20) @Param parentId query string false "Parent folder ID (UUID)" @Param path query string false "Folder path fallback, used when parentId is absent" @Param include query string false "Node type filter: all|folders|files" Enums(all,folders,files) default(all) @Param _q query string false "Search keyword (folder/file name, alias)" @Param mimePrefix query string false "MIME prefix filter, e.g. image/" @Param provider query string false "Storage provider filter" @Param sort query string false "Sort field: name|createdAt|updatedAt|size" Enums(name,createdAt,updatedAt,size) default(createdAt) @Param order query string false "Sort order: asc|desc" Enums(asc,desc) default(desc) @Param foldersFirst query bool false "Whether folders are ordered before files" default(true) @Success 200 {object} responder.Response @Failure 400 {object} responder.Error @Failure 500 {object} responder.Error @Router /media [get]

func (*MediaHandler) UpdateFolder

func (h *MediaHandler) UpdateFolder(w http.ResponseWriter, r *http.Request)

UpdateFolder renames or moves a media folder. @Summary Update media folder @Tags Media @Accept json @Produce json @Param id path string true "Folder ID" @Param request body media.UpdateFolderInput true "Update folder payload" @Success 200 {object} responder.Response @Failure 400 {object} responder.Error @Failure 404 {object} responder.Error @Failure 409 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/folders/{id} [put]

func (*MediaHandler) UpdateMedia

func (h *MediaHandler) UpdateMedia(w http.ResponseWriter, r *http.Request)

UpdateMedia updates media metadata @Summary Update media metadata @Tags Media @Accept json,multipart/form-data @Produce json @Param id path string true "Media ID" @Param request body object true "Media update data" @Success 200 {object} responder.Response @Failure 400 {object} responder.Error @Failure 500 {object} responder.Error @Router /media/{id} [put]

func (*MediaHandler) Upload

func (h *MediaHandler) Upload(w http.ResponseWriter, r *http.Request)

Upload handles file upload @Summary Upload a file @Tags Media @Accept multipart/form-data @Produce json @Param file formData file true "File to upload" @Param folder_path formData string false "Folder path" default("/") @Success 201 {object} responder.Response @Failure 400 {object} responder.Error @Failure 500 {object} responder.Error @Router /media [post]

type MediaLibraryNode

type MediaLibraryNode struct {
	ID        uuid.UUID  `json:"id"`
	Kind      string     `json:"kind"`
	Name      string     `json:"name"`
	ParentID  *uuid.UUID `json:"parentId,omitempty"`
	Path      string     `json:"path"`
	CreatedAt time.Time  `json:"createdAt"`
	UpdatedAt time.Time  `json:"updatedAt"`

	ChildrenCount *int   `json:"childrenCount,omitempty"`
	FilesCount    *int   `json:"filesCount,omitempty"`
	SizeBytes     *int64 `json:"sizeBytes,omitempty"`

	Mime     *string  `json:"mime,omitempty"`
	Size     *float64 `json:"size,omitempty"`
	URL      *string  `json:"url,omitempty"`
	Width    *int     `json:"width,omitempty"`
	Height   *int     `json:"height,omitempty"`
	Alias    *string  `json:"alias,omitempty"`
	Provider *string  `json:"provider,omitempty"`
}

MediaLibraryNode is a mixed folder/file node for GET /media listing.

type MediaModule

type MediaModule struct {
	// contains filtered or unexported fields
}

func (*MediaModule) Name

func (m *MediaModule) Name() string

func (*MediaModule) RegisterPrivateRoutes

func (m *MediaModule) RegisterPrivateRoutes(r chi.Router)

RegisterPrivateRoutes registers protected media endpoints

func (*MediaModule) RegisterPublicRoutes

func (m *MediaModule) RegisterPublicRoutes(r chi.Router)

RegisterPublicRoutes - media module has no public routes

type MediaService

type MediaService struct {
	// contains filtered or unexported fields
}

func NewMediaService

func NewMediaService(
	client *ent.Client,
	logger logging.Logger,
	provider frameStorage.StorageProvider,
	processor frameProcessor.Resizer,
) *MediaService

func (*MediaService) BulkDelete

func (s *MediaService) BulkDelete(ctx context.Context, input BulkDeleteInput) (*BulkDeleteResult, error)

func (*MediaService) BulkMove

func (s *MediaService) BulkMove(ctx context.Context, input BulkMoveInput) (*BulkMoveResult, error)

func (*MediaService) CreateFolder

func (s *MediaService) CreateFolder(ctx context.Context, input CreateFolderInput) (*ent.MediaFolder, error)

func (*MediaService) DeleteFolder

func (s *MediaService) DeleteFolder(ctx context.Context, id uuid.UUID, recursive bool) (*FolderDeleteResult, error)

func (*MediaService) DeleteMedia

func (s *MediaService) DeleteMedia(ctx context.Context, id uuid.UUID) error

DeleteMedia removes media from DB and storage

func (*MediaService) GetMedia

func (s *MediaService) GetMedia(ctx context.Context, id uuid.UUID) (*ent.Media, error)

GetMedia retrieves media details

func (*MediaService) GetSignedURL

func (s *MediaService) GetSignedURL(ctx context.Context, id uuid.UUID, expiry time.Duration) (string, error)

GetSignedURL generates a temporary access URL

func (*MediaService) ListMediaLibrary

func (s *MediaService) ListMediaLibrary(ctx context.Context, opts ListMediaLibraryOptions) ([]MediaLibraryNode, int, error)

ListMediaLibrary returns mixed folder/file nodes for hierarchical media browsing.

func (*MediaService) UpdateFolder

func (s *MediaService) UpdateFolder(ctx context.Context, id uuid.UUID, input UpdateFolderInput) (*ent.MediaFolder, error)

func (*MediaService) UpdateMedia

func (s *MediaService) UpdateMedia(
	ctx context.Context,
	id uuid.UUID,
	title, altText, caption, folderPath string,
) (*ent.Media, error)

UpdateMedia updates metadata.

func (*MediaService) UpdateMediaWithInput

func (s *MediaService) UpdateMediaWithInput(
	ctx context.Context,
	id uuid.UUID,
	input UpdateMediaInput,
) (*ent.Media, error)

UpdateMediaWithInput updates media metadata and optional thumbnail content.

func (*MediaService) UploadFile

func (s *MediaService) UploadFile(ctx context.Context, header *multipart.FileHeader, ownerID uuid.UUID, folderPath string) (*ent.Media, error)

UploadFile handles file upload, processing, and database record creation

type UpdateFolderInput

type UpdateFolderInput struct {
	Name       *string    `json:"name,omitempty"`
	ParentID   *uuid.UUID `json:"parentId,omitempty"`
	MoveToRoot bool       `json:"moveToRoot,omitempty"`
}

type UpdateMediaInput

type UpdateMediaInput struct {
	Title      string
	AltText    string
	Caption    string
	FolderPath string
	Thumbnail  *multipart.FileHeader
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL