dbots/internal/middleware/bot.go

45 lines
984 B
Go

package middleware
import (
"context"
"errors"
"net/http"
"codeberg.org/nextgo/dbots/internal/db"
"codeberg.org/nextgo/dbots/internal/errorutil"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
"github.com/jackc/pgx/v5"
)
const botKey contextKey = "bot"
func BotContext(q *db.Queries) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
ctx := req.Context()
botID := chi.URLParam(req, "botID")
bot, err := q.GetBot(ctx, botID)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
render.Render(w, req, errorutil.ErrNotFound)
} else {
render.Render(w, req, errorutil.ErrInternal(err))
}
return
}
ctx = context.WithValue(ctx, botKey, bot)
next.ServeHTTP(w, req.WithContext(ctx))
})
}
}
func GetBot(ctx context.Context) *db.Bot {
bot, ok := ctx.Value(botKey).(*db.Bot)
if !ok {
return nil
}
return bot
}