func (controller *sitesController) newPost(rw http.ResponseWriter, req *http.Request) (int, error) { err := req.ParseForm() if err != nil { return http.StatusInternalServerError, err } decoder := schema.NewDecoder() // Ignore unknown keys to prevent errors from the CSRF token. decoder.IgnoreUnknownKeys(true) formSite := new(viewmodels.SitesEditViewModel) err = decoder.Decode(formSite, req.PostForm) if err != nil { return http.StatusInternalServerError, err } valErrors := validateSiteForm(formSite) if len(valErrors) > 0 { isAuthenticated, user := getCurrentUser(rw, req, controller.authorizer) var contacts database.Contacts err = contacts.GetContacts(controller.DB) if err != nil { return http.StatusInternalServerError, err } vm := viewmodels.NewSiteViewModel(formSite, contacts, isAuthenticated, user, valErrors) vm.CsrfField = csrf.TemplateField(req) return http.StatusOK, controller.newTemplate.Execute(rw, vm) } site := database.Site{} viewmodels.MapSiteVMtoDB(formSite, &site) err = site.CreateSite(controller.DB) if err != nil { return http.StatusInternalServerError, err } //Add any selected contacts for _, contactSelID := range formSite.SelectedContacts { err = site.AddContactToSite(controller.DB, contactSelID) if err != nil { return http.StatusInternalServerError, err } } // Refresh the pinger with the changes. err = controller.pinger.UpdateSiteSettings() if err != nil { return http.StatusInternalServerError, err } http.Redirect(rw, req, "/settings", http.StatusSeeOther) return http.StatusSeeOther, nil }
func (controller *sitesController) editPost(rw http.ResponseWriter, req *http.Request) (int, error) { err := req.ParseForm() if err != nil { return http.StatusInternalServerError, err } decoder := schema.NewDecoder() // Ignore unknown keys to prevent errors from the CSRF token. decoder.IgnoreUnknownKeys(true) formSite := new(viewmodels.SitesEditViewModel) err = decoder.Decode(formSite, req.PostForm) if err != nil { return http.StatusInternalServerError, err } valErrors := validateSiteForm(formSite) if len(valErrors) > 0 { isAuthenticated, user := getCurrentUser(rw, req, controller.authorizer) var contacts database.Contacts err = contacts.GetContacts(controller.DB) if err != nil { return http.StatusInternalServerError, err } vm := viewmodels.EditSiteViewModel(formSite, contacts, isAuthenticated, user, valErrors) vm.CsrfField = csrf.TemplateField(req) return http.StatusOK, controller.editTemplate.Execute(rw, vm) } // Get the site to edit site := new(database.Site) err = site.GetSite(controller.DB, formSite.SiteID) if err != nil { return http.StatusInternalServerError, err } err = viewmodels.MapSiteVMtoDB(formSite, site) if err != nil { return http.StatusInternalServerError, err } err = site.UpdateSite(controller.DB) if err != nil { return http.StatusInternalServerError, err } //Loop selected ones first and if it's not already in the site then add it. for _, contactSelID := range formSite.SelectedContacts { if !int64InSlice(int64(contactSelID), formSite.SiteContacts) { err = site.AddContactToSite(controller.DB, contactSelID) if err != nil { return http.StatusInternalServerError, err } } } // Loop existing site contacts and if it's not in the selected items then remove it. for _, contactSiteID := range formSite.SiteContacts { if !int64InSlice(int64(contactSiteID), formSite.SelectedContacts) { err = site.RemoveContactFromSite(controller.DB, contactSiteID) if err != nil { return http.StatusInternalServerError, err } } } // Refresh the pinger with the changes. err = controller.pinger.UpdateSiteSettings() if err != nil { return http.StatusInternalServerError, err } http.Redirect(rw, req, "/settings", http.StatusSeeOther) return http.StatusSeeOther, nil }