104 lines
2.3 KiB
Go
104 lines
2.3 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
|
|
}
|
|
|
|
// Get the address book.
|
|
addr, _ := contacts.Load()
|
|
|
|
// 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
|
|
}
|
|
|
|
addr.Add(c)
|
|
err = addr.Save()
|
|
if err != nil {
|
|
responses.FlashAndReload(w, r, "Error when saving address book: %s", err)
|
|
return
|
|
}
|
|
|
|
responses.FlashAndReload(w, r, "Added %s to the address book!", 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)
|
|
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
|
|
}
|
|
}
|
|
|
|
invited, err := event.Invited()
|
|
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
|
|
}
|
|
}
|
|
|
|
v := map[string]interface{}{
|
|
"event": event,
|
|
"invited": invited,
|
|
"invitedMap": invitedMap,
|
|
"contacts": addr,
|
|
}
|
|
render.Template(w, r, "events/invite", v)
|
|
}
|