Files
geo/server/internal/tenant/repository/image_folder_repo.go
T
root 27389164b0 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.
2026-04-16 20:40:41 +08:00

106 lines
2.8 KiB
Go

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
}