From 8b274c8091d4264e63776f03c7b9869206d87875 Mon Sep 17 00:00:00 2001 From: teru Date: Fri, 5 Aug 2016 23:33:52 +0900 Subject: [PATCH] Implement create/remove a Domain --- domain.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ repository.go | 7 +++-- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/domain.go b/domain.go index d881bc1..1aa23e2 100644 --- a/domain.go +++ b/domain.go @@ -5,6 +5,7 @@ import ( "os" "path/filepath" "syscall" + "time" ) // Domain represents a Domain. @@ -95,3 +96,77 @@ func (r *Repository) Domain(domainName string) (*Domain, error) { return domain, nil } + +// DomainCreate creates the input Domain. +func (r *Repository) DomainCreate(domain *Domain) error { + existDomain, err := r.Domain(domain.Name()) + if err != nil { + return err + } + if existDomain != nil { + return ErrDomainAlreadyExist + } + existAliasDomain, err := r.AliasDomain(domain.Name()) + if err != nil { + return err + } + if existAliasDomain != nil { + return ErrAliasDomainAlreadyExist + } + + domainDirPath := filepath.Join(r.DirMailDataPath, domain.Name()) + + if err := os.Mkdir(domainDirPath, 0777); err != nil { + return err + } + + usersPasswordFile, err := os.Create(filepath.Join(domainDirPath, FileNameUsersPassword)) + if err != nil { + return err + } + usersPasswordFile.Close() + + aliasUsersFile, err := os.Create(filepath.Join(domainDirPath, FileNameAliasUsers)) + if err != nil { + return err + } + aliasUsersFile.Close() + + catchAllUserFile, err := os.Create(filepath.Join(domainDirPath, FileNameCatchAllUser)) + if err != nil { + return err + } + catchAllUserFile.Close() + + return nil +} + +// DomainRemove removes a Domain of the input name. +func (r *Repository) DomainRemove(domainName string) error { + existDomain, err := r.Domain(domainName) + if err != nil { + return err + } + if existDomain == nil { + return ErrDomainNotExist + } + + aliasDomains, err := r.AliasDomains() + if err != nil { + return err + } + for _, aliasDomain := range aliasDomains { + if aliasDomain.Target() == domainName { + return ErrDomainIsAliasDomainTarget + } + } + + domainDirPath := filepath.Join(r.DirMailDataPath, domainName) + domainBackupDirPath := filepath.Join(r.DirMailDataPath, "."+domainName+".deleted."+time.Now().Format("20060102150405")) + + if err := os.Rename(domainDirPath, domainBackupDirPath); err != nil { + return err + } + + return nil +} diff --git a/repository.go b/repository.go index e9abecc..72e3318 100644 --- a/repository.go +++ b/repository.go @@ -18,8 +18,11 @@ var ( // Errors for the operation of the Repository. var ( - ErrDomainNotExist = errors.New("Domain: not exist") - ErrUserNotExist = errors.New("User: not exist") + ErrDomainNotExist = errors.New("Domain: not exist") + ErrDomainAlreadyExist = errors.New("Domain: already exist") + ErrDomainIsAliasDomainTarget = errors.New("Domain: is set as alias") + ErrAliasDomainAlreadyExist = errors.New("AliasDomain: already exist") + ErrUserNotExist = errors.New("User: not exist") ErrInvalidFormatUsersPassword = errors.New("User: password file invalid format") ErrInvalidFormatAliasDomain = errors.New("AliasDomain: file invalid format")