feat: add image management functionality
- Implemented image folder repository with CRUD operations. - Added image reference repository for managing image references to articles. - Created image repository for handling image assets, including listing, inserting, updating, and deleting images. - Introduced image usage repository to track storage usage and quotas for tenants. - Added SQL queries for image assets, folders, references, and usage. - Developed image handler for HTTP endpoints to manage images and folders. - Created database migration scripts for image-related tables and structures.
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/geo-platform/tenant-api/internal/tenant/repository/generated"
|
||||
)
|
||||
|
||||
type ImageFolder struct {
|
||||
ID int64
|
||||
TenantID int64
|
||||
Name string
|
||||
ImageCount int
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
}
|
||||
|
||||
type ImageFolderRepository interface {
|
||||
List(ctx context.Context, tenantID int64) ([]ImageFolder, error)
|
||||
Get(ctx context.Context, tenantID, id int64) (*ImageFolder, error)
|
||||
Create(ctx context.Context, tenantID int64, name string) (int64, error)
|
||||
Update(ctx context.Context, tenantID, id int64, name string) error
|
||||
Delete(ctx context.Context, tenantID, id int64) error
|
||||
CountActiveImages(ctx context.Context, tenantID, folderID int64) (int, error)
|
||||
}
|
||||
|
||||
type imageFolderRepository struct {
|
||||
q generated.Querier
|
||||
}
|
||||
|
||||
func NewImageFolderRepository(db generated.DBTX) ImageFolderRepository {
|
||||
return &imageFolderRepository{q: newQuerier(db)}
|
||||
}
|
||||
|
||||
func (r *imageFolderRepository) List(ctx context.Context, tenantID int64) ([]ImageFolder, error) {
|
||||
rows, err := r.q.ListImageFolders(ctx, tenantID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
folders := make([]ImageFolder, len(rows))
|
||||
for i, row := range rows {
|
||||
folders[i] = ImageFolder{
|
||||
ID: row.ID,
|
||||
TenantID: row.TenantID,
|
||||
Name: row.Name,
|
||||
ImageCount: int(row.ImageCount),
|
||||
CreatedAt: timeFromTimestamp(row.CreatedAt),
|
||||
UpdatedAt: timeFromTimestamp(row.UpdatedAt),
|
||||
}
|
||||
}
|
||||
return folders, nil
|
||||
}
|
||||
|
||||
func (r *imageFolderRepository) Get(ctx context.Context, tenantID, id int64) (*ImageFolder, error) {
|
||||
row, err := r.q.GetImageFolder(ctx, generated.GetImageFolderParams{
|
||||
ID: id,
|
||||
TenantID: tenantID,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &ImageFolder{
|
||||
ID: row.ID,
|
||||
TenantID: row.TenantID,
|
||||
Name: row.Name,
|
||||
CreatedAt: timeFromTimestamp(row.CreatedAt),
|
||||
UpdatedAt: timeFromTimestamp(row.UpdatedAt),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (r *imageFolderRepository) Create(ctx context.Context, tenantID int64, name string) (int64, error) {
|
||||
return r.q.CreateImageFolder(ctx, generated.CreateImageFolderParams{
|
||||
TenantID: tenantID,
|
||||
Name: name,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *imageFolderRepository) Update(ctx context.Context, tenantID, id int64, name string) error {
|
||||
return r.q.UpdateImageFolder(ctx, generated.UpdateImageFolderParams{
|
||||
Name: name,
|
||||
ID: id,
|
||||
TenantID: tenantID,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *imageFolderRepository) Delete(ctx context.Context, tenantID, id int64) error {
|
||||
return r.q.DeleteImageFolder(ctx, generated.DeleteImageFolderParams{
|
||||
ID: id,
|
||||
TenantID: tenantID,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *imageFolderRepository) CountActiveImages(ctx context.Context, tenantID, folderID int64) (int, error) {
|
||||
count, err := r.q.CountActiveImagesInFolder(ctx, generated.CountActiveImagesInFolderParams{
|
||||
TenantID: tenantID,
|
||||
FolderID: pgInt8(&folderID),
|
||||
})
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int(count), nil
|
||||
}
|
||||
Reference in New Issue
Block a user