Documentation
¶
Index ¶
- func NewMediaModule(logger logging.Logger, deps *core.Dependencies) core.Module
- func SetupMediaRoutes(r chi.Router, h *MediaHandler, jwtMiddleware func(http.Handler) http.Handler)
- type BulkDeleteInput
- type BulkDeleteResult
- type BulkMoveInput
- type BulkMoveResult
- type CreateFolderInput
- type FolderDeleteResult
- type ListMediaLibraryOptions
- type MediaHandler
- func (h *MediaHandler) BulkDelete(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) BulkMove(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) CreateFolder(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) DeleteFolder(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) DeleteMedia(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) GetMedia(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) GetSignedURL(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) ListMedia(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) UpdateFolder(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) UpdateMedia(w http.ResponseWriter, r *http.Request)
- func (h *MediaHandler) Upload(w http.ResponseWriter, r *http.Request)
- type MediaLibraryNode
- type MediaModule
- type MediaService
- func (s *MediaService) BulkDelete(ctx context.Context, input BulkDeleteInput) (*BulkDeleteResult, error)
- func (s *MediaService) BulkMove(ctx context.Context, input BulkMoveInput) (*BulkMoveResult, error)
- func (s *MediaService) CreateFolder(ctx context.Context, input CreateFolderInput) (*ent.MediaFolder, error)
- func (s *MediaService) DeleteFolder(ctx context.Context, id uuid.UUID, recursive bool) (*FolderDeleteResult, error)
- func (s *MediaService) DeleteMedia(ctx context.Context, id uuid.UUID) error
- func (s *MediaService) GetMedia(ctx context.Context, id uuid.UUID) (*ent.Media, error)
- func (s *MediaService) GetSignedURL(ctx context.Context, id uuid.UUID, expiry time.Duration) (string, error)
- func (s *MediaService) ListMediaLibrary(ctx context.Context, opts ListMediaLibraryOptions) ([]MediaLibraryNode, int, error)
- func (s *MediaService) UpdateFolder(ctx context.Context, id uuid.UUID, input UpdateFolderInput) (*ent.MediaFolder, error)
- func (s *MediaService) UpdateMedia(ctx context.Context, id uuid.UUID, title, altText, caption, folderPath string) (*ent.Media, error)
- func (s *MediaService) UpdateMediaWithInput(ctx context.Context, id uuid.UUID, input UpdateMediaInput) (*ent.Media, error)
- func (s *MediaService) UploadFile(ctx context.Context, header *multipart.FileHeader, ownerID uuid.UUID, ...) (*ent.Media, error)
- type UpdateFolderInput
- type UpdateMediaInput
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewMediaModule ¶
func SetupMediaRoutes ¶
SetupMediaRoutes registers media routes
Types ¶
type BulkDeleteInput ¶
type BulkDeleteResult ¶
type BulkMoveInput ¶
type BulkMoveResult ¶
type CreateFolderInput ¶
type FolderDeleteResult ¶
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 ¶
DeleteMedia removes media from DB and storage
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