[TASK] [web] switch model url binding
This commit is contained in:
parent
69d05d28df
commit
4a08e44182
|
@ -7,7 +7,7 @@ import (
|
|||
"os"
|
||||
"text/template"
|
||||
|
||||
//"github.com/microcosm-cc/bluemonday"
|
||||
// "github.com/microcosm-cc/bluemonday"
|
||||
"github.com/russross/blackfriday"
|
||||
|
||||
liblog "dev.sum7.eu/sum7/warehost/lib/log"
|
||||
|
@ -62,7 +62,7 @@ func handlerfiles(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
func handlerfunc(w http.ResponseWriter, r *http.Request) {
|
||||
url := r.URL.Path[1:]
|
||||
url := web.FixPath(r.URL.Path[1:])
|
||||
logger := liblog.NewModulLog(r.Host).GetLog(r, url)
|
||||
website, err := getWebsite(r.Host)
|
||||
if err != nil {
|
||||
|
@ -73,43 +73,44 @@ func handlerfunc(w http.ResponseWriter, r *http.Request) {
|
|||
logger = logger.WithField("hID", website.ID)
|
||||
|
||||
var menus []*web.Menu
|
||||
dbconnection.Where("website = ?", website.ID).Preload("Menu").Order("position").Find(&menus)
|
||||
var menu *web.Menu
|
||||
for _, item := range menus {
|
||||
if item.Shorturl == "" && menu == nil {
|
||||
menu = item
|
||||
}
|
||||
if item.Shorturl == url {
|
||||
menu = item
|
||||
}
|
||||
}
|
||||
if menu.ID <= 0 {
|
||||
logger.Warn("menu not found")
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
menus = web.BuildMenuTree(menus)
|
||||
page := web.Page{WebsiteID: website.ID, MenuID: menu.ID}
|
||||
dbconnection.Where(&page).Find(&page)
|
||||
if page.ID <= 0 {
|
||||
logger.Warn("page not found")
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
page.Menu = menu
|
||||
dbconnection.Where("website = ?", website.ID).Preload("URL").Order("position").Find(&menus)
|
||||
|
||||
var urls []*web.URL
|
||||
dbconnection.Where("website = ?", website.ID).Find(&urls)
|
||||
var urlObj *web.URL
|
||||
for _, item := range urls {
|
||||
if item.Path == "" && urlObj == nil {
|
||||
urlObj = item
|
||||
}
|
||||
if item.Path == url {
|
||||
urlObj = item
|
||||
}
|
||||
}
|
||||
|
||||
menus = web.BuildMenuTree(menus)
|
||||
|
||||
page := web.Page{
|
||||
WebsiteID: website.ID,
|
||||
URLID: urlObj.ID,
|
||||
}
|
||||
dbconnection.Where(page).FirstOrInit(&page)
|
||||
if page.ID > 0 {
|
||||
unsafe := blackfriday.MarkdownCommon([]byte(page.Content))
|
||||
//page.Content = string(bluemonday.UGCPolicy().SanitizeBytes(unsafe))
|
||||
page.Content = string(unsafe)
|
||||
page.URL = urlObj
|
||||
}
|
||||
|
||||
unsafe := blackfriday.MarkdownCommon([]byte(page.Content))
|
||||
//page.Content = string(bluemonday.UGCPolicy().SanitizeBytes(unsafe))
|
||||
page.Content = string(unsafe)
|
||||
i := TemplateInfo{
|
||||
Website: website,
|
||||
Host: r.Host,
|
||||
URL: url,
|
||||
Page: &page,
|
||||
Menu: menus,
|
||||
Page: &page,
|
||||
}
|
||||
t, err := template.ParseGlob(fmt.Sprintf("%s/%d/%s/%s", config.Webroot, website.ID, "tmpl", "*.tmpl"))
|
||||
logger.Info("done")
|
||||
|
||||
if err != nil {
|
||||
w.Write([]byte(fmt.Sprintf("<h1>Error on rendering Template</h1>\n%s", err)))
|
||||
} else {
|
||||
|
|
|
@ -14,7 +14,7 @@ func menuTree(w http.ResponseWriter, r *http.Request) {
|
|||
ctx := r.Context()
|
||||
logger := log.GetLog(r, "menutree")
|
||||
var menus []*Menu
|
||||
dbconnection.Where("website = ?", ctx.Value("websiteid").(int64)).Order("position").Find(&menus)
|
||||
dbconnection.Where("website = ?", ctx.Value("websiteid").(int64)).Preload("URL").Order("position").Find(&menus)
|
||||
logger.Info("done")
|
||||
libapi.JSONWrite(w, r, BuildMenuTree(menus), nil)
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ func menuList(w http.ResponseWriter, r *http.Request) {
|
|||
ctx := r.Context()
|
||||
logger := log.GetLog(r, "menulist")
|
||||
var menus []*Menu
|
||||
dbconnection.Where("website = ?", ctx.Value("websiteid").(int64)).Order("position").Find(&menus)
|
||||
dbconnection.Where("website = ?", ctx.Value("websiteid").(int64)).Preload("URL").Order("position").Find(&menus)
|
||||
logger.Info("done")
|
||||
libapi.JSONWrite(w, r, menus, nil)
|
||||
}
|
||||
|
@ -41,9 +41,13 @@ func menuAdd(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
menuEntry.WebsiteID = ctx.Value("websiteid").(int64)
|
||||
if menuEntry.URL != nil {
|
||||
menuEntry.URLID = &menuEntry.URL.ID
|
||||
menuEntry.URL = nil
|
||||
}
|
||||
|
||||
if err := dbconnection.Create(&menuEntry).Error; err != nil {
|
||||
logger.Error("database: during create menu")
|
||||
logger.Error("database: during create menu: ", err)
|
||||
libapi.JSONWrite(w, r, false, &libapi.ErrorResult{Message: "Internal Database Error"})
|
||||
return
|
||||
}
|
||||
|
@ -71,8 +75,13 @@ func menuEdit(w http.ResponseWriter, r *http.Request) {
|
|||
menuEntry.WebsiteID = ctx.Value("websiteid").(int64)
|
||||
menuEntry.ID = menuid
|
||||
|
||||
if menuEntry.URL != nil {
|
||||
menuEntry.URLID = &menuEntry.URL.ID
|
||||
menuEntry.URL = nil
|
||||
}
|
||||
|
||||
if err := dbconnection.Save(menuEntry).Error; err != nil {
|
||||
logger.Error("database: during edit website menu entry")
|
||||
logger.Error("database: during edit website menu entry: ", err)
|
||||
libapi.JSONWrite(w, r, false, &libapi.ErrorResult{Message: "Internal Database Error"})
|
||||
return
|
||||
}
|
||||
|
@ -96,7 +105,7 @@ func menuDelete(w http.ResponseWriter, r *http.Request) {
|
|||
ID: menuid,
|
||||
}
|
||||
if err := dbconnection.Unscoped().Delete(menu).Error; err != nil {
|
||||
logger.Error("database: during delete website menu entry")
|
||||
logger.Error("database: during delete website menu entry: ", err)
|
||||
libapi.JSONWrite(w, r, false, &libapi.ErrorResult{Message: "Internal Database Error"})
|
||||
return
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ func pageList(w http.ResponseWriter, r *http.Request) {
|
|||
ctx := r.Context()
|
||||
logger := log.GetLog(r, "pagelist")
|
||||
var pages []*Page
|
||||
dbconnection.Where("website = ?", ctx.Value("websiteid").(int64)).Preload("Menu").Find(&pages)
|
||||
dbconnection.Where("website = ?", ctx.Value("websiteid").(int64)).Preload("URL").Find(&pages)
|
||||
logger.Info("done")
|
||||
libapi.JSONWrite(w, r, pages, nil)
|
||||
}
|
||||
|
@ -31,13 +31,11 @@ func pageAdd(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
page.WebsiteID = ctx.Value("websiteid").(int64)
|
||||
if menu := page.Menu; menu != nil {
|
||||
page.MenuID = page.Menu.ID
|
||||
page.Menu = nil
|
||||
}
|
||||
page.URL.WebsiteID = page.WebsiteID
|
||||
page.URL.Path = FixPath(page.URL.Path)
|
||||
|
||||
if err := dbconnection.Create(&page).Error; err != nil {
|
||||
logger.Error("database: during create page")
|
||||
logger.Error("database: during create page: ", err)
|
||||
libapi.JSONWrite(w, r, false, &libapi.ErrorResult{Message: "Internal Database Error"})
|
||||
return
|
||||
}
|
||||
|
@ -62,25 +60,35 @@ func pageEdit(w http.ResponseWriter, r *http.Request) {
|
|||
libapi.JSONWrite(w, r, false, returnerr)
|
||||
return
|
||||
}
|
||||
page.WebsiteID = ctx.Value("websiteid").(int64)
|
||||
page.ID = pageid
|
||||
if menu := page.Menu; menu != nil {
|
||||
page.MenuID = page.Menu.ID
|
||||
page.Menu = nil
|
||||
}
|
||||
|
||||
if err := dbconnection.Save(page).Error; err != nil {
|
||||
logger.Error("database: during delete website page")
|
||||
page.ID = pageid
|
||||
page.WebsiteID = ctx.Value("websiteid").(int64)
|
||||
page.URL.WebsiteID = page.WebsiteID
|
||||
page.URL.Path = FixPath(page.URL.Path)
|
||||
|
||||
tx := dbconnection.Begin()
|
||||
if err := tx.Save(page.URL).Error; err != nil {
|
||||
logger.Error("database: during save website url: ", err)
|
||||
libapi.JSONWrite(w, r, false, &libapi.ErrorResult{Message: "Internal Database Error"})
|
||||
return
|
||||
}
|
||||
|
||||
page.URLID = page.URL.ID
|
||||
page.URL = nil
|
||||
|
||||
if err := tx.Save(page).Error; err != nil {
|
||||
logger.Error("database: during save website page: ", err)
|
||||
libapi.JSONWrite(w, r, false, &libapi.ErrorResult{Message: "Internal Database Error"})
|
||||
return
|
||||
}
|
||||
tx.Commit()
|
||||
|
||||
logger.Info("done")
|
||||
libapi.JSONWrite(w, r, true, nil)
|
||||
}
|
||||
|
||||
// PageDelete to delete page
|
||||
func pageDelete(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
logger := log.GetLog(r, "pagedelete")
|
||||
pageid, err := strconv.ParseInt(pat.Param(r, "pageid"), 10, 64)
|
||||
if err != nil {
|
||||
|
@ -89,12 +97,11 @@ func pageDelete(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
logger = logger.WithField("id", pageid)
|
||||
page := &Page{
|
||||
WebsiteID: ctx.Value("websiteid").(int64),
|
||||
ID: pageid,
|
||||
}
|
||||
if err := dbconnection.Unscoped().Delete(page).Error; err != nil {
|
||||
logger.Error("database: during delete website page")
|
||||
page := &Page{}
|
||||
dbconnection.Where("id = ?", pageid).Preload("URL").First(page)
|
||||
|
||||
if err := dbconnection.Unscoped().Delete(page.URL).Error; err != nil {
|
||||
logger.Error("database: during delete website page: ", err)
|
||||
libapi.JSONWrite(w, r, false, &libapi.ErrorResult{Message: "Internal Database Error"})
|
||||
return
|
||||
}
|
||||
|
|
|
@ -3,8 +3,10 @@ package web
|
|||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"context"
|
||||
|
||||
"goji.io/pat"
|
||||
|
||||
libapi "dev.sum7.eu/sum7/warehost/lib/api"
|
||||
|
@ -12,6 +14,10 @@ import (
|
|||
libsystem "dev.sum7.eu/sum7/warehost/system"
|
||||
)
|
||||
|
||||
func FixPath(path string) string {
|
||||
return strings.ToLower(strings.Trim(path, "/ "))
|
||||
}
|
||||
|
||||
//InvolveWebsiteHandler for api function to Verifie User ist loggedin
|
||||
func InvolveWebsiteHandler(h libapi.Handle) libapi.Handle {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
|
|
|
@ -38,8 +38,9 @@ func (Manager) TableName() string { return "web_manager" }
|
|||
|
||||
// Media struct
|
||||
type Media struct {
|
||||
ID int64 `gorm:"primary_key"`
|
||||
WebsiteID int64 `sql:"type:bigint REFERENCES web_website(id) ON UPDATE CASCADE ON DELETE CASCADE;column:website;primary_key" json:"-"`
|
||||
Path string `gorm:"type:varchar(255);column:path;primary_key" json:"path"`
|
||||
Path string `gorm:"type:varchar(255);column:path" json:"path"`
|
||||
}
|
||||
|
||||
// TableName of struct
|
||||
|
@ -50,8 +51,9 @@ type Menu struct {
|
|||
ID int64 `gorm:"primary_key"`
|
||||
WebsiteID int64 `sql:"type:bigint REFERENCES web_website(id) ON UPDATE CASCADE ON DELETE CASCADE;column:website" json:"-"`
|
||||
Name string `gorm:"type:varchar(255);column:name" json:"name"`
|
||||
Shorturl string `gorm:"type:varchar(255);column:url" json:"url"`
|
||||
ParentID *int64 `sql:"type:bigint REFERENCES web_menu(id) ON UPDATE SET NULL ON DELETE SET NULL;column:menu" json:"parentid"`
|
||||
URLID *int64 `sql:"type:bigint REFERENCES web_url(id) ON UPDATE CASCADE ON DELETE SET NULL;column:url" json:"-"`
|
||||
URL *URL `gorm:"foreignkey:URL" json:"url"`
|
||||
Position int `sql:"type:int;column:position" json:"position"`
|
||||
Children []*Menu `json:"children"`
|
||||
}
|
||||
|
@ -59,12 +61,22 @@ type Menu struct {
|
|||
// TableName of struct
|
||||
func (Menu) TableName() string { return "web_menu" }
|
||||
|
||||
// URL struct
|
||||
type URL struct {
|
||||
ID int64 `gorm:"primary_key"`
|
||||
WebsiteID int64 `sql:"type:bigint REFERENCES web_website(id) ON UPDATE CASCADE ON DELETE CASCADE;column:website;unique_index:url_website_path" gorm:"unique_index:idx_url_website_path" json:"-"`
|
||||
Path string `gorm:"type:varchar(255);column:path;unique_index:idx_url_website_path" json:"path"`
|
||||
}
|
||||
|
||||
// TableName of struct
|
||||
func (URL) TableName() string { return "web_url" }
|
||||
|
||||
// Page struct
|
||||
type Page struct {
|
||||
ID int64 `gorm:"primary_key"`
|
||||
WebsiteID int64 `sql:"type:bigint REFERENCES web_website(id) ON UPDATE CASCADE ON DELETE CASCADE;column:website" json:"-"`
|
||||
MenuID int64 `sql:"type:bigint unique REFERENCES web_menu(id) ON UPDATE CASCADE ON DELETE CASCADE;column:menu" json:"-"`
|
||||
Menu *Menu `json:"menu"`
|
||||
URLID int64 `sql:"type:bigint unique REFERENCES web_url(id) ON UPDATE CASCADE ON DELETE CASCADE;column:url" json:"-"`
|
||||
URL *URL `gorm:"foreignkey:URL" json:"url"`
|
||||
Title string `gorm:"type:varchar(255);column:title" json:"title"`
|
||||
Content string `gorm:"type:text;column:content" json:"content"`
|
||||
}
|
||||
|
@ -99,5 +111,5 @@ func BuildMenuTree(items []*Menu) []*Menu {
|
|||
|
||||
// SyncModels to verify the database schema
|
||||
func SyncModels(dbconnection *gorm.DB) {
|
||||
dbconnection.AutoMigrate(&Website{}, &Domain{}, &Manager{}, &Media{}, &Menu{}, &Page{})
|
||||
dbconnection.AutoMigrate(&Website{}, &Domain{}, &Manager{}, &URL{}, &Media{}, &Menu{}, &Page{})
|
||||
}
|
||||
|
|
Reference in New Issue