Files
photoprism/internal/service/hub/service.go
2025-10-04 14:16:11 +02:00

128 lines
2.7 KiB
Go

package hub
import (
"fmt"
"net/url"
"os"
"strings"
"github.com/photoprism/photoprism/pkg/clean"
)
// Default service base URLs for testing and production.
const (
ProdBaseURL = "https://my.photoprism.app/v1/hello"
TestBaseURL = "https://hub-int.photoprism.app/v1/hello"
)
// baseURL specifies the service endpoint URL.
var baseURL = ProdBaseURL
// GetServiceURL returns the currently configured Hub endpoint, optionally
// appending the provided API key. An empty string is returned when Hub
// requests are disabled.
func GetServiceURL(key string) string {
if baseURL == "" {
return ""
}
if key == "" {
return baseURL
}
return fmt.Sprintf(baseURL+"/%s", key)
}
// GetFeedbackServiceURL builds the feedback endpoint corresponding to the
// supplied API key. A disabled Hub service results in an empty string.
func GetFeedbackServiceURL(key string) string {
if key == "" {
return ""
}
u := GetServiceURL(key)
if u == "" {
return ""
}
return u + "/feedback"
}
// GetServiceHost extracts the Hub host name from the active base URL, or
// returns an empty string when the service is disabled or invalid.
func GetServiceHost() string {
s := GetServiceURL("")
if s == "" {
return ""
}
u, err := url.Parse(s)
if err != nil {
log.Warn(err)
return ""
}
return u.Host
}
// SetBaseURL updates the Hub endpoint, ignoring inputs that are not HTTPS or
// identical to the current value. Changes are logged so integration tests and
// developers can trace the active target.
func SetBaseURL(u string) {
// Return if it is not an HTTPS URL.
if !strings.HasPrefix(u, "https://") {
return
}
// Return if URL has not changed.
if u == baseURL {
return
}
// Set new service endpoint URL.
switch u {
case TestBaseURL:
log.Debug("config: enabled hub test service endpoint")
case ProdBaseURL:
log.Debug("config: enabled hub production service endpoint")
default:
log.Debugf("config: changed hub service endpoint to %s", clean.Log(u))
}
baseURL = u
}
// Disabled reports whether outbound Hub requests have been switched off.
func Disabled() bool {
return baseURL == ""
}
// Disable clears the Hub endpoint so no network calls are attempted.
func Disable() {
// Return if already disabled.
if Disabled() {
return
}
// Remove configured endpoint URL to disable service.
baseURL = ""
log.Debugf("config: disabled hub service requests")
}
// ApplyTestConfig reads PHOTOPRISM_TEST_HUB and switches the Hub endpoint to a
// matching environment ("test", "prod"), disabling requests by default so
// automated tests stay hermetic.
func ApplyTestConfig() {
switch os.Getenv("PHOTOPRISM_TEST_HUB") {
case "true", "test", "int":
SetBaseURL(TestBaseURL)
case "prod":
SetBaseURL(ProdBaseURL)
default:
Disable()
}
}