summaryrefslogtreecommitdiff
path: root/actions.go
blob: a8e78fbe2554f773e00047477918f78e7fc81670 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main

import (
	"bytes"
	"fmt"
	"github.com/Masterminds/sprig"
	"os"
	"text/template"
	"gopkg.in/gomail.v2"
)

type templateBody string

func buildMail(templateName string, context interface{}) (mailText *bytes.Buffer, err error) {
	t, err := template.New(templateName).Funcs(
		sprig.GenericFuncMap()).ParseFiles(fmt.Sprintf("templates/%s", templateName))
	if err != nil {
		return
	}

	mailText = bytes.NewBufferString("")
	t.Execute(mailText, context)

	return
}

func CreateMotion(decision *Decision, voter *Voter) (err error) {
	decision.ProponentId = voter.Id
	err = decision.Create()
	if err != nil {
		logger.Println("Error saving motion:", err)
		return
	}

	type mailContext struct {
		Decision
		Name       string
		VoteURL    string
		UnvotedURL string
	}
	voteURL := fmt.Sprintf("%s/vote", config.BaseURL)
	unvotedURL := fmt.Sprintf("%s/motions/?unvoted=1", config.BaseURL)
	context := mailContext{*decision, voter.Name, voteURL, unvotedURL}

	mailText, err := buildMail("create_motion_mail.txt", context)
	if err != nil {
		logger.Println("Error", err)
		return
	}

	m := gomail.NewMessage()
	m.SetHeader("From", config.NoticeSenderAddress)
	m.SetHeader("To", config.BoardMailAddress)
	m.SetHeader("Subject", fmt.Sprintf("%s - %s", decision.Tag, decision.Title))
	m.SetHeader("Message-ID", fmt.Sprintf("<%s>", decision.Tag))
	m.SetBody("text/plain", mailText.String())

	d := gomail.NewDialer(config.MailServer.Host, config.MailServer.Port, "", "")
	if err := d.DialAndSend(m); err != nil {
		logger.Println("Error sending mail", err)
	}

	return
}

func UpdateMotion(decision *Decision, voter *Voter) (err error) {
	err = decision.Update()
	if err != nil {
		logger.Println("Error updating motion:", err)
		return
	}

	type mailContext struct {
		Decision
		Name       string
		VoteURL    string
		UnvotedURL string
	}
	voteURL := fmt.Sprintf("%s/vote", config.BaseURL)
	unvotedURL := fmt.Sprintf("%s/motions/?unvoted=1", config.BaseURL)
	context := mailContext{*decision, voter.Name, voteURL, unvotedURL}

	mailText, err := buildMail("update_motion_mail.txt", context)
	if err != nil {
		logger.Println("Error", err)
		return
	}

	m := gomail.NewMessage()
	m.SetHeader("From", config.NoticeSenderAddress)
	m.SetHeader("To", config.BoardMailAddress)
	m.SetHeader("Subject", fmt.Sprintf("%s - %s", decision.Tag, decision.Title))
	m.SetHeader("References", fmt.Sprintf("<%s>", decision.Tag))
	m.SetBody("text/plain", mailText.String())

	d := gomail.NewDialer(config.MailServer.Host, config.MailServer.Port, "", "")
	if err := d.DialAndSend(m); err != nil {
		logger.Println("Error sending mail", err)
	}

	return
}

func WithdrawMotion(decision *Decision, voter *Voter) (err error) {
	// load template, fill name, tag, title, content
	type mailContext struct {
		*Decision
		Name      string
		Sender    string
		Recipient string
	}
	context := mailContext{decision, voter.Name, config.NoticeSenderAddress, config.BoardMailAddress}

	// fill withdraw_mail.txt
	t, err := template.New("withdraw_mail.txt").Funcs(
		sprig.GenericFuncMap()).ParseFiles("templates/withdraw_mail.txt")
	if err != nil {
		logger.Fatal(err)
	}
	// TODO: send mail
	t.Execute(os.Stdout, context)

	// TODO: implement call decision.Close()
	return
}