feat: split out app boilerplate

This commit is contained in:
Marc 2024-10-06 10:18:16 -04:00
commit a1278147f4
Signed by: marc
GPG key ID: 048E042F22B5DC79
3 changed files with 96 additions and 0 deletions

3
go.mod Normal file
View file

@ -0,0 +1,3 @@
module http-api-kit
go 1.23.1

75
main.go Normal file
View file

@ -0,0 +1,75 @@
package main
import (
"net/http"
"time"
)
type Route struct {
Path string
Handler http.HandlerFunc
Static bool
StaticPath string
}
type BackgroundTask struct {
Handler func()
Interval time.Duration
}
type App struct {
Routes []Route
BackgroundTasks []BackgroundTask
StaticRoot string
Middleware []Middleware
}
func (a *App) AddRoute(path string, handler http.HandlerFunc) {
a.Routes = append(a.Routes, Route{Path: path, Handler: handler})
}
func (a *App) AddStaticRoute(path string, filePath string) {
a.Routes = append(a.Routes, Route{Path: path, Static: true, StaticPath: filePath})
}
func (a *App) AddMiddleware(m Middleware) {
a.Middleware = append(a.Middleware, m)
}
func (a *App) AddBackgroundTask(b BackgroundTask) {
a.BackgroundTasks = append(a.BackgroundTasks, b)
}
func (a App) Start(addr string) {
for _, route := range a.Routes {
if route.Static {
http.Handle(route.Path, http.StripPrefix(route.Path, http.FileServer(http.Dir(route.StaticPath))))
continue
}
handler := route.Handler
for _, mware := range a.Middleware {
handler = mware(handler)
}
http.HandleFunc(route.Path, handler)
}
for _, task := range a.BackgroundTasks {
go func() {
for {
task.Handler()
time.Sleep(task.Interval)
}
}()
}
http.ListenAndServe(addr, nil)
}
func NewApp() *App {
app := App{}
return &app
}

18
middleware.go Normal file
View file

@ -0,0 +1,18 @@
package main
import (
"fmt"
"log/slog"
"net/http"
"time"
)
type Middleware = func(http.HandlerFunc) http.HandlerFunc
func LoggingMiddleware(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
f(w, r)
slog.Info(fmt.Sprintf("%s - %s (%dms)", r.Method, r.URL, time.Now().Sub(start).Milliseconds()))
}
}