Files
geo/server/internal/tenant/repository/image_reference_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

117 lines
3.4 KiB
Go

package repository
import (
"context"
"time"
"github.com/geo-platform/tenant-api/internal/tenant/repository/generated"
)
type ImageReference struct {
ID int64
TenantID int64
ImageAssetID int64
ArticleID int64
RefScope string
CreatedAt time.Time
}
type ImageReferenceArticle struct {
ArticleID int64
RefScope string
}
type ImageReferenceRepository interface {
List(ctx context.Context, tenantID, imageAssetID int64) ([]ImageReference, error)
Count(ctx context.Context, tenantID, imageAssetID int64) (int, error)
Upsert(ctx context.Context, tenantID, imageAssetID, articleID int64, refScope string) error
DeleteByArticle(ctx context.Context, tenantID, articleID int64) error
DeleteByArticleScope(ctx context.Context, tenantID, articleID int64, refScope string) error
ListArticles(ctx context.Context, tenantID, imageAssetID int64) ([]ImageReferenceArticle, error)
}
type imageReferenceRepository struct {
q generated.Querier
}
func NewImageReferenceRepository(db generated.DBTX) ImageReferenceRepository {
return &imageReferenceRepository{q: newQuerier(db)}
}
func (r *imageReferenceRepository) List(ctx context.Context, tenantID, imageAssetID int64) ([]ImageReference, error) {
rows, err := r.q.ListImageReferences(ctx, generated.ListImageReferencesParams{
TenantID: tenantID,
ImageAssetID: imageAssetID,
})
if err != nil {
return nil, err
}
refs := make([]ImageReference, len(rows))
for i, row := range rows {
refs[i] = ImageReference{
ID: row.ID,
TenantID: row.TenantID,
ImageAssetID: row.ImageAssetID,
ArticleID: row.ArticleID,
RefScope: row.RefScope,
CreatedAt: timeFromTimestamp(row.CreatedAt),
}
}
return refs, nil
}
func (r *imageReferenceRepository) Count(ctx context.Context, tenantID, imageAssetID int64) (int, error) {
total, err := r.q.CountImageReferences(ctx, generated.CountImageReferencesParams{
TenantID: tenantID,
ImageAssetID: imageAssetID,
})
if err != nil {
return 0, err
}
return int(total), nil
}
func (r *imageReferenceRepository) Upsert(ctx context.Context, tenantID, imageAssetID, articleID int64, refScope string) error {
return r.q.UpsertImageReference(ctx, generated.UpsertImageReferenceParams{
TenantID: tenantID,
ImageAssetID: imageAssetID,
ArticleID: articleID,
RefScope: refScope,
})
}
func (r *imageReferenceRepository) DeleteByArticle(ctx context.Context, tenantID, articleID int64) error {
return r.q.DeleteImageReferencesByArticle(ctx, generated.DeleteImageReferencesByArticleParams{
TenantID: tenantID,
ArticleID: articleID,
})
}
func (r *imageReferenceRepository) DeleteByArticleScope(ctx context.Context, tenantID, articleID int64, refScope string) error {
return r.q.DeleteImageReferencesByArticleScope(ctx, generated.DeleteImageReferencesByArticleScopeParams{
TenantID: tenantID,
ArticleID: articleID,
RefScope: refScope,
})
}
func (r *imageReferenceRepository) ListArticles(ctx context.Context, tenantID, imageAssetID int64) ([]ImageReferenceArticle, error) {
rows, err := r.q.ListImageReferenceArticles(ctx, generated.ListImageReferenceArticlesParams{
TenantID: tenantID,
ImageAssetID: imageAssetID,
})
if err != nil {
return nil, err
}
articles := make([]ImageReferenceArticle, len(rows))
for i, row := range rows {
articles[i] = ImageReferenceArticle{
ArticleID: row.ArticleID,
RefScope: row.RefScope,
}
}
return articles, nil
}