// 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 }