mirror of https://github.com/mikkolehtisalo/iw.git
148 lines
4.8 KiB
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}")
|
|
}
|