115 lines
3.7 KiB
Go
115 lines
3.7 KiB
Go
package services
|
|
|
|
import (
|
|
"errors"
|
|
"lost-and-found/internal/models"
|
|
"lost-and-found/internal/repositories"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type NotificationService struct {
|
|
db *gorm.DB // Tambahkan ini
|
|
notificationRepo *repositories.NotificationRepository
|
|
}
|
|
|
|
func NewNotificationService(db *gorm.DB) *NotificationService {
|
|
return &NotificationService{
|
|
db: db, // Tambahkan ini
|
|
notificationRepo: repositories.NewNotificationRepository(db),
|
|
}
|
|
}
|
|
// GetUserNotifications gets notifications for a user
|
|
func (s *NotificationService) GetUserNotifications(userID uint, page, limit int, onlyUnread bool) ([]models.NotificationResponse, int64, error) {
|
|
notifications, total, err := s.notificationRepo.FindByUser(userID, page, limit, onlyUnread)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
var responses []models.NotificationResponse
|
|
for _, notification := range notifications {
|
|
responses = append(responses, notification.ToResponse())
|
|
}
|
|
|
|
return responses, total, nil
|
|
}
|
|
|
|
// GetNotificationByID gets notification by ID
|
|
func (s *NotificationService) GetNotificationByID(userID, notificationID uint) (*models.Notification, error) {
|
|
notification, err := s.notificationRepo.FindByID(notificationID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Check ownership
|
|
if notification.UserID != userID {
|
|
return nil, errors.New("unauthorized")
|
|
}
|
|
|
|
return notification, nil
|
|
}
|
|
|
|
// MarkAsRead marks a notification as read
|
|
func (s *NotificationService) MarkAsRead(userID, notificationID uint) error {
|
|
notification, err := s.notificationRepo.FindByID(notificationID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Check ownership
|
|
if notification.UserID != userID {
|
|
return errors.New("unauthorized")
|
|
}
|
|
|
|
return s.notificationRepo.MarkAsRead(notificationID)
|
|
}
|
|
|
|
// MarkAllAsRead marks all notifications as read for a user
|
|
func (s *NotificationService) MarkAllAsRead(userID uint) error {
|
|
return s.notificationRepo.MarkAllAsRead(userID)
|
|
}
|
|
|
|
// DeleteNotification deletes a notification
|
|
func (s *NotificationService) DeleteNotification(userID, notificationID uint) error {
|
|
notification, err := s.notificationRepo.FindByID(notificationID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Check ownership
|
|
if notification.UserID != userID {
|
|
return errors.New("unauthorized")
|
|
}
|
|
|
|
return s.notificationRepo.Delete(notificationID)
|
|
}
|
|
|
|
// DeleteAllNotifications deletes all notifications for a user
|
|
func (s *NotificationService) DeleteAllNotifications(userID uint) error {
|
|
return s.notificationRepo.DeleteAllForUser(userID)
|
|
}
|
|
|
|
// CountUnread counts unread notifications for a user
|
|
func (s *NotificationService) CountUnread(userID uint) (int64, error) {
|
|
return s.notificationRepo.CountUnread(userID)
|
|
}
|
|
|
|
// CreateNotification creates a new notification
|
|
func (s *NotificationService) CreateNotification(userID uint, notifType, title, message, entityType string, entityID *uint) error {
|
|
return s.notificationRepo.Notify(userID, notifType, title, message, entityType, entityID)
|
|
}
|
|
|
|
// SendMatchNotification sends notification when a match is found
|
|
func (s *NotificationService) SendMatchNotification(userID uint, itemName string, matchID uint) error {
|
|
return models.CreateMatchNotification(s.db, userID, itemName, matchID)
|
|
}
|
|
|
|
// SendClaimApprovedNotification sends notification when claim is approved
|
|
func (s *NotificationService) SendClaimApprovedNotification(userID uint, itemName string, claimID uint) error {
|
|
return models.CreateClaimApprovedNotification(s.db, userID, itemName, claimID)
|
|
}
|
|
|
|
// SendClaimRejectedNotification sends notification when claim is rejected
|
|
func (s *NotificationService) SendClaimRejectedNotification(userID uint, itemName, reason string, claimID uint) error {
|
|
return models.CreateClaimRejectedNotification(s.db, userID, itemName, reason, claimID)
|
|
} |