diff options
author | Steve Manuel <nilslice@gmail.com> | 2017-03-15 13:24:25 -0700 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2017-03-15 13:24:25 -0700 |
commit | 95c7e73e2b8acf048ba61b3feab76dd5f46ac955 (patch) | |
tree | 54b025fc6ae9eb7d1adea71f33ec6d05ae50b3db /examples/externalable/content/song.go | |
parent | 40a7be1cb8218e705d77965f61c2c948e23971b9 (diff) |
adding deleteable example, rename and modify externalable -> createable
Diffstat (limited to 'examples/externalable/content/song.go')
-rw-r--r-- | examples/externalable/content/song.go | 165 |
1 files changed, 0 insertions, 165 deletions
diff --git a/examples/externalable/content/song.go b/examples/externalable/content/song.go deleted file mode 100644 index f2b1b73..0000000 --- a/examples/externalable/content/song.go +++ /dev/null @@ -1,165 +0,0 @@ -package content - -import ( - "fmt" - "log" - - "net/http" - - "github.com/ponzu-cms/ponzu/management/editor" - "github.com/ponzu-cms/ponzu/system/admin/user" - "github.com/ponzu-cms/ponzu/system/item" -) - -type Song struct { - item.Item - - Title string `json:"title"` - Artist string `json:"artist"` - Rating int `json:"rating"` - Opinion string `json:"opinion"` - SpotifyURL string `json:"spotify_url"` -} - -// MarshalEditor writes a buffer of html to edit a Song within the CMS -// and implements editor.Editable -func (s *Song) MarshalEditor() ([]byte, error) { - view, err := editor.Form(s, - // Take note that the first argument to these Input-like functions - // is the string version of each Song field, and must follow - // this pattern for auto-decoding and auto-encoding reasons: - editor.Field{ - View: editor.Input("Title", s, map[string]string{ - "label": "Title", - "type": "text", - "placeholder": "Enter the Title here", - }), - }, - editor.Field{ - View: editor.Input("Artist", s, map[string]string{ - "label": "Artist", - "type": "text", - "placeholder": "Enter the Artist here", - }), - }, - editor.Field{ - View: editor.Input("Rating", s, map[string]string{ - "label": "Rating", - "type": "text", - "placeholder": "Enter the Rating here", - }), - }, - editor.Field{ - View: editor.Richtext("Opinion", s, map[string]string{ - "label": "Opinion", - "placeholder": "Enter the Opinion here", - }), - }, - editor.Field{ - View: editor.Input("SpotifyURL", s, map[string]string{ - "label": "SpotifyURL", - "type": "text", - "placeholder": "Enter the SpotifyURL here", - }), - }, - ) - - if err != nil { - return nil, fmt.Errorf("Failed to render Song editor view: %s", err.Error()) - } - - return view, nil -} - -func init() { - item.Types["Song"] = func() interface{} { return new(Song) } -} - -// String defines the display name of a Song in the CMS list-view -func (s *Song) String() string { return s.Title } - -// Accept implements api.Externalable, and allows external POST requests from clients -// to add content as long as the request contains the json tag names of the Song -// struct fields, and is multipart encoded -func (s *Song) Accept(res http.ResponseWriter, req *http.Request) error { - // do form data validation for required fields - required := []string{ - "title", - "artist", - "rating", - "opinion", - "spotify_url", - } - - for _, r := range required { - if req.PostFormValue(r) == "" { - err := fmt.Errorf("request missing required field: %s", r) - return err - } - } - - return nil -} - -// BeforeAccept is only called if the Song type implements api.Externalable -// It is called before Accept, and returning an error will cancel the request -// causing the system to reject the data sent in the POST -func (s *Song) BeforeAccept(res http.ResponseWriter, req *http.Request) error { - // do initial user authentication here on the request, checking for a - // token or cookie, or that certain form fields are set and valid - - // for example, this will check if the request was made by a CMS admin user: - if !user.IsValid(req) { - addr := req.RemoteAddr - err := fmt.Errorf("request rejected, invalid user. IP: %s", addr) - return err - } - - // you could then to data validation on the request post form, or do it in - // the Accept method, which is called after BeforeAccept - - return nil -} - -// AfterAccept is called after Accept, and is useful for logging or triggering -// notifications, etc. after the data is saved to the database, etc. -// The request has a context containing the databse 'target' affected by the -// request. Ex. Song__pending:3 or Song:8 depending if Song implements api.Trustable -func (s *Song) AfterAccept(res http.ResponseWriter, req *http.Request) error { - addr := req.RemoteAddr - log.Println("Song sent by:", addr, "titled:", req.PostFormValue("title")) - - return nil -} - -// Approve implements editor.Mergeable, which enables content supplied by external -// clients to be approved and thus added to the public content API. Before content -// is approved, it is waiting in the Pending bucket, and can only be approved in -// the CMS if the Mergeable interface is satisfied. If not, you will not see this -// content show up in the CMS. -func (s *Song) Approve(res http.ResponseWriter, req *http.Request) error { - return nil -} - -/* - NOTICE: if AutoApprove (seen below) is implemented, the Approve method above will have no - effect, except to add the Public / Pending toggle in the CMS UI. Though, no - Song content would be in Pending, since all externally submitting Song data - is immediately approved. -*/ - -// AutoApprove implements api.Trustable, and will automatically approve content -// that has been submitted by an external client via api.Externalable. Be careful -// when using AutoApprove, because content will immediately be available through -// your public content API. If the Trustable interface is satisfied, the AfterApprove -// method is bypassed. The -func (s *Song) AutoApprove(res http.ResponseWriter, req *http.Request) error { - // Use AutoApprove to check for trust-specific headers or whitelisted IPs, - // etc. Remember, you will not be able to Approve or Reject content that - // is auto-approved. You could add a field to Song, i.e. - // AutoApproved bool `json:auto_approved` - // and set that data here, as it is called before the content is saved, but - // after the BeforeSave hook. - - return nil -} |