mirror of
https://github.com/SamyRai/turash.git
synced 2025-12-26 23:01:33 +00:00
150 lines
4.6 KiB
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)
|
|
}
|