everything you need to create an atproto appview
1package server
2
3import (
4 "context"
5 "fmt"
6
7 clog "github.com/charmbracelet/log"
8 "tangled.org/oppi.li/atproto-starterkit/appview/config"
9 "tangled.org/oppi.li/atproto-starterkit/appview/db"
10 "tangled.org/oppi.li/atproto-starterkit/appview/oauth"
11 "tangled.org/oppi.li/atproto-starterkit/appview/pages"
12 "tangled.org/oppi.li/atproto-starterkit/idresolver"
13 "tangled.org/oppi.li/atproto-starterkit/log"
14)
15
16type Server struct {
17 db *db.DB
18 oauth *oauth.OAuth
19 idResolver *idresolver.Resolver
20 pages *pages.Pages
21 config *config.Config
22 logger *clog.Logger
23}
24
25func Make(ctx context.Context, config *config.Config) (*Server, error) {
26 logger := log.FromContext(ctx)
27
28 d, err := db.Make(ctx, config.Core.DbPath, log.SubLogger(logger, "db"))
29 if err != nil {
30 return nil, fmt.Errorf("failed to create db: %w", err)
31 }
32
33 res, err := idresolver.RedisResolver(config.Redis.ToURL(), config.Plc.PLCURL)
34 if err != nil {
35 logger.Error("failed to create redis resolver", "err", err)
36 res = idresolver.DefaultResolver(config.Plc.PLCURL)
37 }
38
39 oauth, err := oauth.New(config, res, log.SubLogger(logger, "oauth"))
40 if err != nil {
41 return nil, fmt.Errorf("failed to start oauth handler: %w", err)
42 }
43
44 pages := pages.New(res, config)
45
46 server := &Server{
47 d,
48 oauth,
49 res,
50 pages,
51 config,
52 logger,
53 }
54
55 return server, nil
56}
57
58func (s *Server) Close() error {
59 return s.db.Close()
60}