turash/bugulma/backend/internal/service/content_service.go

150 lines
4.6 KiB
Go

package service
import (
"context"
"time"
"bugulma/backend/internal/domain"
"github.com/google/uuid"
)
type ContentService struct {
pageRepo domain.StaticPageRepository
announcementRepo domain.AnnouncementRepository
mediaRepo domain.MediaAssetRepository
}
func NewContentService(
pageRepo domain.StaticPageRepository,
announcementRepo domain.AnnouncementRepository,
mediaRepo domain.MediaAssetRepository,
) *ContentService {
return &ContentService{
pageRepo: pageRepo,
announcementRepo: announcementRepo,
mediaRepo: mediaRepo,
}
}
// Static Pages
// ListPages lists static pages with optional filters
func (s *ContentService) ListPages(ctx context.Context, filters map[string]interface{}) ([]*domain.StaticPage, error) {
return s.pageRepo.GetAll(ctx)
}
// GetPage retrieves a page by slug
func (s *ContentService) GetPage(ctx context.Context, slug string) (*domain.StaticPage, error) {
return s.pageRepo.GetBySlug(ctx, slug)
}
// CreatePage creates a new static page
func (s *ContentService) CreatePage(ctx context.Context, page *domain.StaticPage) error {
page.ID = uuid.New().String()
if page.Status == "" {
page.Status = domain.PageStatusDraft
}
if page.Visibility == "" {
page.Visibility = domain.PageVisibilityPublic
}
return s.pageRepo.Create(ctx, page)
}
// UpdatePage updates a static page
func (s *ContentService) UpdatePage(ctx context.Context, page *domain.StaticPage) error {
return s.pageRepo.Update(ctx, page)
}
// DeletePage deletes a static page
func (s *ContentService) DeletePage(ctx context.Context, id string) error {
return s.pageRepo.Delete(ctx, id)
}
// PublishPage publishes a page
func (s *ContentService) PublishPage(ctx context.Context, id string) error {
page, err := s.pageRepo.GetByID(ctx, id)
if err != nil {
return err
}
now := time.Now()
page.Status = domain.PageStatusPublished
page.PublishedAt = &now
return s.pageRepo.Update(ctx, page)
}
// Announcements
// ListAnnouncements lists announcements with filters
func (s *ContentService) ListAnnouncements(ctx context.Context, filters domain.AnnouncementFilters) ([]*domain.Announcement, error) {
return s.announcementRepo.GetAll(ctx, filters)
}
// GetAnnouncement retrieves an announcement by ID
func (s *ContentService) GetAnnouncement(ctx context.Context, id string) (*domain.Announcement, error) {
return s.announcementRepo.GetByID(ctx, id)
}
// CreateAnnouncement creates a new announcement
func (s *ContentService) CreateAnnouncement(ctx context.Context, announcement *domain.Announcement) error {
announcement.ID = uuid.New().String()
if announcement.Priority == "" {
announcement.Priority = domain.AnnouncementPriorityNormal
}
if announcement.DisplayType == "" {
announcement.DisplayType = domain.AnnouncementDisplayBanner
}
if announcement.TargetAudience == "" {
announcement.TargetAudience = domain.AnnouncementTargetAll
}
return s.announcementRepo.Create(ctx, announcement)
}
// UpdateAnnouncement updates an announcement
func (s *ContentService) UpdateAnnouncement(ctx context.Context, announcement *domain.Announcement) error {
return s.announcementRepo.Update(ctx, announcement)
}
// DeleteAnnouncement deletes an announcement
func (s *ContentService) DeleteAnnouncement(ctx context.Context, id string) error {
return s.announcementRepo.Delete(ctx, id)
}
// GetActiveAnnouncements retrieves active announcements
func (s *ContentService) GetActiveAnnouncements(ctx context.Context) ([]*domain.Announcement, error) {
return s.announcementRepo.GetActive(ctx)
}
// Media Assets
// ListMediaAssets lists media assets with filters
func (s *ContentService) ListMediaAssets(ctx context.Context, filters domain.MediaAssetFilters) ([]*domain.MediaAsset, error) {
return s.mediaRepo.GetAll(ctx, filters)
}
// GetMediaAsset retrieves a media asset by ID
func (s *ContentService) GetMediaAsset(ctx context.Context, id string) (*domain.MediaAsset, error) {
return s.mediaRepo.GetByID(ctx, id)
}
// CreateMediaAsset creates a new media asset
func (s *ContentService) CreateMediaAsset(ctx context.Context, asset *domain.MediaAsset) error {
asset.ID = uuid.New().String()
return s.mediaRepo.Create(ctx, asset)
}
// UpdateMediaAsset updates a media asset
func (s *ContentService) UpdateMediaAsset(ctx context.Context, asset *domain.MediaAsset) error {
return s.mediaRepo.Update(ctx, asset)
}
// DeleteMediaAsset deletes a media asset
func (s *ContentService) DeleteMediaAsset(ctx context.Context, id string) error {
return s.mediaRepo.Delete(ctx, id)
}
// SearchMediaAssets searches media assets
func (s *ContentService) SearchMediaAssets(ctx context.Context, query string) ([]*domain.MediaAsset, error) {
return s.mediaRepo.Search(ctx, query)
}