Files
tesseract/internal/service/service.go
2024-12-02 23:03:06 +00:00

101 lines
2.4 KiB
Go

package service
import (
"database/sql"
"github.com/docker/docker/client"
_ "github.com/golang-migrate/migrate/v4/source/file"
"github.com/labstack/echo/v4"
"github.com/olahol/melody"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/sqlitedialect"
"github.com/uptrace/bun/driver/sqliteshim"
"github.com/uptrace/bun/extra/bundebug"
_ "modernc.org/sqlite"
"net/http"
"tesseract/internal/reverseproxy"
"tesseract/internal/sshproxy"
)
const (
keyHTTPClient = "httpClient"
keyDockerClient = "dockerClient"
keyDB = "db"
keyConfig = "config"
keySSHProxy = "sshProxy"
keyReverseProxy = "reverseProxy"
)
type Services struct {
HTTPClient *http.Client
DockerClient *client.Client
Database *bun.DB
Config Config
SSHProxy *sshproxy.SSHProxy
ReverseProxy *reverseproxy.ReverseProxy
Melody *melody.Melody
}
func HTTPClient(c echo.Context) *http.Client {
return c.Get(keyHTTPClient).(*http.Client)
}
func DockerClient(c echo.Context) *client.Client {
return c.Get(keyDockerClient).(*client.Client)
}
func Database(c echo.Context) *bun.DB {
return c.Get(keyDB).(*bun.DB)
}
func SSHProxy(c echo.Context) *sshproxy.SSHProxy {
return c.Get(keySSHProxy).(*sshproxy.SSHProxy)
}
func ReverseProxy(c echo.Context) *reverseproxy.ReverseProxy {
return c.Get(keyReverseProxy).(*reverseproxy.ReverseProxy)
}
func Initialize(config Config) (Services, error) {
hc := &http.Client{}
docker, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
return Services{}, err
}
db, err := sql.Open(sqliteshim.ShimName, config.DatabasePath)
if err != nil {
return Services{}, err
}
bundb := bun.NewDB(db, sqlitedialect.New())
if config.Debug {
bundb.AddQueryHook(bundebug.NewQueryHook(bundebug.WithVerbose(true)))
}
sshProxy := sshproxy.New()
return Services{
HTTPClient: hc,
DockerClient: docker,
Database: bundb,
Config: config,
Melody: melody.New(),
SSHProxy: sshProxy,
ReverseProxy: reverseproxy.New(config.HostName),
}, nil
}
func (s Services) Middleware() echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
c.Set(keyHTTPClient, s.HTTPClient)
c.Set(keyDockerClient, s.DockerClient)
c.Set(keyDB, s.Database)
c.Set(keyConfig, s.Config)
c.Set(keySSHProxy, s.SSHProxy)
c.Set(keyReverseProxy, s.ReverseProxy)
return next(c)
}
}
}