Added arn to the main repository
This commit is contained in:
78
arn/Likeable.go
Normal file
78
arn/Likeable.go
Normal file
@ -0,0 +1,78 @@
|
||||
package arn
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
|
||||
"github.com/aerogo/aero"
|
||||
"github.com/aerogo/api"
|
||||
)
|
||||
|
||||
// Likeable ...
|
||||
type Likeable interface {
|
||||
Like(userID UserID)
|
||||
Unlike(userID UserID)
|
||||
LikedBy(userID UserID) bool
|
||||
CountLikes() int
|
||||
Link() string
|
||||
Save()
|
||||
}
|
||||
|
||||
// LikeEventReceiver ...
|
||||
type LikeEventReceiver interface {
|
||||
OnLike(user *User)
|
||||
}
|
||||
|
||||
// LikeAction ...
|
||||
func LikeAction() *api.Action {
|
||||
return &api.Action{
|
||||
Name: "like",
|
||||
Route: "/like",
|
||||
Run: func(obj interface{}, ctx aero.Context) error {
|
||||
field := reflect.ValueOf(obj).Elem().FieldByName("IsDraft")
|
||||
|
||||
if field.IsValid() && field.Bool() {
|
||||
return errors.New("Drafts need to be published before they can be liked")
|
||||
}
|
||||
|
||||
likeable := obj.(Likeable)
|
||||
user := GetUserFromContext(ctx)
|
||||
|
||||
if user == nil {
|
||||
return errors.New("Not logged in")
|
||||
}
|
||||
|
||||
likeable.Like(user.ID)
|
||||
|
||||
// Call OnLike if the object implements it
|
||||
receiver, ok := likeable.(LikeEventReceiver)
|
||||
|
||||
if ok {
|
||||
receiver.OnLike(user)
|
||||
}
|
||||
|
||||
likeable.Save()
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// UnlikeAction ...
|
||||
func UnlikeAction() *api.Action {
|
||||
return &api.Action{
|
||||
Name: "unlike",
|
||||
Route: "/unlike",
|
||||
Run: func(obj interface{}, ctx aero.Context) error {
|
||||
likeable := obj.(Likeable)
|
||||
user := GetUserFromContext(ctx)
|
||||
|
||||
if user == nil {
|
||||
return errors.New("Not logged in")
|
||||
}
|
||||
|
||||
likeable.Unlike(user.ID)
|
||||
likeable.Save()
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user