feat: new admin and web apps
This commit is contained in:
161
main.go
Normal file
161
main.go
Normal file
@@ -0,0 +1,161 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"log"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"github.com/minio/minio-go/v7"
|
||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||
"keikos.work/app"
|
||||
"keikos.work/assets"
|
||||
)
|
||||
|
||||
var (
|
||||
port uint = 8080
|
||||
dev bool = false
|
||||
|
||||
webFlags *flag.FlagSet = nil
|
||||
adminFlags *flag.FlagSet = nil
|
||||
|
||||
minioAccessKeyID = os.Getenv("AWS_ACCESS_KEY_ID")
|
||||
minioSecretAccessKey = os.Getenv("AWS_SECRET_ACCESS_KEY")
|
||||
minioEndpoint = os.Getenv("AWS_ENDPOINT_URL")
|
||||
minioSSL = false
|
||||
)
|
||||
|
||||
func init() {
|
||||
webFlags = flag.NewFlagSet("web", flag.ExitOnError)
|
||||
|
||||
webFlags.UintVar(&port, "port", 8080, "The port to be used")
|
||||
webFlags.BoolVar(&dev, "dev", false, "Run the server in development mode")
|
||||
|
||||
webFlags.StringVar(&minioAccessKeyID, "aws-access-key-id", os.Getenv("AWS_ACCESS_KEY_ID"), "")
|
||||
webFlags.StringVar(
|
||||
&minioSecretAccessKey,
|
||||
"aws-access-key-secret",
|
||||
os.Getenv("AWS_SECRET_ACCESS_KEY"),
|
||||
"",
|
||||
)
|
||||
webFlags.StringVar(&minioEndpoint, "aws-enpoint", os.Getenv("AWS_ENDPOINT_URL"), "")
|
||||
webFlags.BoolVar(&minioSSL, "aws-ssl", false, "")
|
||||
}
|
||||
|
||||
func init() {
|
||||
adminFlags = flag.NewFlagSet("admin", flag.ExitOnError)
|
||||
|
||||
adminFlags.UintVar(&port, "port", 8080, "The port to be used")
|
||||
adminFlags.BoolVar(&dev, "dev", false, "Run the server in development mode")
|
||||
|
||||
adminFlags.StringVar(&minioAccessKeyID, "aws-access-key-id", os.Getenv("AWS_ACCESS_KEY_ID"), "")
|
||||
adminFlags.StringVar(
|
||||
&minioSecretAccessKey,
|
||||
"aws-access-key-secret",
|
||||
os.Getenv("AWS_SECRET_ACCESS_KEY"),
|
||||
"",
|
||||
)
|
||||
adminFlags.StringVar(&minioEndpoint, "aws-enpoint", os.Getenv("AWS_ENDPOINT_URL"), "")
|
||||
adminFlags.BoolVar(&minioSSL, "aws-ssl", false, "")
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
log.Fatalf("Expected 'web' or 'admin' subcommands")
|
||||
}
|
||||
|
||||
s3, err := minio.New(minioEndpoint, &minio.Options{
|
||||
Creds: credentials.NewStaticV4(minioAccessKeyID, minioSecretAccessKey, ""),
|
||||
Secure: minioSSL,
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
var a app.App
|
||||
var l *slog.Logger
|
||||
|
||||
switch os.Args[1] {
|
||||
case "web":
|
||||
webFlags.Parse(os.Args[2:])
|
||||
|
||||
var level slog.Leveler
|
||||
if dev {
|
||||
level = slog.LevelDebug
|
||||
} else {
|
||||
level = slog.LevelInfo
|
||||
}
|
||||
l = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
|
||||
|
||||
var assetsHandler http.Handler
|
||||
if dev {
|
||||
assetsHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))
|
||||
} else {
|
||||
assetsHandler = http.StripPrefix("/assets/", http.FileServerFS(assets.ASSETS))
|
||||
}
|
||||
|
||||
a = app.NewWeb(app.Options{
|
||||
Port: port,
|
||||
Development: dev,
|
||||
Log: l,
|
||||
|
||||
S3: s3,
|
||||
|
||||
Assets: assetsHandler,
|
||||
})
|
||||
case "admin":
|
||||
adminFlags.Parse(os.Args[2:])
|
||||
|
||||
var level slog.Leveler
|
||||
if dev {
|
||||
level = slog.LevelDebug
|
||||
} else {
|
||||
level = slog.LevelInfo
|
||||
}
|
||||
l = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
|
||||
|
||||
var assetsHandler http.Handler
|
||||
if dev {
|
||||
assetsHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))
|
||||
} else {
|
||||
assetsHandler = http.StripPrefix("/assets/", http.FileServerFS(assets.ASSETS))
|
||||
}
|
||||
|
||||
a = app.NewAdmin(app.Options{
|
||||
Port: port,
|
||||
Development: dev,
|
||||
Log: l,
|
||||
|
||||
S3: s3,
|
||||
|
||||
Assets: assetsHandler,
|
||||
})
|
||||
default:
|
||||
log.Fatalf("Command %q is not available", os.Args[1])
|
||||
}
|
||||
|
||||
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
||||
defer stop()
|
||||
|
||||
if dev {
|
||||
l.Info("RUNNING IN DEVELOPMENT MODE")
|
||||
}
|
||||
|
||||
go func() {
|
||||
if err := a.Start(); err != nil {
|
||||
l.Error("Failed to start server", slog.String("error", err.Error()))
|
||||
}
|
||||
}()
|
||||
|
||||
<-ctx.Done()
|
||||
l.Info("Shutting down")
|
||||
if err := a.Stop(); err != nil {
|
||||
l.Error("Failed to shut down", slog.String("error", err.Error()))
|
||||
}
|
||||
|
||||
l.Info("FINAL")
|
||||
}
|
||||
Reference in New Issue
Block a user