P0: fix wildcard matching test assertion (config order, not longest prefix) P0: add TotalRecharged to auth cache snapshot (v5) for percentage threshold P1: move pricing rules into per-platform sections in ChannelsView P1: populate account name cache when editing existing channel rules P1: sanitize email subject headers to prevent SMTP injection P1: make Redis INCR+EXPIRE idempotent for rate limiting P1: deep copy FeaturesConfig in Channel.Clone() P2: clean up stale email="" placeholder comments P2: replace log.Printf with slog in email_service.go
44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
package dto
|
|
|
|
import "github.com/Wei-Shaw/sub2api/internal/service"
|
|
|
|
// NotifyEmailEntry represents a notification email with enable/disable and verification state.
|
|
// All emails are user-managed; maximum 3 entries per user.
|
|
type NotifyEmailEntry struct {
|
|
Email string `json:"email"`
|
|
Disabled bool `json:"disabled"`
|
|
Verified bool `json:"verified"`
|
|
}
|
|
|
|
// NotifyEmailEntriesFromService converts service entries to DTO entries.
|
|
func NotifyEmailEntriesFromService(entries []service.NotifyEmailEntry) []NotifyEmailEntry {
|
|
if entries == nil {
|
|
return nil
|
|
}
|
|
result := make([]NotifyEmailEntry, len(entries))
|
|
for i, e := range entries {
|
|
result[i] = NotifyEmailEntry{
|
|
Email: e.Email,
|
|
Disabled: e.Disabled,
|
|
Verified: e.Verified,
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// NotifyEmailEntriesToService converts DTO entries to service entries.
|
|
func NotifyEmailEntriesToService(entries []NotifyEmailEntry) []service.NotifyEmailEntry {
|
|
if entries == nil {
|
|
return nil
|
|
}
|
|
result := make([]service.NotifyEmailEntry, len(entries))
|
|
for i, e := range entries {
|
|
result[i] = service.NotifyEmailEntry{
|
|
Email: e.Email,
|
|
Disabled: e.Disabled,
|
|
Verified: e.Verified,
|
|
}
|
|
}
|
|
return result
|
|
}
|