src/internal/app.go
1,121 bytes · 48 lines · capsule://quake0day/[email protected]
raw on github
package internal
import (
"fmt"
"log/slog"
"os"
"scenemint/internal/config"
"scenemint/internal/image"
"scenemint/internal/quota"
"scenemint/internal/router"
"scenemint/internal/security"
"github.com/rs/zerolog"
slogzerolog "github.com/samber/slog-zerolog/v2"
"github.com/sunls24/gox/server"
)
type App struct{}
func NewApp() App {
return App{}
}
func setupLogger() *slog.Logger {
logger := slog.New(slogzerolog.Option{Level: slog.LevelInfo, Logger: new(zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: "06-01-02 15:04:05"}))}.NewZerologHandler())
slog.SetDefault(logger)
return logger
}
func (app App) Run() error {
logger := setupLogger()
cfg := config.MustNew()
quotaStore, err := quota.Open(quota.DefaultPath)
if err != nil {
return err
}
defer quotaStore.Close()
imageClient := image.NewClient(cfg, quotaStore)
return server.Start(fmt.Sprintf("%s:%s", cfg.Host, cfg.Port), func(srv *server.Server) {
srv.Echo.Logger = logger
srv.Echo.Use(security.Headers())
srv.Echo.Static("/", "web/dist")
router.Register(srv.Echo, imageClient, quotaStore, cfg.Security)
})
}