~bigbes/huntsman

ref: 766fa8055977fbe223afd8a84bcf37a3d13bb1ce huntsman/internal/server/router.go -rw-r--r-- 1.8 KiB
766fa805 — Eugene Blikh Add BSD 2-Clause license 6 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package server

import (
	"log/slog"
	"net/http"

	"github.com/go-chi/chi/v5"

	"sourcecraft.dev/bigbes/huntsman/internal/domain/search"
	"sourcecraft.dev/bigbes/huntsman/internal/platform/health"
	"sourcecraft.dev/bigbes/huntsman/internal/server/middleware"
)

// Routes wires every HTTP route the service exposes.
//
// Keeping route registration in one file makes it easy to audit the
// public surface area without grepping every handler package.
func Routes(logger *slog.Logger, h *health.Health, searchHandler *search.Handler) http.Handler {
	r := chi.NewRouter()

	r.Use(middleware.RequestID)
	r.Use(middleware.Recovery(logger))
	r.Use(middleware.Logging(logger))

	r.Get("/healthz", h.Healthz)
	r.Get("/readyz", h.Readyz)

	r.Get("/", indexHandler)

	searchHandler.RegisterRoutes(r)

	return r
}

// indexHandler advertises the unified OpenSearch document via a
// <link rel="search"> tag, so browsers offer to add the engine when
// the user visits the root URL.
func indexHandler(w http.ResponseWriter, _ *http.Request) {
	const body = `<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>huntsman</title>
  <link rel="search"
        type="application/opensearchdescription+xml"
        title="huntsman"
        href="/opensearch.xml">
</head>
<body>
  <h1>huntsman</h1>
  <p>Multi-provider search router. Use prefixes:</p>
  <ul>
    <li><code>ud &lt;query&gt;</code> &mdash; Urban Dictionary</li>
    <li><code>gh &lt;query&gt;</code> &mdash; GitHub</li>
    <li><code>steam &lt;query&gt;</code> &mdash; Steam</li>
  </ul>
  <p>Endpoints: <code>/search?q=...</code>, <code>/providers</code>,
     <code>/opensearch.xml</code>,
     <code>/opensearch/{provider}.xml</code>.</p>
</body>
</html>
`
	w.Header().Set("Content-Type", "text/html; charset=utf-8")
	_, _ = w.Write([]byte(body))
}