44 lines
1.5 KiB
Go
44 lines
1.5 KiB
Go
package domainproviderimp
|
|
|
|
import (
|
|
"net/url"
|
|
|
|
"git.sendico.io/tech/sxchnge/shared/errors"
|
|
"git.sendico.io/tech/sxchnge/shared/logging"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type DomainProviderImp struct {
|
|
domain string
|
|
apiEndpoint string
|
|
}
|
|
|
|
func (dp *DomainProviderImp) GetFullLink(linkElem ...string) (string, error) {
|
|
return url.JoinPath(dp.domain, linkElem...)
|
|
}
|
|
|
|
func (dp *DomainProviderImp) GetAPILink(linkElem ...string) (string, error) {
|
|
return url.JoinPath(dp.apiEndpoint, linkElem...)
|
|
}
|
|
|
|
func CreateDomainProviderImp(logger mlogger.Logger, domain, protocol, apiPath string) (*DomainProviderImp, error) {
|
|
if protocol != "http" && protocol != "https" {
|
|
return nil, merrors.InvalidArgument("API protocol must be http or https")
|
|
}
|
|
parsed, err := url.Parse(protocol + "://" + domain)
|
|
if err != nil {
|
|
return nil, merrors.OpaqueWrap(merrors.ErrInvalidArg, err, "invalid API origin")
|
|
}
|
|
if parsed.Hostname() == "" || parsed.Host != domain || parsed.User != nil || parsed.Path != "" || parsed.RawQuery != "" || parsed.Fragment != "" {
|
|
return nil, merrors.InvalidArgument("API domain must be a host with optional port")
|
|
}
|
|
p := new(DomainProviderImp)
|
|
p.domain = protocol + "://" + domain
|
|
if p.apiEndpoint, err = url.JoinPath(p.domain, apiPath); err != nil {
|
|
logger.Error("Failed to create domain provider", zap.String("domain", p.domain), zap.String("api_path", apiPath))
|
|
return nil, err
|
|
}
|
|
logger.Named("domain_provider").Info("Domain name provider is up", zap.String("domain", p.domain))
|
|
return p, nil
|
|
}
|