iw/app/controllers/wiki.go

148 lines
4.8 KiB
Go

package controllers
import (
"github.com/revel/revel"
"iw/app/models"
"encoding/json"
. "github.com/mikkolehtisalo/revel/common"
"github.com/mikkolehtisalo/revel/acl"
)
type Wikis struct {
*revel.Controller
}
// CREATE
func (c Wikis) Create(wiki string) revel.Result {
revel.TRACE.Printf("Wikis Create(): %+v", wiki)
// Make sure the id at least looks like one
if !IsUUID(wiki) {
revel.ERROR.Printf("Garbage wiki %+v received from %+v", wiki, c.Session["username"])
return c.RenderText("{\"success\":false}")
}
// Make sure the wiki doesn't pre-exist
exists_test := models.GetWiki(wiki)
if exists_test.Wiki_id == wiki {
revel.ERROR.Printf("Attempt to rewrite pre-existing wiki %+v by user %+v", wiki, c.Session["username"])
return c.RenderText("{\"success\":false}")
}
// Decode wiki from input json
var new_wiki models.Wiki
decoder := json.NewDecoder(c.Request.Body)
err := decoder.Decode(&new_wiki)
if err != nil {
revel.ERROR.Printf("Unable to parse wiki %+v: %+v", wiki, err)
return c.RenderText("{\"success\":false}")
}
// ID fields must match!
if new_wiki.Wiki_id != wiki {
revel.ERROR.Printf("Wiki id mismatch %+v != %+v", new_wiki.Wiki_id, wiki)
return c.RenderText("{\"success\":false}")
}
// Validate fields
new_wiki.Validate(c.Validation)
if c.Validation.HasErrors() {
revel.ERROR.Printf("Validation errors parsing wiki %+v: %+v", wiki, c.Validation.ErrorMap())
return c.RenderText("{\"success\":false}")
}
// Make user the author has admin access right by default
AddUserToACLList(c.Session["username"], &new_wiki.Adminacl)
// Save the wiki
new_wiki.Create_user = c.Session["username"]
new_wiki.Status = "ACTIVE"
new_wiki.Save(true)
revel.INFO.Printf("User %+v created wiki %+v: %+v", c.Session["username"], new_wiki.Wiki_id, new_wiki.Title )
return c.RenderText("{\"success\":true}")
}
// READ
func (c Wikis) Read() revel.Result {
revel.TRACE.Printf("Wikis Read()")
wikis := models.ListWikis()
filtered := acl.Filter(c.Args, []string{"read","write","admin"}, wikis, false)
revel.TRACE.Printf("Wikis Read() returning: %+v", filtered)
return c.RenderJson(filtered)
}
// UPDATE
func (c Wikis) Update(wiki string) revel.Result {
revel.TRACE.Printf("Wikis Update(): %s", wiki)
// Make sure the id at least looks like one
if !IsUUID(wiki) {
revel.ERROR.Printf("Garbage wiki %+v received from %+v", wiki, c.Session["username"])
return c.RenderText("{\"success\":false}")
}
// Make sure the wiki exists
exists_test := models.GetWiki(wiki)
if exists_test.Wiki_id != wiki {
revel.ERROR.Printf("Attempt to update non-existing wiki %+v by user %+v", wiki, c.Session["username"])
return c.RenderText("{\"success\":false}")
}
// Decode the wiki from input
var new_wiki models.Wiki
decoder := json.NewDecoder(c.Request.Body)
err := decoder.Decode(&new_wiki)
if err != nil {
revel.ERROR.Printf("Unable to parse wiki %+v: %+v", wiki, err)
return c.RenderText("{\"success\":false}")
}
// ID fields must match!
if new_wiki.Wiki_id != wiki {
revel.ERROR.Printf("Wiki id mismatch %+v != %+v", new_wiki.Wiki_id, wiki)
return c.RenderText("{\"success\":false}")
}
// Validate fields
new_wiki.Validate(c.Validation)
if c.Validation.HasErrors() {
revel.ERROR.Printf("Validation errors: %+v", c.Validation.ErrorMap())
return c.RenderText("{\"success\":false}")
}
// Make sure the user has rights to modify the wiki
filtered := acl.Filter(c.Args, []string{"admin","write"}, []models.Wiki{exists_test}, false)
if len(filtered) != 1 {
revel.ERROR.Printf("Attempt to update wiki without access rights: %+v: %+v, user: %+v", exists_test.Wiki_id, exists_test.Title, c.Session["username"])
return c.RenderText("{\"success\":false}")
}
new_wiki.Status = "ACTIVE"
new_wiki.Create_user = c.Session["username"]
new_wiki.Save(true)
revel.INFO.Printf("User %+v updated wiki %+v: %+v", c.Session["username"], new_wiki.Wiki_id, new_wiki.Title )
return c.RenderText("{\"success\":true}")
}
// DELETE
func (c Wikis) Delete(wiki string) revel.Result {
revel.TRACE.Printf("Wikis Delete(): %s", wiki)
wi := models.GetWiki(wiki)
filtered := acl.Filter(c.Args, []string{"admin"}, []models.Wiki{wi}, false)
// Delete everything that survived filtering
for _, w := range filtered {
// Will also do other house cleaning
w.(models.Wiki).Delete(c.Session["username"])
revel.INFO.Printf("User %+v deleted wiki %+v: %+v", c.Session["username"], w.(models.Wiki).Wiki_id, w.(models.Wiki).Title)
}
return c.RenderText("{\"success\":true}")
}