notify.moe/arn/Joinable.go

54 lines
996 B
Go

package arn
import (
"github.com/aerogo/aero"
"github.com/aerogo/api"
)
// Joinable is an object where users can join and leave.
type Joinable interface {
Join(*User) error
Leave(*User) error
Save()
}
// JoinAction returns an API action that lets the user join the object.
func JoinAction() *api.Action {
return &api.Action{
Name: "join",
Route: "/join",
Run: func(obj interface{}, ctx aero.Context) error {
user := GetUserFromContext(ctx)
joinable := obj.(Joinable)
err := joinable.Join(user)
if err != nil {
return err
}
joinable.Save()
return nil
},
}
}
// LeaveAction returns an API action that unpublishes the object.
func LeaveAction() *api.Action {
return &api.Action{
Name: "leave",
Route: "/leave",
Run: func(obj interface{}, ctx aero.Context) error {
user := GetUserFromContext(ctx)
joinable := obj.(Joinable)
err := joinable.Leave(user)
if err != nil {
return err
}
joinable.Save()
return nil
},
}
}