capsule AI-native Unix-like composition layer

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)
	})
}