Feat: Backend scaffolding and local dev stack
This commit is contained in:
35
Backend/cmd/api/main.go
Normal file
35
Backend/cmd/api/main.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"moku-backend/internal/bootstrap"
|
||||
"moku-backend/internal/httpx"
|
||||
"moku-backend/internal/process"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app, err := bootstrap.New("api")
|
||||
if err != nil {
|
||||
log.Fatalf("bootstrap api service: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
if closeErr := app.Close(); closeErr != nil {
|
||||
app.Logger.Error("close api service", "error", closeErr)
|
||||
}
|
||||
}()
|
||||
|
||||
handler := httpx.NewRouter(httpx.RouterConfig{
|
||||
ServiceName: app.ServiceName,
|
||||
Config: app.Config,
|
||||
Logger: app.Logger,
|
||||
BuildInfo: app.BuildInfo,
|
||||
Database: app.Database,
|
||||
Cache: app.Cache,
|
||||
})
|
||||
|
||||
if err := process.RunHTTPServer(app.ServiceName, app.Config.Address(app.ServiceName), handler, app.Logger, app.Config.ShutdownTimeout); err != nil {
|
||||
app.Logger.Error("api service stopped", "error", err)
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
49
Backend/cmd/migrate/main.go
Normal file
49
Backend/cmd/migrate/main.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"moku-backend/internal/config"
|
||||
"moku-backend/internal/database"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cfg := config.Load()
|
||||
|
||||
db, err := database.NewPostgres(cfg.PostgresURL)
|
||||
if err != nil {
|
||||
log.Fatalf("connect database for migrations: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
command := "up"
|
||||
if len(os.Args) > 1 {
|
||||
command = os.Args[1]
|
||||
}
|
||||
|
||||
switch command {
|
||||
case "up":
|
||||
if err := db.MigrateUp(); err != nil {
|
||||
log.Fatalf("run migrations: %v", err)
|
||||
}
|
||||
fmt.Println("migrations applied")
|
||||
case "down":
|
||||
if err := db.MigrateDown(); err != nil {
|
||||
log.Fatalf("roll back migration: %v", err)
|
||||
}
|
||||
fmt.Println("latest migration rolled back")
|
||||
case "reset":
|
||||
if err := db.MigrateReset(); err != nil {
|
||||
log.Fatalf("reset migrations: %v", err)
|
||||
}
|
||||
fmt.Println("migrations reset")
|
||||
case "status":
|
||||
if err := db.MigrateStatus(); err != nil {
|
||||
log.Fatalf("show migration status: %v", err)
|
||||
}
|
||||
default:
|
||||
log.Fatalf("unsupported migrate command %q (supported: up, down, reset, status)", command)
|
||||
}
|
||||
}
|
||||
35
Backend/cmd/web/main.go
Normal file
35
Backend/cmd/web/main.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"moku-backend/internal/bootstrap"
|
||||
"moku-backend/internal/httpx"
|
||||
"moku-backend/internal/process"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app, err := bootstrap.New("web")
|
||||
if err != nil {
|
||||
log.Fatalf("bootstrap web service: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
if closeErr := app.Close(); closeErr != nil {
|
||||
app.Logger.Error("close web service", "error", closeErr)
|
||||
}
|
||||
}()
|
||||
|
||||
handler := httpx.NewRouter(httpx.RouterConfig{
|
||||
ServiceName: app.ServiceName,
|
||||
Config: app.Config,
|
||||
Logger: app.Logger,
|
||||
BuildInfo: app.BuildInfo,
|
||||
Database: app.Database,
|
||||
Cache: app.Cache,
|
||||
})
|
||||
|
||||
if err := process.RunHTTPServer(app.ServiceName, app.Config.Address(app.ServiceName), handler, app.Logger, app.Config.ShutdownTimeout); err != nil {
|
||||
app.Logger.Error("web service stopped", "error", err)
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
27
Backend/cmd/worker/main.go
Normal file
27
Backend/cmd/worker/main.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"moku-backend/internal/bootstrap"
|
||||
"moku-backend/internal/process"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app, err := bootstrap.New("worker")
|
||||
if err != nil {
|
||||
log.Fatalf("bootstrap worker service: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
if closeErr := app.Close(); closeErr != nil {
|
||||
app.Logger.Error("close worker service", "error", closeErr)
|
||||
}
|
||||
}()
|
||||
|
||||
app.Logger.Info("worker ready", "service", app.ServiceName, "environment", app.Config.Environment)
|
||||
|
||||
if err := process.WaitForShutdown(app.ServiceName, app.Logger); err != nil {
|
||||
app.Logger.Error("worker stopped", "error", err)
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user