pages-server/utils/utils.go
hazycora e7a14c2100
All checks were successful
Deploy to VPS / build_site (push) Successful in 6s
add error pages
2024-03-29 23:03:26 -05:00

81 lines
1.7 KiB
Go

package utils
import (
"fmt"
"net/url"
"os"
"path"
"strings"
"time"
"github.com/rs/zerolog/log"
"git.gay/gitgay/pages/cache"
"git.gay/gitgay/pages/errors"
)
var (
resolveCache = cache.NewRedisCache[*DomainResolution]("resolve", time.Minute*15)
PAGES_DOMAIN = os.Getenv("PAGES_DOMAIN")
BASE_URL = fmt.Sprintf("https://%s/", PAGES_DOMAIN)
PAGES_DOMAIN_CANONICAL = PAGES_DOMAIN + "."
PAGES_SUBDOMAIN = fmt.Sprintf(".%s", PAGES_DOMAIN)
)
func CleanPath(uriPath string) string {
unescapedPath, _ := url.PathUnescape(uriPath)
cleanedPath := path.Join("/", unescapedPath)
return cleanedPath
}
type DomainResolution struct {
Owner string
Repository string
Branch *string
}
func (d *DomainResolution) String() string {
if d.Branch != nil {
return fmt.Sprintf("%s/%s/%s", d.Owner, d.Repository, *d.Branch)
}
return fmt.Sprintf("%s/%s", d.Owner, d.Repository)
}
func ResolveDomain(domain string) (result *DomainResolution, err error) {
result, err = resolveCache.Get(domain)
if err == nil {
return
}
target, err := getTarget(domain)
if err != nil {
return
}
target = strings.TrimSuffix(target, "."+PAGES_DOMAIN)
parts := strings.Split(target, ".")
if parts[0] == "*" {
parts = parts[1:]
}
result = &DomainResolution{}
switch len(parts) {
case 1:
result.Owner = parts[0]
result.Repository = "pages"
case 2:
result.Owner = parts[1]
result.Repository = parts[0]
case 3:
result.Owner = parts[2]
result.Repository = parts[1]
result.Branch = &parts[0]
default:
return nil, errors.NewErrorInvalidTarget()
}
log.Debug().Str("domain", domain).Str("target", target).Msg("Resolved domain")
err = resolveCache.Set(domain, result)
if err != nil {
return
}
return result, nil
}