108 lines
2.7 KiB
Go
108 lines
2.7 KiB
Go
|
|
package service
|
||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"narasi-ahli-be/app/database/entity"
|
||
|
|
"narasi-ahli-be/app/module/notifications/repository"
|
||
|
|
"narasi-ahli-be/app/module/notifications/response"
|
||
|
|
)
|
||
|
|
|
||
|
|
type notificationsService struct {
|
||
|
|
Repo repository.NotificationsRepository
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewNotificationsService(repo repository.NotificationsRepository) NotificationsService {
|
||
|
|
return ¬ificationsService{Repo: repo}
|
||
|
|
}
|
||
|
|
type NotificationsService interface {
|
||
|
|
Create(sentTo int, sendBy int, sendByName string, message string) (*response.NotificationResponse, error)
|
||
|
|
ListBySentTo(sentTo int, page int, limit int, isRead *bool) ([]response.NotificationResponse, int64, error)
|
||
|
|
MarkRead(id uint64) error
|
||
|
|
Delete(id uint64) error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *notificationsService) Create(sentTo int, sendBy int, sendByName string, message string) (*response.NotificationResponse, error) {
|
||
|
|
if sentTo <= 0 {
|
||
|
|
return nil, errors.New("sentTo is required")
|
||
|
|
}
|
||
|
|
if sendBy <= 0 {
|
||
|
|
return nil, errors.New("sendBy is required")
|
||
|
|
}
|
||
|
|
if sendByName == "" {
|
||
|
|
return nil, errors.New("sendByName is required")
|
||
|
|
}
|
||
|
|
if message == "" {
|
||
|
|
return nil, errors.New("message is required")
|
||
|
|
}
|
||
|
|
|
||
|
|
data := entity.Notifications{
|
||
|
|
SentTo: sentTo,
|
||
|
|
SendBy: sendBy,
|
||
|
|
SendByName: sendByName,
|
||
|
|
Message: message,
|
||
|
|
IsRead: false,
|
||
|
|
IsActive: true,
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := s.Repo.Create(&data); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
return &response.NotificationResponse{
|
||
|
|
ID: data.ID,
|
||
|
|
SentTo: data.SentTo,
|
||
|
|
SendBy: data.SendBy,
|
||
|
|
SendByName: data.SendByName,
|
||
|
|
Message: data.Message,
|
||
|
|
IsRead: data.IsRead,
|
||
|
|
IsActive: data.IsActive,
|
||
|
|
CreatedAt: data.CreatedAt,
|
||
|
|
UpdatedAt: data.UpdatedAt,
|
||
|
|
}, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *notificationsService) ListBySentTo(sentTo int, page int, limit int, isRead *bool) ([]response.NotificationResponse, int64, error) {
|
||
|
|
if sentTo <= 0 {
|
||
|
|
return nil, 0, errors.New("sentTo is required")
|
||
|
|
}
|
||
|
|
|
||
|
|
rows, total, err := s.Repo.ListBySentTo(sentTo, page, limit, isRead)
|
||
|
|
if err != nil {
|
||
|
|
return nil, 0, err
|
||
|
|
}
|
||
|
|
|
||
|
|
result := make([]response.NotificationResponse, 0)
|
||
|
|
for _, item := range rows {
|
||
|
|
result = append(result, response.NotificationResponse{
|
||
|
|
ID: item.ID,
|
||
|
|
SentTo: item.SentTo,
|
||
|
|
SendBy: item.SendBy,
|
||
|
|
SendByName: item.SendByName,
|
||
|
|
Message: item.Message,
|
||
|
|
IsRead: item.IsRead,
|
||
|
|
IsActive: item.IsActive,
|
||
|
|
CreatedAt: item.CreatedAt,
|
||
|
|
UpdatedAt: item.UpdatedAt,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
return result, total, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *notificationsService) MarkRead(id uint64) error {
|
||
|
|
old, err := s.Repo.FindById(id)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
if old.IsActive == false {
|
||
|
|
return errors.New("notification already deleted")
|
||
|
|
}
|
||
|
|
|
||
|
|
return s.Repo.MarkRead(id)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *notificationsService) Delete(id uint64) error {
|
||
|
|
return s.Repo.Delete(id)
|
||
|
|
}
|