hmn/src/hmnurl/hmnurl.go

84 lines
1.6 KiB
Go
Raw Normal View History

2021-03-18 01:25:06 +00:00
package hmnurl
import (
"net/url"
"git.handmade.network/hmn/hmn/src/config"
2021-05-06 04:04:58 +00:00
"git.handmade.network/hmn/hmn/src/models"
"git.handmade.network/hmn/hmn/src/oops"
2021-03-18 01:25:06 +00:00
)
const StaticPath = "/public"
const StaticThemePath = "/public/themes"
type Q struct {
Name string
Value string
}
var baseUrlParsed url.URL
func init() {
2021-05-05 20:34:32 +00:00
SetGlobalBaseUrl(config.Config.BaseUrl)
}
func SetGlobalBaseUrl(fullBaseUrl string) {
parsed, err := url.Parse(fullBaseUrl)
if err != nil {
panic(oops.New(err, "could not parse base URL"))
}
2021-05-04 09:24:31 +00:00
if parsed.Scheme == "" || parsed.Host == "" {
panic(oops.New(nil, "Website is misconfigured. Config should include a full BaseUrl (e.g. \"http://handmade.local:9001\")"))
}
baseUrlParsed = *parsed
}
2021-03-18 01:25:06 +00:00
func Url(path string, query []Q) string {
return ProjectUrl(path, query, "")
}
2021-05-06 04:04:58 +00:00
func ProjectUrl(path string, query []Q, slug string) string {
subdomain := slug
if slug == models.HMNProjectSlug {
subdomain = ""
}
host := baseUrlParsed.Host
if len(subdomain) > 0 {
2021-05-06 04:04:58 +00:00
host = slug + "." + host
2021-03-18 01:25:06 +00:00
}
url := url.URL{
Scheme: baseUrlParsed.Scheme,
Host: host,
Path: trim(path),
RawQuery: encodeQuery(query),
}
return url.String()
2021-03-18 01:25:06 +00:00
}
func StaticUrl(path string, query []Q) string {
return Url(StaticPath+"/"+trim(path), query)
}
func StaticThemeUrl(path string, theme string, query []Q) string {
return Url(StaticThemePath+"/"+theme+"/"+trim(path), query)
}
func trim(path string) string {
2021-04-22 23:02:50 +00:00
if len(path) > 0 && path[0] == '/' {
2021-03-18 01:25:06 +00:00
return path[1:]
}
return path
}
func encodeQuery(query []Q) string {
result := url.Values{}
for _, q := range query {
result.Set(q.Name, q.Value)
}
return result.Encode()
}