45 lines
984 B
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
|
|
}
|