forked from apps/featurer
91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
package http
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
stdhttp "net/http"
|
|
"os"
|
|
"strings"
|
|
"sync"
|
|
|
|
"go.dev.pztrn.name/featurer/server/internal/application"
|
|
"go.dev.pztrn.name/featurer/server/internal/services/core"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const (
|
|
subsystem = "HTTP servers"
|
|
)
|
|
|
|
var _ = core.HTTP(&http{})
|
|
|
|
type http struct {
|
|
app *application.Application
|
|
servers map[string]*gin.Engine
|
|
httpServers map[string]*stdhttp.Server
|
|
serversMutex sync.RWMutex
|
|
}
|
|
|
|
// Initialize initializes service.
|
|
func Initialize(app *application.Application) error {
|
|
httpSrv := &http{
|
|
app: app,
|
|
}
|
|
|
|
if err := app.RegisterService(httpSrv); err != nil {
|
|
return fmt.Errorf("%w: register service: %w", core.ErrHTTP, err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *http) ConnectDependencies() error {
|
|
return nil
|
|
}
|
|
|
|
func (h *http) GetName() string {
|
|
return core.ServiceNameHTTP
|
|
}
|
|
|
|
func (h *http) Initialize() error {
|
|
slog.Info("Initializing service...", "service", subsystem)
|
|
|
|
h.servers = make(map[string]*gin.Engine)
|
|
h.httpServers = make(map[string]*stdhttp.Server)
|
|
|
|
serversNames := []string{core.ServerNameAPI, core.ServerNameCMS}
|
|
|
|
for _, name := range serversNames {
|
|
addr, found := os.LookupEnv("FEATURER_" + strings.ToUpper(name) + "_SERVER_ADDRESS")
|
|
if !found {
|
|
return fmt.Errorf("%w: getting address for server '%s' from env: not found", core.ErrHTTP, name)
|
|
}
|
|
|
|
h.createServer(name, addr)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *http) LaunchStartupTasks() error {
|
|
h.startServers()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *http) Shutdown() error {
|
|
h.serversMutex.Lock()
|
|
defer h.serversMutex.Unlock()
|
|
|
|
for name, server := range h.httpServers {
|
|
slog.Info("Stopping HTTP server...", "service", subsystem, "server", name)
|
|
|
|
if err := server.Shutdown(h.app.GetContext()); err != nil {
|
|
slog.Error("Failed to stop HTTP server!", "service", subsystem, "server", name, "error", err.Error())
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|