package db func (d *DB) GetAllDomains() ([]DomainStats, error) { var domains []VirtualDomain if err := d.Order("name ASC").Find(&domains).Error; err != nil { return nil, err } stats := make([]DomainStats, len(domains)) for i, dom := range domains { var userCount, aliasCount int64 d.Model(&VirtualUser{}).Where("domain_id = ?", dom.ID).Count(&userCount) d.Model(&VirtualAlias{}).Where("domain_id = ?", dom.ID).Count(&aliasCount) stats[i] = DomainStats{ ID: dom.ID, Name: dom.Name, UserCount: userCount, AliasCount: aliasCount, } } if stats == nil { stats = []DomainStats{} } return stats, nil } func (d *DB) GetDomainByID(id uint) (*VirtualDomain, error) { var domain VirtualDomain if err := d.Where("id = ?", id).First(&domain).Error; err != nil { return nil, err } return &domain, nil } func (d *DB) GetDomainByName(name string) (*VirtualDomain, error) { var domain VirtualDomain if err := d.Where("name = ?", name).First(&domain).Error; err != nil { return nil, err } return &domain, nil } func (d *DB) CreateDomain(name string) (*VirtualDomain, error) { domain := VirtualDomain{Name: name} if err := d.Create(&domain).Error; err != nil { return nil, err } return &domain, nil } func (d *DB) DeleteDomain(id uint) error { tx := d.Begin() defer func() { tx.Rollback() }() if err := tx.Where("domain_id = ?", id).Delete(&VirtualUser{}).Error; err != nil { return err } if err := tx.Where("domain_id = ?", id).Delete(&VirtualAlias{}).Error; err != nil { return err } if err := tx.Delete(&VirtualDomain{}, id).Error; err != nil { return err } return tx.Commit().Error }