132 lines
2.2 KiB
Go
132 lines
2.2 KiB
Go
|
package arn
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"reflect"
|
||
|
|
||
|
"github.com/aerogo/aero"
|
||
|
"github.com/aerogo/api"
|
||
|
)
|
||
|
|
||
|
// Publishable ...
|
||
|
type Publishable interface {
|
||
|
Publish() error
|
||
|
Unpublish() error
|
||
|
Save()
|
||
|
GetID() string
|
||
|
GetCreatedBy() string
|
||
|
GetIsDraft() bool
|
||
|
SetIsDraft(bool)
|
||
|
}
|
||
|
|
||
|
// PublishAction returns an API action that publishes the object.
|
||
|
func PublishAction() *api.Action {
|
||
|
return &api.Action{
|
||
|
Name: "publish",
|
||
|
Route: "/publish",
|
||
|
Run: func(obj interface{}, ctx aero.Context) error {
|
||
|
draft := obj.(Publishable)
|
||
|
err := draft.Publish()
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
draft.Save()
|
||
|
return nil
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// UnpublishAction returns an API action that unpublishes the object.
|
||
|
func UnpublishAction() *api.Action {
|
||
|
return &api.Action{
|
||
|
Name: "unpublish",
|
||
|
Route: "/unpublish",
|
||
|
Run: func(obj interface{}, ctx aero.Context) error {
|
||
|
draft := obj.(Publishable)
|
||
|
err := draft.Unpublish()
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
draft.Save()
|
||
|
return nil
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// publish is the generic publish function.
|
||
|
func publish(draft Publishable) error {
|
||
|
// No draft
|
||
|
if !draft.GetIsDraft() {
|
||
|
return errors.New("Not a draft")
|
||
|
}
|
||
|
|
||
|
// Get object type
|
||
|
typ := reflect.TypeOf(draft)
|
||
|
|
||
|
if typ.Kind() == reflect.Ptr {
|
||
|
typ = typ.Elem()
|
||
|
}
|
||
|
|
||
|
// Get draft index
|
||
|
draftIndex, err := GetDraftIndex(draft.GetCreatedBy())
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
currentDraftID, _ := draftIndex.GetID(typ.Name())
|
||
|
|
||
|
if currentDraftID != draft.GetID() {
|
||
|
return errors.New(typ.Name() + " draft doesn't exist in the user draft index")
|
||
|
}
|
||
|
|
||
|
// Publish the object
|
||
|
draft.SetIsDraft(false)
|
||
|
err = draftIndex.SetID(typ.Name(), "")
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
draftIndex.Save()
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// unpublish turns the object back into a draft.
|
||
|
func unpublish(draft Publishable) error {
|
||
|
// Get object type
|
||
|
typ := reflect.TypeOf(draft)
|
||
|
|
||
|
if typ.Kind() == reflect.Ptr {
|
||
|
typ = typ.Elem()
|
||
|
}
|
||
|
|
||
|
// Get draft index
|
||
|
draftIndex, err := GetDraftIndex(draft.GetCreatedBy())
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
draftIndexID, _ := draftIndex.GetID(typ.Name())
|
||
|
|
||
|
if draftIndexID != "" {
|
||
|
return errors.New("You still have an unfinished draft")
|
||
|
}
|
||
|
|
||
|
draft.SetIsDraft(true)
|
||
|
err = draftIndex.SetID(typ.Name(), draft.GetID())
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
draftIndex.Save()
|
||
|
return nil
|
||
|
}
|