monorepo/cloud/maplepress-backend/internal/usecase/page/get_page_statistics.go

77 lines
1.9 KiB
Go

package page
import (
"context"
"fmt"
"github.com/gocql/gocql"
"go.uber.org/zap"
domainpage "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/domain/page"
)
// GetPageStatisticsUseCase retrieves page count statistics
type GetPageStatisticsUseCase struct {
pageRepo domainpage.Repository
logger *zap.Logger
}
// ProvideGetPageStatisticsUseCase creates a new GetPageStatisticsUseCase
func ProvideGetPageStatisticsUseCase(
pageRepo domainpage.Repository,
logger *zap.Logger,
) *GetPageStatisticsUseCase {
return &GetPageStatisticsUseCase{
pageRepo: pageRepo,
logger: logger,
}
}
// PageStatistics contains page count statistics
type PageStatistics struct {
TotalPages int64
PublishedPages int64
DraftPages int64
}
// Execute retrieves page statistics for a site
func (uc *GetPageStatisticsUseCase) Execute(
ctx context.Context,
siteID gocql.UUID,
) (*PageStatistics, error) {
// Count total pages in database
totalPages, err := uc.pageRepo.CountBySiteID(ctx, siteID)
if err != nil {
uc.logger.Error("failed to count pages", zap.Error(err))
return nil, fmt.Errorf("failed to count pages: %w", err)
}
// Get all pages to count by status (this could be optimized with a dedicated query)
pages, err := uc.pageRepo.GetBySiteID(ctx, siteID)
if err != nil {
uc.logger.Error("failed to get pages", zap.Error(err))
return nil, fmt.Errorf("failed to get pages: %w", err)
}
// Count pages by status
var publishedPages, draftPages int64
for _, page := range pages {
if page.Status == "publish" {
publishedPages++
} else if page.Status == "draft" {
draftPages++
}
}
uc.logger.Info("page statistics retrieved",
zap.String("site_id", siteID.String()),
zap.Int64("total", totalPages),
zap.Int64("published", publishedPages),
zap.Int64("draft", draftPages))
return &PageStatistics{
TotalPages: totalPages,
PublishedPages: publishedPages,
DraftPages: draftPages,
}, nil
}