blog/models/events/invites.go

97 lines
2.5 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.
ID int `json:"id"`
ContactID int `json:"contactId"`
EventID int `json:"eventId"`
Contact contacts.Contact `json:"-" gorm:"save_associations:false"` // 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"`
}
// GetName of the user in the RSVP (from the contact or the anonymous name).
func (r RSVP) GetName() string {
if r.Contact.Name() != "" {
return r.Contact.Name()
}
return r.Name
}
// GetEmail gets the user's email (from the contact or the anonymous email).
func (r RSVP) GetEmail() string {
if r.Contact.Email != "" {
return r.Contact.Email
}
return r.Email
}
// GetSMS gets the user's SMS number (from the contact or the anonymous sms).
func (r RSVP) GetSMS() string {
if r.Contact.SMS != "" {
return r.Contact.SMS
}
return r.SMS
}
// Save the RSVP.
func (r RSVP) Save() error {
r.Updated = time.Now().UTC()
return DB.Save(&r).Error
}
// 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")
}
}
rsvp := &RSVP{
ContactID: id,
EventID: ev.ID,
Status: StatusInvited,
Created: time.Now().UTC(),
Updated: time.Now().UTC(),
}
return DB.Save(&rsvp).Error
}
// Uninvite removes an RSVP.
func (ev Event) Uninvite(id int) error {
var rsvp RSVP
err := DB.First(&rsvp, id).Error
if err != nil {
return err
}
fmt.Printf("UNIVNITE: we have rsvp=%+v", rsvp)
return DB.Model(&ev).Association("RSVP").Delete(rsvp).Error
}