- Introduced a new `Groups` field in the `Attachment` struct to support categorization of attachments. - Integrated `types.MetaInfo` into `ManagerOption` for improved metadata handling. - Added a local uploader for attachments, enabling file uploads from a specified local path. - Updated asset management functions to reflect changes in file metadata and structure.
91 lines
4 KiB
Go
91 lines
4 KiB
Go
package attachment
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"mime/multipart"
|
|
|
|
"github.com/yaoapp/gou/types"
|
|
)
|
|
|
|
// File the file
|
|
type File struct {
|
|
ID string `json:"file_id"`
|
|
Bytes int `json:"bytes"`
|
|
CreatedAt int `json:"created_at"`
|
|
Filename string `json:"filename"`
|
|
ContentType string `json:"content_type"`
|
|
Status string `json:"status"` // uploading, uploaded, indexing, indexed, upload_failed, index_failed
|
|
}
|
|
|
|
// FileResponse represents a file download response
|
|
type FileResponse struct {
|
|
Reader io.ReadCloser
|
|
ContentType string
|
|
Extension string
|
|
}
|
|
|
|
// Attachment represents a file attachment
|
|
type Attachment struct {
|
|
Name string `json:"name,omitempty"`
|
|
URL string `json:"url,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
ContentType string `json:"content_type,omitempty"`
|
|
Bytes int64 `json:"bytes,omitempty"`
|
|
CreatedAt int64 `json:"created_at,omitempty"`
|
|
FileID string `json:"file_id,omitempty"`
|
|
Groups []string `json:"groups,omitempty"`
|
|
Gzip bool `json:"gzip,omitempty"` // Gzip the file, Optional, default is false
|
|
}
|
|
|
|
// Manager the manager struct
|
|
type Manager struct {
|
|
ManagerOption
|
|
storage Storage
|
|
maxsize int64
|
|
chunsize int64
|
|
allowedTypes allowedType
|
|
}
|
|
|
|
// Storage the storage interface
|
|
type Storage interface {
|
|
Upload(ctx context.Context, fileID string, reader io.Reader, contentType string) (string, error)
|
|
UploadChunk(ctx context.Context, fileID string, chunkIndex int, reader io.Reader, contentType string) error
|
|
MergeChunks(ctx context.Context, fileID string, totalChunks int) error
|
|
Download(ctx context.Context, fileID string) (io.ReadCloser, string, error)
|
|
Reader(ctx context.Context, fileID string) (io.ReadCloser, error)
|
|
URL(ctx context.Context, fileID string) string
|
|
Exists(ctx context.Context, fileID string) bool
|
|
Delete(ctx context.Context, fileID string) error
|
|
}
|
|
|
|
// ManagerOption the manager option
|
|
type ManagerOption struct {
|
|
types.MetaInfo
|
|
MaxSize string `json:"max_size,omitempty" yaml:"max_size,omitempty"` // Max size of the file, Optional, default is 20M
|
|
ChunkSize string `json:"chunk_size,omitempty" yaml:"chunk_size,omitempty"` // Chunk size of the file, Optional, default is 2M
|
|
AllowedTypes []string `json:"allowed_types,omitempty" yaml:"allowed_types,omitempty"` // Allowed types of the file, Optional, default is all
|
|
Gzip bool `json:"gzip,omitempty" yaml:"gzip,omitempty"` // Gzip the file, Optional, default is false
|
|
Driver string `json:"driver,omitempty" yaml:"driver,omitempty"` // Driver, Optional, default is local
|
|
Options map[string]interface{} `json:"options,omitempty" yaml:"options,omitempty"` // Options, Optional
|
|
}
|
|
|
|
type allowedType struct {
|
|
mapping map[string]bool
|
|
wildcards []string // Wildcard patterns for file types (e.g., "image/*", "text/*")
|
|
}
|
|
|
|
// UploadOption the upload option
|
|
type UploadOption struct {
|
|
CompressImage bool `json:"compress_image,omitempty" form:"compress_image"` // Compress the file, Optional, default is true
|
|
CompressSize int `json:"compress_size,omitempty" form:"compress_size"` // Compress the file size, Optional, default is 1920, if compress_image is true, the file size will be compressed to the compress_size
|
|
Gzip bool `json:"gzip,omitempty" form:"gzip"` // Gzip the file, Optional, default is false
|
|
OriginalFilename string `json:"original_filename,omitempty" form:"original_filename"` // Original filename sent separately to avoid encoding issues
|
|
Groups []string `json:"groups,omitempty" form:"groups"` // Groups, Optional, default is empty, Multi-level groups like ["user", "user123", "chat", "chat456"]
|
|
}
|
|
|
|
// FileHeader the file header
|
|
type FileHeader struct {
|
|
*multipart.FileHeader
|
|
}
|