model with generics done

This commit is contained in:
Sense T
2024-04-09 21:16:19 +08:00
parent 7dd3af3707
commit 9752e7d9ae
10 changed files with 109 additions and 91 deletions

View File

@@ -25,34 +25,30 @@ func CreateDomain(d *models.Domain) (*models.Domain, error) {
return nil, err
}
r := &models.RecordWithType[dns.SOARecord]{}
r := &models.Record[dns.SOARecord]{}
r.Zone = d.WithDotEnd()
r.Name = "@"
r.RecordType = models.RecordTypeSOA
r.Content.Ns = d.MainDNS
r.Content.MBox = d.EmailSOAForamt()
r.Content.Refresh = d.RefreshInterval
r.Content.Retry = d.RetryInterval
r.Content.Expire = d.ExpiryPeriod
r.Content.MinTtl = d.NegativeTtl
r.Content = d.GenerateSOA()
if err := r.CheckZone(); err != nil {
tx.Rollback()
return nil, err
}
if _, err := (recordsDAO{}).Create(tx, *r.ToRecord()); err != nil {
if _, err := (recordsDAO{}).Create(tx, r); err != nil {
tx.Rollback()
return nil, err
}
for i, ns := range nss {
record := &models.RecordWithType[dns.NSRecord]{}
record.Zone = d.WithDotEnd()
record.RecordType = models.RecordTypeNS
record := &models.Record[dns.NSRecord]{
Zone: d.WithDotEnd(),
RecordType: models.RecordTypeSOA,
Name: fmt.Sprintf("ns%d", i+1),
}
record.Content.Host = ns
record.Name = fmt.Sprintf("ns%d", i+1)
if _, err := (recordsDAO{}).Create(tx, *record.ToRecord()); err != nil {
if _, err := (recordsDAO{}).Create(tx, record); err != nil {
tx.Rollback()
return nil, err
}
@@ -77,7 +73,7 @@ func UpdateDomain(d *models.Domain) error {
return err
}
soa, err := (recordsDAO{}).GetOne(tx, models.Record{
soa, err := (recordsDAO{}).GetOne(tx, &models.Record[models.RecordContentDefault]{
RecordType: models.RecordTypeSOA, Zone: d.WithDotEnd(),
})
if err != nil {
@@ -85,24 +81,19 @@ func UpdateDomain(d *models.Domain) error {
return err
}
r := &models.RecordWithType[dns.SOARecord]{}
if err := r.FromRecord(&soa); err != nil {
r := &models.Record[dns.SOARecord]{}
if err := r.FromEntity(soa); err != nil {
tx.Rollback()
return err
}
r.Content.Ns = d.MainDNS
r.Content.MBox = d.EmailSOAForamt()
r.Content.Refresh = d.RefreshInterval
r.Content.Retry = d.RetryInterval
r.Content.Expire = d.ExpiryPeriod
r.Content.MinTtl = d.NegativeTtl
r.Content = d.GenerateSOA()
if err := r.CheckZone(); err != nil {
tx.Rollback()
return err
}
if _, err := (recordsDAO{}).Update(tx, *r.ToRecord()); err != nil {
if _, err := (recordsDAO{}).Update(tx, r); err != nil {
tx.Rollback()
return err
}
@@ -130,7 +121,7 @@ func DeleteDomain(id string) error {
return err
}
if err := (recordsDAO{}).Delete(tx, models.Record{Zone: domain.WithDotEnd()}); err != nil {
if err := (recordsDAO{}).Delete(tx, &models.Record[models.RecordContentDefault]{Zone: domain.WithDotEnd()}); err != nil {
tx.Rollback()
return err
}

View File

@@ -41,7 +41,7 @@ func RegisterMetrics() {
}
}
func RefreshMetrics() error {
func RefreshMetrics() error {
domainCounts, err := getDomainCounts()
if err != nil {
return err

View File

@@ -10,7 +10,8 @@ func Migrate() error {
return err
}
if err := (recordsDAO{}).Migrate(database.Client, models.Record{}); err != nil {
var recordDefiniation models.IRecord = &models.Record[models.RecordContentDefault]{}
if err := (recordsDAO{}).Migrate(database.Client, recordDefiniation); err != nil {
return err
}

View File

@@ -10,11 +10,11 @@ import (
)
type recordsDAO struct {
database.BaseDAO[models.Record]
database.BaseDAO[models.IRecord]
}
func CreateRecord(r *models.Record) (*models.Record, error) {
if r.RecordType != models.RecordTypeSOA {
func CreateRecord(r models.IRecord) (models.IRecord, error) {
if r.GetType() != models.RecordTypeSOA {
_, err := GetDomains(r.WithOutDotTail())
if err != nil {
return nil, err
@@ -25,11 +25,11 @@ func CreateRecord(r *models.Record) (*models.Record, error) {
return nil, err
}
res, err := (recordsDAO{}).Create(database.Client, *r)
return &res, err
res, err := (recordsDAO{}).Create(database.Client, r)
return res, err
}
func CreateRecords(rs []*models.Record) error {
func CreateRecords(rs []models.IRecord) error {
tx := database.Client.Begin()
for _, r := range rs {
if err := r.CheckZone(); err != nil {
@@ -37,7 +37,7 @@ func CreateRecords(rs []*models.Record) error {
return err
}
if _, err := (recordsDAO{}).Create(tx, *r); err != nil {
if _, err := (recordsDAO{}).Create(tx, r); err != nil {
tx.Rollback()
return err
}
@@ -46,16 +46,16 @@ func CreateRecords(rs []*models.Record) error {
return nil
}
func GetRecords(cond models.Record) ([]models.Record, error) {
func GetRecords(cond models.IRecord) ([]models.IRecord, error) {
return (recordsDAO{}).GetAll(database.Client, cond)
}
func UpdateRecord(r *models.Record) error {
func UpdateRecord(r models.IRecord) error {
if err := r.CheckZone(); err != nil {
return err
}
if _, err := (recordsDAO{}).Update(database.Client, *r); err != nil {
if _, err := (recordsDAO{}).Update(database.Client, r); err != nil {
return err
}
return nil
@@ -68,13 +68,13 @@ func DeleteRecord(domain, id string) error {
}
tx := database.Client.Begin()
record, err := (recordsDAO{}).GetOne(tx, models.Record{ID: ID, Zone: fmt.Sprintf("%s.", domain)})
record, err := (recordsDAO{}).GetOne(tx, &models.Record[models.RecordContentDefault]{ID: ID, Zone: fmt.Sprintf("%s.", domain)})
if err != nil {
tx.Rollback()
return err
}
if record.RecordType == models.RecordTypeSOA {
if record.GetType() == models.RecordTypeSOA {
tx.Rollback()
return gorm.ErrRecordNotFound
}
@@ -90,14 +90,18 @@ func DeleteRecord(domain, id string) error {
// for metrics
func getRecordCounts() (map[string]float64, error) {
rows, err := (recordsDAO{}).GetAll(database.Client, models.Record{})
rows, err := (recordsDAO{}).GetAll(database.Client, &models.Record[models.RecordContentDefault]{})
if err != nil {
return nil, err
}
result := make(map[string]float64)
for _, row := range rows {
result[row.Zone] += 1
record := &models.Record[models.RecordContentDefault]{}
if err := record.FromEntity(row); err != nil {
return nil, err
}
result[record.Zone] += 1
}
return result, nil
}