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 }