Skip to content

Commit

Permalink
Use options pattern for notification rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
ahobsonsayers committed Oct 9, 2024
1 parent aa07a83 commit 261cc3a
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 26 deletions.
4 changes: 1 addition & 3 deletions cmd/twitchets/notification/gotify.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@ type GotifyClient struct {
var _ Client = GotifyClient{}

func (g GotifyClient) SendTicketNotification(ticket twickets.Ticket) error {
notificationMessage, err := RenderMessage(ticket, &RenderMessageConfig{
IncludeFooter: true,
})
notificationMessage, err := RenderMessage(ticket, WithFooter())
if err != nil {
return err
}
Expand Down
48 changes: 34 additions & 14 deletions cmd/twitchets/notification/notification.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,37 @@ type MessageTemplateData struct {
Link string
}

type RenderMessageConfig struct {
// Whether to include event name
IncludeHeader bool
type renderMessageConfig struct {
includeHeader bool
includeFooter bool
}

func (c *renderMessageConfig) applyOptions(options ...RenderMessageOption) {
for _, option := range options {
option(c)
}
}

type RenderMessageOption func(*renderMessageConfig)

// Whether to include buy link
IncludeFooter bool
// Whether to include event name header in message
func WithHeader() RenderMessageOption {
return func(o *renderMessageConfig) {
o.includeHeader = true
}
}

func RenderMessage(ticket twickets.Ticket, config *RenderMessageConfig) (string, error) {
// Whether to include buy link footer in message
func WithFooter() RenderMessageOption {
return func(o *renderMessageConfig) {
o.includeFooter = true
}
}

func RenderMessage(ticket twickets.Ticket, options ...RenderMessageOption) (string, error) {
config := &renderMessageConfig{}
config.applyOptions(options...)

templateData := MessageTemplateData{
Date: ticket.Event.Date.Format("Monday 2 January 2006"),
Time: ticket.Event.Time.Format("3:04pm"),
Expand All @@ -73,15 +95,13 @@ func RenderMessage(ticket twickets.Ticket, config *RenderMessageConfig) (string,
Discount: ticket.Discount(),
}

// add optional header and footers
if config != nil {
if config.IncludeHeader {
templateData.Event = ticket.Event.Name
}
// Add optional header and footers
if config.includeHeader {
templateData.Event = ticket.Event.Name
}

if config.IncludeFooter {
templateData.Link = ticket.Link()
}
if config.includeFooter {
templateData.Link = ticket.Link()
}

var buffer bytes.Buffer
Expand Down
11 changes: 6 additions & 5 deletions cmd/twitchets/notification/notification_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func TestRenderMessage(t *testing.T) {
expectedMessage := string(expectedMessageBytes)

tickets := testNotificationTicket()
actualMessage, err := notification.RenderMessage(tickets, nil)
actualMessage, err := notification.RenderMessage(tickets)
require.NoError(t, err)

require.Equal(t, expectedMessage, actualMessage)
Expand All @@ -63,10 +63,11 @@ func TestRenderMessageWithHeaderAndFooter(t *testing.T) {
expectedMessage := string(expectedMessageBytes)

tickets := testNotificationTicket()
actualMessage, err := notification.RenderMessage(tickets, &notification.RenderMessageConfig{
IncludeHeader: true,
IncludeFooter: true,
})
actualMessage, err := notification.RenderMessage(
tickets,
notification.WithHeader(),
notification.WithFooter(),
)
require.NoError(t, err)

require.Equal(t, expectedMessage, actualMessage)
Expand Down
5 changes: 1 addition & 4 deletions cmd/twitchets/notification/telegram.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@ type TelegramClient struct {
var _ Client = TelegramClient{}

func (c TelegramClient) SendTicketNotification(ticket twickets.Ticket) error {
messageBody, err := RenderMessage(ticket, &RenderMessageConfig{
IncludeHeader: true,
IncludeFooter: true,
})
messageBody, err := RenderMessage(ticket, WithHeader(), WithFooter())
if err != nil {
return err
}
Expand Down

0 comments on commit 261cc3a

Please sign in to comment.