diff --git a/README.md b/README.md index e9511a5..1cd0010 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,17 @@ ``` ALTER TABLE login ALTER createat TYPE timestamptz; ALTER TABLE login ALTER lastloginat TYPE timestamptz; + + +BEGIN; +insert into host_web_webaccess (web,login) (select id,unnest(httpaccess) from host_web); +ALTER TABLE host_web DROP httpaccess; + +insert into host_web_ftpaccess (web,login) (select id,unnest(ftp) from host_web); +ALTER TABLE host_web DROP ftp; + +insert into host_mail_forward (mail,"to") (select id,unnest(forward) from host_mail); +ALTER TABLE host_mail DROP forward; +COMMIT; + ``` diff --git a/modul/host/apimail.go b/modul/host/apimail.go index c6d4323..5dc9e81 100644 --- a/modul/host/apimail.go +++ b/modul/host/apimail.go @@ -24,9 +24,9 @@ func getMail(ctx context.Context, w http.ResponseWriter) (mail Mail, returnerr * return } if login.Superadmin { - dbconnection.Where("id = ?", id).Find(&mail) + dbconnection.Where("id = ?", id).Preload("Forwards").Find(&mail) } else { - dbconnection.Where(map[string]int64{"ID": id, "domain.profil": profil.ID}).Find(&mail) + dbconnection.Where(map[string]int64{"ID": id, "domain.profil": profil.ID}).Preload("Forwards").Find(&mail) } if mail.ID <= 0 { returnerr = &libapi.ErrorResult{Fields: []string{"mail"}, Message: "not found"} @@ -44,7 +44,7 @@ func mailList(ctx context.Context, w http.ResponseWriter, r *http.Request) (retu logger.Info("not found") return } - dbconnection.Where("domain = ?", domain.ID).Preload("Domain").Find(&mail) + dbconnection.Where("domain = ?", domain.ID).Preload("Domain").Preload("Forwards").Find(&mail) logger.Info("done") returndata = mail return @@ -69,8 +69,8 @@ func mailAdd(ctx context.Context, w http.ResponseWriter, r *http.Request) (retur mail := &Mail{ DomainID: domain.ID, Name: mailRequest.Name, - //Forward: mailRequest.Forward, - LoginID: mailRequest.LoginID, + Forwards: mailRequest.Forwards, + LoginID: mailRequest.LoginID, } if err := dbconnection.Create(mail).Error; err != nil { @@ -105,7 +105,7 @@ func mailEdit(ctx context.Context, w http.ResponseWriter, r *http.Request) (retu } mail.Name = mailRequest.Name - //mail.Forward = mailRequest.Forward + mail.Forwards = mailRequest.Forwards mail.LoginID = mailRequest.LoginID if err := dbconnection.Save(mail).Error; err != nil { diff --git a/modul/host/apiweb.go b/modul/host/apiweb.go index 943aeaa..7667e5d 100644 --- a/modul/host/apiweb.go +++ b/modul/host/apiweb.go @@ -24,9 +24,9 @@ func getWeb(ctx context.Context, w http.ResponseWriter) (web Web, returnerr *lib return } if login.Superadmin { - dbconnection.Where("id = ?", id).Find(&web) + dbconnection.Where("id = ?", id).Preload("WebAccess.Login").Preload("FTPAccess.Login").Find(&web) } else { - dbconnection.Where(map[string]int64{"ID": id, "domain.profil": profil.ID}).Find(&web) + dbconnection.Where(map[string]int64{"ID": id, "domain.profil": profil.ID}).Preload("WebAccess.Login").Preload("FTPAccess.Login").Find(&web) } if web.ID <= 0 { returnerr = &libapi.ErrorResult{Fields: []string{"web"}, Message: "not found"} @@ -44,7 +44,7 @@ func webList(ctx context.Context, w http.ResponseWriter, r *http.Request) (retur logger.Info("not found") return } - dbconnection.Where("domain = ?", domain.ID).Preload("Domain").Find(&web) + dbconnection.Where("domain = ?", domain.ID).Preload("Domain").Preload("WebAccess.Login").Preload("FTPAccess.Login").Find(&web) logger.Info("done") returndata = web return @@ -74,8 +74,8 @@ func webAdd(ctx context.Context, w http.ResponseWriter, r *http.Request) (return SSLRedirect: webRequest.SSLRedirect, Redirect: webRequest.Redirect, Proxy: webRequest.Proxy, - //FTP: webRequest.FTP, - //HTTPAccess: webRequest.HTTPAccess, + FTPAccess: webRequest.FTPAccess, + WebAccess: webRequest.WebAccess, } if err := dbconnection.Create(web).Error; err != nil { @@ -115,8 +115,8 @@ func webEdit(ctx context.Context, w http.ResponseWriter, r *http.Request) (retur web.SSLRedirect = webRequest.SSLRedirect web.Redirect = webRequest.Redirect web.Proxy = webRequest.Proxy - //web.FTP = webRequest.FTP - //web.HTTPAccess = webRequest.HTTPAccess + web.FTPAccess = webRequest.FTPAccess + web.WebAccess = webRequest.WebAccess if err := dbconnection.Save(web).Error; err != nil { logger.Error("database: during modify host web: ", err) diff --git a/modul/host/models.go b/modul/host/models.go index 994d0b6..4b75fa0 100644 --- a/modul/host/models.go +++ b/modul/host/models.go @@ -1,8 +1,6 @@ package host import ( - "database/sql" - "github.com/jinzhu/gorm" "dev.sum7.eu/sum7/warehost/system" @@ -37,34 +35,67 @@ func (Domain) TableName() string { return "host_domain" } // Web struct type Web struct { ID int64 - DomainID int64 `sql:"type:bigint NOT NULL REFERENCES host_domain(id) ON UPDATE CASCADE ON DELETE CASCADE;column:domain" json:"-"` - Domain *Domain `gorm:"foreignkey:Domain;unique_index:idx_host_domain_web" json:"domain"` - Subdomain string `sql:"type:varchar(255);column:subdomain" gorm:"unique_index:idx_host_domain_web" json:"subdomain"` - PHP bool `sql:"default:false;column:php" json:"php"` - SSL bool `sql:"default:true;column:ssl" json:"ssl"` - SSLRedirect bool `sql:"default:false;column:sslredirect" json:"sslredirect"` - Redirect string `sql:"type:varchar(255);column:redirect" json:"redirect"` - Proxy string `sql:"type:varchar(255);column:proxy" json:"proxy"` - //FTP []int64 `sql:"type:bigint[];column:ftp" json:"ftp"` - //HTTPAccess []int64 `sql:"type:bigint[];column:httpaccess" json:"httpaccess"` + DomainID int64 `sql:"type:bigint NOT NULL REFERENCES host_domain(id) ON UPDATE CASCADE ON DELETE CASCADE;column:domain" json:"-"` + Domain *Domain `gorm:"foreignkey:Domain;unique_index:idx_host_domain_web" json:"domain"` + Subdomain string `sql:"type:varchar(255);column:subdomain" gorm:"unique_index:idx_host_domain_web" json:"subdomain"` + PHP bool `sql:"default:false;column:php" json:"php"` + SSL bool `sql:"default:true;column:ssl" json:"ssl"` + SSLRedirect bool `sql:"default:false;column:sslredirect" json:"sslredirect"` + Redirect string `sql:"type:varchar(255);column:redirect" json:"redirect"` + Proxy string `sql:"type:varchar(255);column:proxy" json:"proxy"` + FTPAccess []*FTPAccess `json:"ftpaccess"` + WebAccess []*WebAccess `json:"webaccess"` } // TableName of struct func (Web) TableName() string { return "host_web" } +// FTPAccess is a Object which user has access by ftp on the data of this website +type FTPAccess struct { + WebID int64 `sql:"type:bigint NOT NULL REFERENCES host_web(id) ON UPDATE CASCADE ON DELETE CASCADE;column:web" json:"-"` + Web *Web `gorm:"foreignkey:Web;unique_index:idx_host_domain_ftp_access" json:"web"` + LoginID int64 `sql:"type:bigint NOT NULL REFERENCES login(id) ON UPDATE CASCADE ON DELETE CASCADE;column:login" json:"-"` + Login *system.Login `gorm:"foreignkey:Login;unique_index:idx_host_domain_ftp_access" json:"login"` +} + +// TableName of struct +func (FTPAccess) TableName() string { return "host_web_ftpaccess" } + +// WebAccess is a Object which user has access by httpaccess on the data of this website +type WebAccess struct { + WebID int64 `sql:"type:bigint NOT NULL REFERENCES host_web(id) ON UPDATE CASCADE ON DELETE CASCADE;column:web" json:"-"` + Web *Web `gorm:"foreignkey:Web;unique_index:idx_host_domain_web_access" json:"web"` + LoginID int64 `sql:"type:bigint NOT NULL REFERENCES login(id) ON UPDATE CASCADE ON DELETE CASCADE;column:login" json:"-"` + Login *system.Login `gorm:"foreignkey:Login;unique_index:idx_host_domain_web_access" json:"login"` +} + +// TableName of struct +func (WebAccess) TableName() string { return "host_web_webaccess" } + // Mail struct type Mail struct { ID int64 - DomainID int64 `sql:"type:bigint NOT NULL REFERENCES host_domain(id) ON UPDATE CASCADE ON DELETE CASCADE;column:domain" json:"-"` - Domain *Domain `gorm:"foreignkey:Domain;unique_index:idx_host_domain_mail" json:"domain"` - Name string `sql:"type:varchar(255);column:name" gorm:"unique_index:idx_host_domain_mail" json:"name"` - //Forward []string `sql:"type:varchar(255)[];column:forward" json:"forward"` - LoginID sql.NullInt64 `sql:"type:bigint NULL REFERENCES login(id) ON UPDATE CASCADE ON DELETE CASCADE;column:login" json:"login"` + DomainID int64 `sql:"type:bigint NOT NULL REFERENCES host_domain(id) ON UPDATE CASCADE ON DELETE CASCADE;column:domain" json:"-"` + Domain *Domain `gorm:"foreignkey:Domain;unique_index:idx_host_domain_mail" json:"domain"` + Name string `sql:"type:varchar(255);column:name" gorm:"unique_index:idx_host_domain_mail" json:"name"` + Forwards []*MailForward `json:"forwards"` + LoginID *int64 `sql:"type:bigint NULL REFERENCES login(id) ON UPDATE CASCADE ON DELETE CASCADE;column:login" json:"login"` } // TableName of struct func (Mail) TableName() string { return "host_mail" } +// MailForward is a Object on with address a copy of the mail should be send +type MailForward struct { + ID int64 + MailID int64 `sql:"type:bigint NOT NULL REFERENCES host_mail(id) ON UPDATE CASCADE ON DELETE CASCADE;column:mail" json:"-"` + Mail *Mail `gorm:"foreignkey:Mail;unique_index:idx_host_domain_mail_forward" json:"mail"` + To string `sql:"type:varchar(255);column:to" gorm:"unique_index:idx_host_domain_mail_forward" json:"to"` +} + +// TableName of struct +func (MailForward) TableName() string { return "host_mail_forward" } + // Database struct type Database struct { ID int64 @@ -79,5 +110,5 @@ func (Database) TableName() string { return "host_database" } // SyncModels to verify the database schema func SyncModels(dbconnection *gorm.DB) { - dbconnection.AutoMigrate(&Profil{}, &Domain{}, &Web{}, &Mail{}, &Database{}) + dbconnection.AutoMigrate(&Profil{}, &Domain{}, &Web{}, &WebAccess{}, &FTPAccess{}, &Mail{}, &MailForward{}, &Database{}) } diff --git a/modul/web/apimenu.go b/modul/web/apimenu.go index 4fb4166..6afeb64 100644 --- a/modul/web/apimenu.go +++ b/modul/web/apimenu.go @@ -74,7 +74,7 @@ func menuEdit(ctx context.Context, w http.ResponseWriter, r *http.Request) (retu menuEntry.ID = menuid if err := dbconnection.Save(menuEntry).Error; err != nil { - logger.Error("database: during delete website menu entry") + logger.Error("database: during edit website menu entry") returnerr = &libapi.ErrorResult{Message: "Internal Database Error"} return } diff --git a/modul/web/models.go b/modul/web/models.go index 7d1fcf7..52005c0 100644 --- a/modul/web/models.go +++ b/modul/web/models.go @@ -1,7 +1,6 @@ package web import ( - "database/sql" "github.com/jinzhu/gorm" system "dev.sum7.eu/sum7/warehost/system" @@ -48,13 +47,13 @@ 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"` - Shorturl string `gorm:"type:varchar(255);column:url" json:"url"` - ParentID sql.NullInt64 `sql:"type:bigint REFERENCES web_menu(id) ON UPDATE SET NULL ON DELETE SET NULL;column:menu" json:"parentid"` - Position int `sql:"type:int;column:position" json:"position"` - Children []*Menu `json:"children"` + 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"` + Position int `sql:"type:int;column:position" json:"position"` + Children []*Menu `json:"children"` } // TableName of struct @@ -86,13 +85,13 @@ func BuildMenuTree(items []*Menu) []*Menu { menumap[item.ID] = item menumap[item.ID].Children = tmp } - if !item.ParentID.Valid { + if item.ParentID == nil { menuexit = append(menuexit, item) } else { - if menumap[item.ParentID.Int64] == nil { - menumap[item.ParentID.Int64] = &Menu{ID: -1} + if menumap[*item.ParentID] == nil { + menumap[*item.ParentID] = &Menu{ID: -1} } - menumap[item.ParentID.Int64].Children = append(menumap[item.ParentID.Int64].Children, item) + menumap[*item.ParentID].Children = append(menumap[*item.ParentID].Children, item) } } return menuexit