Go · 1924 bytes Raw Blame History
1 // SPDX-License-Identifier: AGPL-3.0-or-later
2
3 package web
4
5 import (
6 "errors"
7 "io/fs"
8 "log/slog"
9 "net/http"
10 "os"
11 "time"
12
13 "github.com/jackc/pgx/v5/pgxpool"
14
15 "github.com/tenseleyFlow/shithub/internal/auth/email"
16 "github.com/tenseleyFlow/shithub/internal/infra/config"
17 orgshandlers "github.com/tenseleyFlow/shithub/internal/web/handlers/orgs"
18 "github.com/tenseleyFlow/shithub/internal/web/render"
19 )
20
21 // buildOrgHandlers wires the S30 organization handler set. Owns its
22 // own renderer (same pattern as the search/notif builders).
23 func buildOrgHandlers(
24 cfg config.Config,
25 pool *pgxpool.Pool,
26 tmplFS fs.FS,
27 logger *slog.Logger,
28 ) (*orgshandlers.Handlers, error) {
29 rr, err := render.New(tmplFS, render.Options{Octicons: render.BuiltinOcticons()})
30 if err != nil {
31 return nil, err
32 }
33 sender, _ := pickOrgsEmailSender(cfg)
34 return orgshandlers.New(orgshandlers.Deps{
35 Logger: logger,
36 Render: rr,
37 Pool: pool,
38 EmailSender: sender,
39 EmailFrom: cfg.Auth.EmailFrom,
40 SiteName: cfg.Auth.SiteName,
41 BaseURL: cfg.Auth.BaseURL,
42 })
43 }
44
45 // pickOrgsEmailSender mirrors pickEmailSender in auth_wiring.go.
46 // Kept local so a missing/misconfigured email backend doesn't crash
47 // the org surface — invitations still land in the DB; the email side
48 // is best-effort.
49 func pickOrgsEmailSender(cfg config.Config) (email.Sender, error) {
50 switch cfg.Auth.EmailBackend {
51 case "stdout":
52 return email.NewStdoutSender(os.Stdout), nil
53 case "smtp":
54 return &email.SMTPSender{
55 Addr: cfg.Auth.SMTP.Addr,
56 From: cfg.Auth.EmailFrom,
57 Username: cfg.Auth.SMTP.Username,
58 Password: cfg.Auth.SMTP.Password,
59 }, nil
60 case "postmark":
61 return &email.PostmarkSender{
62 ServerToken: cfg.Auth.Postmark.ServerToken,
63 From: cfg.Auth.EmailFrom,
64 HTTP: &http.Client{Timeout: 10 * time.Second},
65 }, nil
66 default:
67 return nil, errors.New("orgs: unknown email_backend")
68 }
69 }
70