Add human-readable comments explaining each function's purpose, parameters, and return values for better documentation.
109 lines
3.4 KiB
Go
109 lines
3.4 KiB
Go
// Package db provides database access for the IMC application.
|
|
// It uses GORM (Go ORM) for database operations.
|
|
|
|
package db
|
|
|
|
// =============================================================================
|
|
// VirtualAlias - Mail alias operations
|
|
// These functions interact with the ISPmail virtual_aliases table.
|
|
// =============================================================================
|
|
|
|
// GetAllAliases retrieves all email aliases with their domain names.
|
|
// Returns a slice of AliasWithDomain (includes domain name) or an error.
|
|
func (d *DB) GetAllAliases() ([]AliasWithDomain, error) {
|
|
var aliases []VirtualAlias
|
|
if err := d.Preload("Domain").Find(&aliases).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result := make([]AliasWithDomain, len(aliases))
|
|
for i, a := range aliases {
|
|
result[i] = AliasWithDomain{
|
|
VirtualAlias: a,
|
|
DomainName: "",
|
|
}
|
|
if a.Domain != nil {
|
|
result[i].DomainName = a.Domain.Name
|
|
}
|
|
}
|
|
|
|
if result == nil {
|
|
result = []AliasWithDomain{}
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
// GetAliasesByDomain retrieves all aliases belonging to a specific domain.
|
|
// domainID: the ID of the domain.
|
|
// Returns a slice of VirtualAlias or an error.
|
|
func (d *DB) GetAliasesByDomain(domainID uint) ([]VirtualAlias, error) {
|
|
var aliases []VirtualAlias
|
|
if err := d.Where("domain_id = ?", domainID).Find(&aliases).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
if aliases == nil {
|
|
aliases = []VirtualAlias{}
|
|
}
|
|
return aliases, nil
|
|
}
|
|
|
|
// GetAliasByID retrieves a single alias by its ID.
|
|
// id: the alias's ID.
|
|
// Returns the VirtualAlias or an error (including "record not found").
|
|
func (d *DB) GetAliasByID(id uint) (*VirtualAlias, error) {
|
|
var alias VirtualAlias
|
|
if err := d.Preload("Domain").First(&alias, id).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &alias, nil
|
|
}
|
|
|
|
// GetAliasBySource looks up an alias by its source address.
|
|
// source: the source email address (the alias).
|
|
// Returns the VirtualAlias or an error (including "record not found").
|
|
func (d *DB) GetAliasBySource(source string) (*VirtualAlias, error) {
|
|
var alias VirtualAlias
|
|
if err := d.Where("source = ?", source).First(&alias).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &alias, nil
|
|
}
|
|
|
|
// CreateAlias creates a new email alias without a domain association.
|
|
// source: the source email address (the alias).
|
|
// destination: the destination email address (where mail is forwarded to).
|
|
// Returns the created VirtualAlias or an error.
|
|
func (d *DB) CreateAlias(source, destination string) (*VirtualAlias, error) {
|
|
alias := VirtualAlias{
|
|
Source: source,
|
|
Destination: destination,
|
|
}
|
|
if err := d.Create(&alias).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &alias, nil
|
|
}
|
|
|
|
// CreateAliasInDomain creates a new email alias in a specific domain.
|
|
// source: the source email address (the alias).
|
|
// destination: the destination email address (where mail is forwarded to).
|
|
// domainID: the ID of the domain this alias belongs to.
|
|
// Returns the created VirtualAlias or an error.
|
|
func (d *DB) CreateAliasInDomain(source, destination string, domainID uint) (*VirtualAlias, error) {
|
|
alias := VirtualAlias{
|
|
DomainID: domainID,
|
|
Source: source,
|
|
Destination: destination,
|
|
}
|
|
if err := d.Create(&alias).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &alias, nil
|
|
}
|
|
|
|
// DeleteAlias permanently removes an alias from the database.
|
|
// id: the alias's ID to delete.
|
|
// Returns an error if the deletion fails.
|
|
func (d *DB) DeleteAlias(id uint) error {
|
|
return d.Delete(&VirtualAlias{}, id).Error
|
|
}
|