reCoreD-UI/controllers/domain.go

147 lines
2.9 KiB
Go
Raw Normal View History

2024-04-03 09:05:12 +00:00
package controllers
import (
2024-04-03 14:37:15 +00:00
"fmt"
2024-04-09 08:28:18 +00:00
"reCoreD-UI/database"
2024-04-03 09:05:12 +00:00
"reCoreD-UI/models"
"strconv"
dns "github.com/cloud66-oss/coredns_mysql"
)
2024-04-09 08:28:18 +00:00
type domainsDAO struct {
2024-04-11 02:51:50 +00:00
database.BaseDAO[models.IDomain]
2024-04-09 08:28:18 +00:00
}
func CreateDomain(d *models.Domain) (*models.Domain, error) {
nss, err := GetDNS()
2024-04-03 14:37:15 +00:00
if err != nil {
2024-04-07 05:08:30 +00:00
return nil, err
2024-04-03 14:37:15 +00:00
}
2024-04-09 08:28:18 +00:00
tx := database.Client.Begin()
2024-04-11 02:51:50 +00:00
if _, err := (domainsDAO{}).Create(tx, d); err != nil {
2024-04-09 08:28:18 +00:00
tx.Rollback()
return nil, err
}
2024-04-03 09:05:12 +00:00
2024-04-09 13:16:19 +00:00
r := &models.Record[dns.SOARecord]{}
2024-04-09 08:28:18 +00:00
r.Zone = d.WithDotEnd()
r.Name = "@"
r.RecordType = models.RecordTypeSOA
2024-04-09 13:16:19 +00:00
r.Content = d.GenerateSOA()
2024-04-09 08:28:18 +00:00
if err := r.CheckZone(); err != nil {
tx.Rollback()
return nil, err
}
2024-04-03 09:05:12 +00:00
2024-04-09 13:16:19 +00:00
if _, err := (recordsDAO{}).Create(tx, r); err != nil {
2024-04-09 08:28:18 +00:00
tx.Rollback()
return nil, err
}
2024-04-03 09:05:12 +00:00
2024-04-09 08:28:18 +00:00
for i, ns := range nss {
2024-04-09 13:16:19 +00:00
record := &models.Record[dns.NSRecord]{
Zone: d.WithDotEnd(),
RecordType: models.RecordTypeSOA,
Name: fmt.Sprintf("ns%d", i+1),
}
2024-04-09 08:28:18 +00:00
record.Content.Host = ns
2024-04-03 14:37:15 +00:00
2024-04-09 13:16:19 +00:00
if _, err := (recordsDAO{}).Create(tx, record); err != nil {
2024-04-09 08:28:18 +00:00
tx.Rollback()
return nil, err
2024-04-03 14:37:15 +00:00
}
2024-04-07 05:08:30 +00:00
}
2024-04-11 02:51:50 +00:00
return d, tx.Commit().Error
2024-04-03 09:05:12 +00:00
}
2024-04-09 08:28:18 +00:00
func GetDomains(domain string) ([]models.Domain, error) {
2024-04-03 09:05:12 +00:00
if domain != "" {
2024-04-11 02:51:50 +00:00
r, err := (domainsDAO{}).GetAll(database.Client, models.Domain{DomainName: domain})
n := make([]models.Domain, 0)
for _, e := range r {
n = append(n, e.(models.Domain))
}
return n, err
2024-04-09 08:28:18 +00:00
} else {
2024-04-11 02:51:50 +00:00
r, err := (domainsDAO{}).GetAll(database.Client, models.Domain{})
n := make([]models.Domain, 0)
for _, e := range r {
n = append(n, e.(models.Domain))
}
return n, err
2024-04-03 09:05:12 +00:00
}
}
2024-04-09 08:28:18 +00:00
func UpdateDomain(d *models.Domain) error {
tx := database.Client.Begin()
2024-04-11 02:51:50 +00:00
if _, err := (domainsDAO{}).Update(tx, d); err != nil {
2024-04-09 08:28:18 +00:00
tx.Rollback()
return err
}
2024-04-03 09:05:12 +00:00
2024-04-09 13:16:19 +00:00
soa, err := (recordsDAO{}).GetOne(tx, &models.Record[models.RecordContentDefault]{
2024-04-09 08:28:18 +00:00
RecordType: models.RecordTypeSOA, Zone: d.WithDotEnd(),
})
if err != nil {
tx.Rollback()
return err
}
2024-04-03 09:05:12 +00:00
2024-04-09 13:16:19 +00:00
r := &models.Record[dns.SOARecord]{}
if err := r.FromEntity(soa); err != nil {
2024-04-09 08:28:18 +00:00
tx.Rollback()
return err
}
2024-04-03 09:05:12 +00:00
2024-04-09 13:16:19 +00:00
r.Content = d.GenerateSOA()
2024-04-09 08:28:18 +00:00
if err := r.CheckZone(); err != nil {
tx.Rollback()
return err
}
2024-04-03 09:05:12 +00:00
2024-04-09 13:16:19 +00:00
if _, err := (recordsDAO{}).Update(tx, r); err != nil {
2024-04-09 08:28:18 +00:00
tx.Rollback()
return err
}
2024-04-09 02:16:06 +00:00
2024-04-11 02:51:50 +00:00
return tx.Commit().Error
2024-04-03 09:05:12 +00:00
}
2024-04-09 08:28:18 +00:00
func DeleteDomain(id string) error {
2024-04-03 09:05:12 +00:00
ID, err := strconv.Atoi(id)
if err != nil {
return err
}
2024-04-09 08:28:18 +00:00
tx := database.Client.Begin()
domain, err := (domainsDAO{}).GetOne(tx, models.Domain{ID: ID})
if err != nil {
tx.Rollback()
return err
}
2024-04-03 09:05:12 +00:00
2024-04-09 08:28:18 +00:00
if err := (domainsDAO{}).Delete(tx, models.Domain{ID: ID}); err != nil {
tx.Rollback()
return err
}
2024-04-03 09:05:12 +00:00
2024-04-09 13:16:19 +00:00
if err := (recordsDAO{}).Delete(tx, &models.Record[models.RecordContentDefault]{Zone: domain.WithDotEnd()}); err != nil {
2024-04-09 08:28:18 +00:00
tx.Rollback()
return err
}
2024-04-03 09:05:12 +00:00
2024-04-11 02:51:50 +00:00
return tx.Commit().Error
2024-04-03 09:05:12 +00:00
}
2024-04-07 02:07:26 +00:00
2024-04-09 08:28:18 +00:00
// for metrics
func getDomainCounts() (float64, error) {
c, err := (domainsDAO{}).GetAll(database.Client, models.Domain{})
if err != nil {
2024-04-07 02:07:26 +00:00
return 0, err
}
2024-04-09 08:28:18 +00:00
return float64(len(c)), nil
2024-04-07 02:07:26 +00:00
}