130 lines
3.1 KiB
Go
130 lines
3.1 KiB
Go
package events
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/kirsle/blog/internal/log"
|
|
"github.com/kirsle/blog/internal/render"
|
|
"github.com/kirsle/blog/internal/responses"
|
|
"github.com/kirsle/blog/models/contacts"
|
|
"github.com/kirsle/blog/models/events"
|
|
)
|
|
|
|
func inviteHandler(w http.ResponseWriter, r *http.Request) {
|
|
params := mux.Vars(r)
|
|
id, err := strconv.Atoi(params["id"])
|
|
if err != nil {
|
|
responses.FlashAndRedirect(w, r, "/e/admin/", "Invalid ID")
|
|
return
|
|
}
|
|
|
|
// Load the event from its ID.
|
|
event, err := events.Load(id)
|
|
if err != nil {
|
|
responses.FlashAndRedirect(w, r, "/e/admin/", "Can't load event: %s", err)
|
|
return
|
|
}
|
|
|
|
// Handle POST requests.
|
|
if r.Method == http.MethodPost {
|
|
action := r.FormValue("action")
|
|
|
|
switch action {
|
|
case "new-contact":
|
|
c := contacts.NewContact()
|
|
c.ParseForm(r)
|
|
err = c.Validate()
|
|
if err != nil {
|
|
responses.FlashAndReload(w, r, "Validation error: %s", err)
|
|
return
|
|
}
|
|
|
|
err = contacts.Add(&c)
|
|
if err != nil {
|
|
responses.FlashAndReload(w, r, "Error when saving address book: %s", err)
|
|
return
|
|
}
|
|
|
|
err = event.InviteContactID(c.ID)
|
|
if err != nil {
|
|
responses.Flash(w, r, "Error: couldn't invite contact: %s", err)
|
|
}
|
|
|
|
responses.FlashAndReload(w, r, "Added %s to the address book and added to invite list!", c.Name())
|
|
return
|
|
case "send-invite":
|
|
log.Error("Send Invite!")
|
|
r.ParseForm()
|
|
contactIDs, ok := r.Form["invite"]
|
|
if !ok {
|
|
responses.Error(w, r, "Missing: invite (list of IDs)")
|
|
return
|
|
}
|
|
|
|
// Invite all the users.
|
|
var warnings []string
|
|
for _, strID := range contactIDs {
|
|
id, _ := strconv.Atoi(strID)
|
|
err = event.InviteContactID(id)
|
|
log.Debug("Inviting contact ID %d: err=%s", id, err)
|
|
if err != nil {
|
|
warnings = append(warnings, err.Error())
|
|
}
|
|
}
|
|
if len(warnings) > 0 {
|
|
responses.Flash(w, r, "Warnings: %s", strings.Join(warnings, "; "))
|
|
}
|
|
responses.FlashAndReload(w, r, "Invites sent!")
|
|
return
|
|
case "revoke-invite":
|
|
idx, _ := strconv.Atoi(r.FormValue("index"))
|
|
err := event.Uninvite(idx)
|
|
if err != nil {
|
|
responses.FlashAndReload(w, r, "Error deleting the invite: %s", err)
|
|
return
|
|
}
|
|
responses.FlashAndReload(w, r, "Invite revoked!")
|
|
return
|
|
case "notify":
|
|
// Notify all the invited users!
|
|
for _, rsvp := range event.RSVP {
|
|
if !rsvp.Notified || true {
|
|
log.Info("Notify RSVP %s about Event %s", rsvp.GetName(), event.Title)
|
|
notifyUser(event, rsvp)
|
|
}
|
|
}
|
|
responses.FlashAndReload(w, r, "Notification emails and SMS messages sent out!")
|
|
return
|
|
}
|
|
}
|
|
|
|
invited := event.RSVP
|
|
if err != nil {
|
|
log.Error("error getting event.Invited: %s", err)
|
|
}
|
|
|
|
// Map the invited user IDs.
|
|
invitedMap := map[int]bool{}
|
|
for _, rsvp := range invited {
|
|
if rsvp.ContactID != 0 {
|
|
invitedMap[rsvp.ContactID] = true
|
|
}
|
|
}
|
|
|
|
allContacts, err := contacts.All()
|
|
if err != nil {
|
|
log.Error("contacts.All() error: %s", err)
|
|
}
|
|
|
|
v := map[string]interface{}{
|
|
"event": event,
|
|
"invited": invited,
|
|
"invitedMap": invitedMap,
|
|
"contacts": allContacts,
|
|
}
|
|
render.Template(w, r, "events/invite", v)
|
|
}
|