71 lines
1.9 KiB
Go
71 lines
1.9 KiB
Go
package events
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/kirsle/blog/models/contacts"
|
|
)
|
|
|
|
// RSVP status constants.
|
|
const (
|
|
StatusInvited = "invited"
|
|
StatusGoing = "going"
|
|
StatusMaybe = "maybe"
|
|
StatusNotGoing = "not going"
|
|
)
|
|
|
|
// RSVP tracks invitations and confirmations to events.
|
|
type RSVP struct {
|
|
// If the user was invited by an admin, they will have a ContactID and
|
|
// not much else. Users who signed up themselves from an OpenSignup event
|
|
// will have the metadata filled in instead.
|
|
ContactID int `json:"contactId"`
|
|
Contact *contacts.Contact `json:"-"` // rel table not serialized to JSON
|
|
Status string `json:"status"` // invited, going, maybe, not going
|
|
Notified bool `json:"notified"`
|
|
Name string `json:"name,omitempty"`
|
|
Email string `json:"email,omitempty"`
|
|
SMS string `json:"sms,omitempty"`
|
|
Created time.Time `json:"created"`
|
|
Updated time.Time `json:"updated"`
|
|
}
|
|
|
|
// InviteContactID enters an invitation for a contact ID.
|
|
func (ev *Event) InviteContactID(id int) error {
|
|
// Make sure the ID isn't already in the list.
|
|
for _, rsvp := range ev.RSVP {
|
|
if rsvp.ContactID != 0 && rsvp.ContactID == id {
|
|
return errors.New("already invited")
|
|
}
|
|
}
|
|
|
|
ev.RSVP = append(ev.RSVP, RSVP{
|
|
ContactID: id,
|
|
Status: StatusInvited,
|
|
Created: time.Now().UTC(),
|
|
Updated: time.Now().UTC(),
|
|
})
|
|
return ev.Save()
|
|
}
|
|
|
|
// Invited returns the RSVPs with Contact objects injected for contacts.
|
|
func (ev *Event) Invited() ([]RSVP, error) {
|
|
cl, _ := contacts.Load()
|
|
result := []RSVP{}
|
|
for _, rsvp := range ev.RSVP {
|
|
if rsvp.ContactID != 0 {
|
|
fmt.Printf("cid: %d\n", rsvp.ContactID)
|
|
c, err := cl.GetID(rsvp.ContactID)
|
|
if err != nil {
|
|
fmt.Printf("event.Invited error: %s", err)
|
|
}
|
|
rsvp.Contact = c
|
|
}
|
|
result = append(result, rsvp)
|
|
}
|
|
|
|
return result, nil
|
|
}
|