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,116 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user