/
sites.go
182 lines (163 loc) · 5.66 KB
/
sites.go
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package viewmodels
import (
"strconv"
"strings"
"github.com/apexskier/httpauth"
"github.com/turnkey-commerce/go-ping-sites/database"
"html/template"
)
// SitesEditViewModel holds the required information about the Sites to choose for editing.
// The PingIntervalSeconds and TimeoutSeconds are strings to allow the form validation.
type SitesEditViewModel struct {
SiteID int64 `valid:"-"`
Name string `valid:"ascii,required"`
IsActive bool `valid:"-"`
URL string `valid:"url,required"`
PingIntervalSeconds string `valid:"int,required"`
TimeoutSeconds string `valid:"int,required"`
ContentExpected string `valid:"-"`
ContentUnexpected string `valid:"-"`
SelectedContacts []int64 `valid:"-"`
SiteContacts []int64 `valid:"-"`
}
// SitesAllContactsViewModel has all of the sites available and carries whether
// the contact is part of the Site itself via the IsAssigned property
type SitesAllContactsViewModel struct {
ContactID int64
IsAssigned bool
Name string
EmailAddress string
SmsNumber string
SmsActive bool
EmailActive bool
}
// SiteContactsSelectedViewModel holds the selections when contacts are changed.
// The existing SiteContacts are also containd in SiteContats
type SiteContactsSelectedViewModel struct {
SiteID int64
SelectedContacts []int64
SiteContacts []int64
}
// SiteViewModel holds the view information for the site_edit.gohtml template
type SiteViewModel struct {
Errors map[string]string
Title string
Site SitesEditViewModel
Contacts []database.Contact
AllContacts []SitesAllContactsViewModel
Nav NavViewModel
CsrfField template.HTML
}
// GetSiteDetailsViewModel populates the items required by the site_details.gohtml view
func GetSiteDetailsViewModel(site *database.Site, isAuthenticated bool,
user httpauth.UserData) SiteViewModel {
nav := NavViewModel{
Active: "settings",
IsAuthenticated: isAuthenticated,
User: user,
}
result := SiteViewModel{
Title: "Go Ping Sites - Settings - Site Details",
Nav: nav,
}
siteVM := new(SitesEditViewModel)
MapSiteDBtoVM(site, siteVM)
result.Site = *siteVM
result.Contacts = site.Contacts
return result
}
// EditSiteViewModel populates the items required by the site_edit.gohtml view
func EditSiteViewModel(siteVM *SitesEditViewModel, allContacts database.Contacts,
isAuthenticated bool, user httpauth.UserData, errors map[string]string) SiteViewModel {
nav := NavViewModel{
Active: "settings",
IsAuthenticated: isAuthenticated,
User: user,
}
result := SiteViewModel{
Title: "Go Ping Sites - Settings - Edit Site",
Nav: nav,
Errors: errors,
}
result.Site = *siteVM
result.AllContacts = PopulateAllContactsVM(allContacts, siteVM.SelectedContacts)
return result
}
// NewSiteViewModel populates the items required by the site_new.gohtml view
func NewSiteViewModel(siteVM *SitesEditViewModel, allContacts database.Contacts,
isAuthenticated bool, user httpauth.UserData, errors map[string]string) SiteViewModel {
nav := NavViewModel{
Active: "settings",
IsAuthenticated: isAuthenticated,
User: user,
}
result := SiteViewModel{
Title: "Go Ping Sites - Settings - New Site",
Nav: nav,
Errors: errors,
}
result.Site = *siteVM
result.AllContacts = PopulateAllContactsVM(allContacts, siteVM.SelectedContacts)
return result
}
// MapSiteVMtoDB maps the site view model properties to the site database properties.
func MapSiteVMtoDB(siteVM *SitesEditViewModel, site *database.Site) error {
site.SiteID = siteVM.SiteID
site.Name = siteVM.Name
site.IsActive = siteVM.IsActive
site.URL = strings.TrimSpace(siteVM.URL)
site.ContentExpected = strings.TrimSpace(siteVM.ContentExpected)
site.ContentUnexpected = strings.TrimSpace(siteVM.ContentUnexpected)
// Conversion on these two is necessary because they are a string in the
// view model to allow the validation to work
pingInterval, err := strconv.Atoi(siteVM.PingIntervalSeconds)
if err != nil {
return err
}
site.PingIntervalSeconds = pingInterval
timeout, err := strconv.Atoi(siteVM.TimeoutSeconds)
if err != nil {
return err
}
site.TimeoutSeconds = timeout
return nil
}
// MapSiteDBtoVM maps the site database properties to the site view model properties.
func MapSiteDBtoVM(site *database.Site, siteVM *SitesEditViewModel) {
siteVM.SiteID = site.SiteID
siteVM.Name = site.Name
siteVM.IsActive = site.IsActive
siteVM.URL = site.URL
siteVM.ContentExpected = site.ContentExpected
siteVM.ContentUnexpected = site.ContentUnexpected
// Conversion on these two is necessary because they are a string in the
// view model to allow the validation to work
siteVM.PingIntervalSeconds = strconv.Itoa(site.PingIntervalSeconds)
siteVM.TimeoutSeconds = strconv.Itoa(site.TimeoutSeconds)
}
// PopulateAllContactsVM returns the view model for the contacts with the ones
// assigned to the site having IsAssigned set to true.
func PopulateAllContactsVM(allContacts database.Contacts,
siteContactIDs []int64) []SitesAllContactsViewModel {
var allContactsVM = []SitesAllContactsViewModel{}
for _, contact := range allContacts {
hasMatch := false
for _, siteContactID := range siteContactIDs {
if siteContactID == contact.ContactID {
hasMatch = true
break
}
}
contactVM := SitesAllContactsViewModel{
ContactID: contact.ContactID,
Name: contact.Name,
IsAssigned: hasMatch,
EmailAddress: contact.EmailAddress,
EmailActive: contact.EmailActive,
SmsNumber: contact.SmsNumber,
SmsActive: contact.SmsActive,
}
allContactsVM = append(allContactsVM, contactVM)
}
return allContactsVM
}