From 47d4b7bd49aca4576fb11bcfa8a5134e2fc5bc8c Mon Sep 17 00:00:00 2001 From: teru Date: Mon, 8 Aug 2016 10:30:00 +0900 Subject: [PATCH] Implement create/remove a AliasDomain --- aliasdomain.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ repository.go | 7 +++-- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/aliasdomain.go b/aliasdomain.go index 5a01eaf..9728caa 100644 --- a/aliasdomain.go +++ b/aliasdomain.go @@ -2,8 +2,10 @@ package mailfull import ( "bufio" + "fmt" "os" "path/filepath" + "sort" "strings" ) @@ -117,3 +119,84 @@ func (r *Repository) AliasDomain(aliasDomainName string) (*AliasDomain, error) { return nil, nil } + +// AliasDomainCreate creates the input AliasDomain. +func (r *Repository) AliasDomainCreate(aliasDomain *AliasDomain) error { + aliasDomains, err := r.AliasDomains() + if err != nil { + return err + } + + for _, ad := range aliasDomains { + if ad.Name() == aliasDomain.Name() { + return ErrAliasDomainAlreadyExist + } + } + existDomain, err := r.Domain(aliasDomain.Name()) + if err != nil { + return err + } + if existDomain != nil { + return ErrDomainAlreadyExist + } + existDomain, err = r.Domain(aliasDomain.Target()) + if err != nil { + return err + } + if existDomain == nil { + return ErrDomainNotExist + } + + aliasDomains = append(aliasDomains, aliasDomain) + + if err := r.writeAliasDomainsFile(aliasDomains); err != nil { + return err + } + + return nil +} + +// AliasDomainRemove removes a AliasDomain of the input name. +func (r *Repository) AliasDomainRemove(aliasDomainName string) error { + aliasDomains, err := r.AliasDomains() + if err != nil { + return err + } + + idx := -1 + for i, aliasDomain := range aliasDomains { + if aliasDomain.Name() == aliasDomainName { + idx = i + } + } + if idx < 0 { + return ErrAliasDomainNotExist + } + + aliasDomains = append(aliasDomains[:idx], aliasDomains[idx+1:]...) + + if err := r.writeAliasDomainsFile(aliasDomains); err != nil { + return err + } + + return nil +} + +// writeAliasDomainsFile writes a AliasDomain slice to the file. +func (r *Repository) writeAliasDomainsFile(aliasDomains []*AliasDomain) error { + file, err := os.OpenFile(filepath.Join(r.DirMailDataPath, FileNameAliasDomains), os.O_RDWR|os.O_TRUNC, 0666) + if err != nil { + return err + } + defer file.Close() + + sort.Sort(AliasDomainSlice(aliasDomains)) + + for _, aliasDomain := range aliasDomains { + if _, err := fmt.Fprintf(file, "%s:%s\n", aliasDomain.Name(), aliasDomain.Target()); err != nil { + return err + } + } + + return nil +} diff --git a/repository.go b/repository.go index 7ddcb52..b960fb2 100644 --- a/repository.go +++ b/repository.go @@ -21,8 +21,11 @@ var ( 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") + + ErrAliasDomainNotExist = errors.New("AliasDomain: not exist") + 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")