Go · 1550 bytes Raw Blame History
1 // SPDX-License-Identifier: AGPL-3.0-or-later
2
3 package web
4
5 import (
6 "errors"
7 "fmt"
8 "io/fs"
9 "log/slog"
10
11 "github.com/jackc/pgx/v5/pgxpool"
12
13 "github.com/tenseleyFlow/shithub/internal/auth/audit"
14 "github.com/tenseleyFlow/shithub/internal/auth/email"
15 "github.com/tenseleyFlow/shithub/internal/infra/config"
16 adminh "github.com/tenseleyFlow/shithub/internal/web/handlers/admin"
17 "github.com/tenseleyFlow/shithub/internal/web/render"
18 )
19
20 // buildAdminHandlers wires the S34 site-admin handler set. The
21 // returned handler set is route-only; the wiring layer in server.go
22 // composes RequireUser + RequireSiteAdmin around the Mount call.
23 //
24 // emailSender + branding are required for the "Reset password"
25 // admin action to actually deliver. Pass the same sender the
26 // auth handler set uses so behavior matches the public flow.
27 func buildAdminHandlers(
28 cfg config.Config,
29 pool *pgxpool.Pool,
30 tmplFS fs.FS,
31 logger *slog.Logger,
32 version string,
33 emailSender email.Sender,
34 ) (*adminh.Handlers, error) {
35 if pool == nil {
36 return nil, errors.New("admin: nil pool")
37 }
38 rr, err := render.New(tmplFS, render.Options{Octicons: render.BuiltinOcticons()})
39 if err != nil {
40 return nil, fmt.Errorf("admin: render.New: %w", err)
41 }
42 return adminh.New(adminh.Deps{
43 Logger: logger,
44 Render: rr,
45 Pool: pool,
46 Audit: audit.NewRecorder(),
47 Email: emailSender,
48 Branding: email.Branding{
49 SiteName: cfg.Auth.SiteName,
50 BaseURL: cfg.Auth.BaseURL,
51 From: cfg.Auth.EmailFrom,
52 },
53 SiteName: cfg.Auth.SiteName,
54 Version: version,
55 })
56 }
57