186 lines
7.1 KiB
Go
186 lines
7.1 KiB
Go
package web
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/jinzhu/gorm"
|
|
|
|
system "dev.sum7.eu/sum7/warehost/system"
|
|
)
|
|
|
|
// Website struct
|
|
type Website struct {
|
|
ID int64
|
|
Name string `gorm:"type:varchar(255);column:name" json:"name"`
|
|
Domains []Domain `gorm:"foreignkey:Domain" json:"domains"`
|
|
}
|
|
|
|
// TableName of struct
|
|
func (Website) TableName() string { return "web_website" }
|
|
|
|
// Domain struct
|
|
type Domain struct {
|
|
WebsiteID int64 `sql:"type:bigint REFERENCES web_website(id) ON UPDATE CASCADE ON DELETE CASCADE;column:website;primary_key"`
|
|
Name string `gorm:"type:varchar(255);unique;column:name;primary_key" json:"name"`
|
|
}
|
|
|
|
// TableName of struct
|
|
func (Domain) TableName() string { return "web_domain" }
|
|
|
|
// Manager struct
|
|
type Manager struct {
|
|
LoginID int64 `sql:"type:bigint REFERENCES login(id) ON UPDATE CASCADE ON DELETE CASCADE;column:login;primary_key" json:"-"`
|
|
Login system.Login `gorm:"foreignkey:Login" json:"login"`
|
|
WebsiteID int64 `sql:"type:bigint REFERENCES web_website(id) ON UPDATE CASCADE ON DELETE CASCADE;column:website;primary_key" json:"-"`
|
|
Website Website `gorm:"foreignkey:Website" json:"website"`
|
|
}
|
|
|
|
// TableName of struct
|
|
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;unique_index:media_website_path" json:"-"`
|
|
Path string `gorm:"type:varchar(255);column:path;unique_index:media_website_path" json:"path"`
|
|
}
|
|
|
|
// TableName of struct
|
|
func (Media) TableName() string { return "web_media" }
|
|
|
|
// Menu struct
|
|
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"`
|
|
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"`
|
|
}
|
|
|
|
// 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:"-"`
|
|
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"`
|
|
}
|
|
|
|
// TableName of struct
|
|
func (Page) TableName() string { return "web_page" }
|
|
|
|
// PostURLType of URL Schema on a blog
|
|
type PostURLType int
|
|
|
|
const (
|
|
// PostURLDate http(s)://DOMAIN/url/year/month/day/posttitle
|
|
PostURLDate = 0
|
|
// PostURLTitle http(s)://DOMAIN/url/posttitle
|
|
PostURLTitle = 1
|
|
)
|
|
|
|
// Blog struct
|
|
type Blog struct {
|
|
ID int64 `gorm:"primary_key"`
|
|
WebsiteID int64 `sql:"type:bigint REFERENCES web_website(id) ON UPDATE CASCADE ON DELETE CASCADE;column:website" json:"-"`
|
|
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"`
|
|
PostURL PostURLType `sql:"type:int;column:posturl" json:"posturl"`
|
|
PreviewEnable bool `gorm:"column:preview_enable" json:"preview_enable"`
|
|
AuthorEnable bool `gorm:"column:author_enable" json:"author_enable"`
|
|
CreateAtEnable bool `gorm:"column:createat_enable" json:"createat_enable"`
|
|
TimerangeEnable bool `gorm:"column:timerange_enable" json:"timerange_enable"`
|
|
Title string `gorm:"type:varchar(255);column:title" json:"title"`
|
|
Content string `gorm:"type:text;column:content" json:"content"`
|
|
Posts []*BlogPost `gorm:"foreignkey:Blog" json:"posts"`
|
|
}
|
|
|
|
// TableName of struct
|
|
func (Blog) TableName() string { return "web_blog" }
|
|
|
|
// BlogPost struct
|
|
type BlogPost struct {
|
|
ID int64 `gorm:"primary_key"`
|
|
BlogID int64 `sql:"type:bigint REFERENCES web_blog(id) ON UPDATE CASCADE ON DELETE CASCADE;column:blog" json:"-"`
|
|
Blog *Blog `json:"blog"`
|
|
CreateAt time.Time `sql:"default:current_timestamp" gorm:"column:createat" json:"createat"`
|
|
Author string `gorm:"type:varchar(255);column:author" json:"author"`
|
|
Title string `gorm:"type:varchar(255);column:title" json:"title"`
|
|
Location string `gorm:"type:varchar(255);column:location" json:"location"`
|
|
Start time.Time `gorm:"column:start" json:"start"`
|
|
End time.Time `gorm:"column:end" json:"end"`
|
|
Link string `gorm:"type:varchar(255);column:link" json:"link"`
|
|
PreviewID *int64 `sql:"type:bigint REFERENCES web_media(id) ON UPDATE CASCADE ON DELETE SET NULL;column:preview" json:"-"`
|
|
Preview *Media `gorm:"foreignkey:Media" json:"preview"`
|
|
Summary string `gorm:"type:text;column:summary" json:"summary"`
|
|
Content string `gorm:"type:text;column:content" json:"content"`
|
|
}
|
|
|
|
func (bg *BlogPost) GetURL() string {
|
|
var parts []string
|
|
if blog := bg.Blog; blog != nil {
|
|
parts = append(parts, blog.URL.Path)
|
|
if blog.PostURL == 1 {
|
|
month := strconv.Itoa(int(bg.CreateAt.Month()))
|
|
if len(month) == 1 {
|
|
month = "0" + month
|
|
}
|
|
parts = append(parts, strconv.Itoa(bg.CreateAt.Year()), month)
|
|
}
|
|
}
|
|
parts = append(parts, bg.Title)
|
|
return "/" + FixPath(strings.Join(parts, "/"))
|
|
}
|
|
|
|
// TableName of struct
|
|
func (BlogPost) TableName() string { return "web_blogpost" }
|
|
|
|
// BuildMenuTree format a array of Menu to a Tree of Menu (with Children)
|
|
func BuildMenuTree(items []*Menu) []*Menu {
|
|
menumap := make(map[int64]*Menu)
|
|
var menuexit []*Menu
|
|
for _, item := range items {
|
|
if menumap[item.ID] == nil {
|
|
menumap[item.ID] = item
|
|
}
|
|
if menumap[item.ID].ID == -1 {
|
|
tmp := menumap[item.ID].Children
|
|
menumap[item.ID] = item
|
|
menumap[item.ID].Children = tmp
|
|
}
|
|
if item.ParentID == nil {
|
|
menuexit = append(menuexit, item)
|
|
} else {
|
|
if menumap[*item.ParentID] == nil {
|
|
menumap[*item.ParentID] = &Menu{ID: -1}
|
|
}
|
|
menumap[*item.ParentID].Children = append(menumap[*item.ParentID].Children, item)
|
|
}
|
|
}
|
|
return menuexit
|
|
}
|
|
|
|
// SyncModels to verify the database schema
|
|
func SyncModels(dbconnection *gorm.DB) {
|
|
dbconnection.AutoMigrate(&Website{}, &Domain{}, &Manager{}, &URL{}, &Media{}, &Menu{}, &Page{}, &Blog{}, &BlogPost{})
|
|
}
|