feat: account dispute emails
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package mail
|
||||
|
||||
import "time"
|
||||
|
||||
// DisputeNotice is everything the four account-dispute emails say.
|
||||
//
|
||||
// vantage-admin's dispute package builds it. It never carries the staff note:
|
||||
// the customer is told the reason category, not what staff wrote about them.
|
||||
type DisputeNotice struct {
|
||||
AccountName string
|
||||
DisputeID string
|
||||
Reason string
|
||||
CloudNames []string
|
||||
SelfHosted []SelfHostedNotice
|
||||
DisputeEmail string
|
||||
DisputeBy time.Time
|
||||
}
|
||||
|
||||
// SelfHostedNotice names a self-hosted install and when its licence ends,
|
||||
// because that is the one thing a dispute cannot change for it.
|
||||
type SelfHostedNotice struct {
|
||||
Name string
|
||||
LicenceExpires time.Time
|
||||
}
|
||||
|
||||
// InstanceRows lists the affected instances in the shape the layout's "rows"
|
||||
// helper takes. A method rather than template logic, because a Go template
|
||||
// has no way to build a list of maps.
|
||||
func (n DisputeNotice) InstanceRows() []map[string]any {
|
||||
rows := make([]map[string]any, 0, len(n.CloudNames)+len(n.SelfHosted))
|
||||
for _, name := range n.CloudNames {
|
||||
rows = append(rows, map[string]any{"k": "Cloud", "v": name})
|
||||
}
|
||||
for _, s := range n.SelfHosted {
|
||||
rows = append(rows, map[string]any{
|
||||
"k": "Self-hosted",
|
||||
"v": s.Name + ", licence ends " + s.LicenceExpires.Format("2 January 2006"),
|
||||
})
|
||||
}
|
||||
return rows
|
||||
}
|
||||
|
||||
// SendAccountLocked tells the account a dispute has locked it, that nothing is
|
||||
// deleted, and how to dispute. Replies go to the dispute address.
|
||||
func (s Sender) SendAccountLocked(to string, n DisputeNotice) error {
|
||||
return s.sendTemplate(to, n.DisputeEmail, "accountlocked", n)
|
||||
}
|
||||
|
||||
// SendDisputeReminder repeats the dispute route shortly before the hold ends.
|
||||
func (s Sender) SendDisputeReminder(to string, n DisputeNotice) error {
|
||||
return s.sendTemplate(to, n.DisputeEmail, "disputereminder", n)
|
||||
}
|
||||
|
||||
// SendAccountTerminated states the outcome of a failed dispute.
|
||||
func (s Sender) SendAccountTerminated(to string, n DisputeNotice) error {
|
||||
return s.sendTemplate(to, n.DisputeEmail, "accountterminated", n)
|
||||
}
|
||||
|
||||
// SendAccountRestored states the outcome of an upheld dispute.
|
||||
func (s Sender) SendAccountRestored(to string, n DisputeNotice) error {
|
||||
return s.sendTemplate(to, "", "accountrestored", n)
|
||||
}
|
||||
Reference in New Issue
Block a user