Basic impl added
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
package rest
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/igodwin/notifier/internal/domain"
|
||||
)
|
||||
|
||||
// SendNotificationRequest is the REST API request for sending a notification
|
||||
type SendNotificationRequest struct {
|
||||
Type string `json:"type"`
|
||||
Priority int `json:"priority,omitempty"`
|
||||
Subject string `json:"subject"`
|
||||
Body string `json:"body"`
|
||||
Recipients []string `json:"recipients"`
|
||||
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
||||
ScheduledFor *time.Time `json:"scheduled_for,omitempty"`
|
||||
MaxRetries int `json:"max_retries,omitempty"`
|
||||
}
|
||||
|
||||
// Validate validates the request
|
||||
func (r *SendNotificationRequest) Validate() error {
|
||||
if r.Type == "" {
|
||||
return fmt.Errorf("type is required")
|
||||
}
|
||||
|
||||
if len(r.Recipients) == 0 {
|
||||
return fmt.Errorf("at least one recipient is required")
|
||||
}
|
||||
|
||||
if r.Body == "" {
|
||||
return fmt.Errorf("body is required")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ToNotification converts the request to a domain notification
|
||||
func (r *SendNotificationRequest) ToNotification() *domain.Notification {
|
||||
maxRetries := r.MaxRetries
|
||||
if maxRetries == 0 {
|
||||
maxRetries = 3 // Default
|
||||
}
|
||||
|
||||
return &domain.Notification{
|
||||
ID: uuid.New().String(),
|
||||
Type: domain.NotificationType(r.Type),
|
||||
Priority: domain.Priority(r.Priority),
|
||||
Status: domain.StatusPending,
|
||||
Subject: r.Subject,
|
||||
Body: r.Body,
|
||||
Recipients: r.Recipients,
|
||||
Metadata: r.Metadata,
|
||||
CreatedAt: time.Now(),
|
||||
ScheduledFor: r.ScheduledFor,
|
||||
MaxRetries: maxRetries,
|
||||
RetryCount: 0,
|
||||
}
|
||||
}
|
||||
|
||||
// SendNotificationResponse is the REST API response for sending a notification
|
||||
type SendNotificationResponse struct {
|
||||
Result NotificationResult `json:"result"`
|
||||
}
|
||||
|
||||
// SendBatchNotificationsRequest is the REST API request for sending multiple notifications
|
||||
type SendBatchNotificationsRequest struct {
|
||||
Notifications []SendNotificationRequest `json:"notifications"`
|
||||
}
|
||||
|
||||
// SendBatchNotificationsResponse is the REST API response for sending multiple notifications
|
||||
type SendBatchNotificationsResponse struct {
|
||||
Results []NotificationResult `json:"results"`
|
||||
}
|
||||
|
||||
// Notification represents a notification in the REST API
|
||||
type Notification struct {
|
||||
ID string `json:"id"`
|
||||
Type string `json:"type"`
|
||||
Priority int `json:"priority"`
|
||||
Status string `json:"status"`
|
||||
Subject string `json:"subject"`
|
||||
Body string `json:"body"`
|
||||
Recipients []string `json:"recipients"`
|
||||
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
ScheduledFor *time.Time `json:"scheduled_for,omitempty"`
|
||||
SentAt *time.Time `json:"sent_at,omitempty"`
|
||||
RetryCount int `json:"retry_count"`
|
||||
MaxRetries int `json:"max_retries"`
|
||||
LastError string `json:"last_error,omitempty"`
|
||||
}
|
||||
|
||||
// NotificationFromDomain converts a domain notification to API format
|
||||
func NotificationFromDomain(n *domain.Notification) Notification {
|
||||
return Notification{
|
||||
ID: n.ID,
|
||||
Type: string(n.Type),
|
||||
Priority: int(n.Priority),
|
||||
Status: string(n.Status),
|
||||
Subject: n.Subject,
|
||||
Body: n.Body,
|
||||
Recipients: n.Recipients,
|
||||
Metadata: n.Metadata,
|
||||
CreatedAt: n.CreatedAt,
|
||||
ScheduledFor: n.ScheduledFor,
|
||||
SentAt: n.SentAt,
|
||||
RetryCount: n.RetryCount,
|
||||
MaxRetries: n.MaxRetries,
|
||||
LastError: n.LastError,
|
||||
}
|
||||
}
|
||||
|
||||
// NotificationResult represents the result of a notification operation
|
||||
type NotificationResult struct {
|
||||
NotificationID string `json:"notification_id"`
|
||||
Success bool `json:"success"`
|
||||
Message string `json:"message,omitempty"`
|
||||
Error string `json:"error,omitempty"`
|
||||
SentAt time.Time `json:"sent_at"`
|
||||
ProviderResponse map[string]interface{} `json:"provider_response,omitempty"`
|
||||
}
|
||||
|
||||
// NotificationResultFromDomain converts a domain result to API format
|
||||
func NotificationResultFromDomain(r *domain.NotificationResult) NotificationResult {
|
||||
return NotificationResult{
|
||||
NotificationID: r.NotificationID,
|
||||
Success: r.Success,
|
||||
Message: r.Message,
|
||||
Error: r.Error,
|
||||
SentAt: r.SentAt,
|
||||
ProviderResponse: r.ProviderResponse,
|
||||
}
|
||||
}
|
||||
|
||||
// ListNotificationsResponse is the REST API response for listing notifications
|
||||
type ListNotificationsResponse struct {
|
||||
Notifications []Notification `json:"notifications"`
|
||||
Total int64 `json:"total"`
|
||||
}
|
||||
|
||||
// RetryNotificationResponse is the REST API response for retrying a notification
|
||||
type RetryNotificationResponse struct {
|
||||
Result NotificationResult `json:"result"`
|
||||
}
|
||||
Reference in New Issue
Block a user