A vibe coded tangled fork which supports pijul.
1package repo
2
3import (
4 "context"
5 "log/slog"
6 "time"
7
8 "github.com/bluesky-social/indigo/api/atproto"
9 lexutil "github.com/bluesky-social/indigo/lex/util"
10 "tangled.org/core/api/tangled"
11 "tangled.org/core/appview/config"
12 "tangled.org/core/appview/db"
13 "tangled.org/core/appview/models"
14 "tangled.org/core/appview/session"
15 "tangled.org/core/rbac"
16 "tangled.org/core/tid"
17)
18
19type Service struct {
20 logger *slog.Logger
21 config *config.Config
22 db *db.DB
23 enforcer *rbac.Enforcer
24}
25
26func NewService(
27 logger *slog.Logger,
28 config *config.Config,
29 db *db.DB,
30 enforcer *rbac.Enforcer,
31) Service {
32 return Service{
33 logger,
34 config,
35 db,
36 enforcer,
37 }
38}
39
40// NewRepo creates a repository
41// It expects atproto session to be passed in `ctx`
42func (s *Service) NewRepo(ctx context.Context, name, description, knot string) (*models.Repo, error) {
43 l := s.logger.With("method", "NewRepo")
44 sess, ok := session.FromContext(ctx)
45 if !ok {
46 l.Error("user session is missing in context")
47 return nil, ErrForbidden
48 }
49
50 atpclient := sess.AtpClient
51 l = l.With("did", sess.User.Did)
52
53 repo := models.Repo{
54 Did: sess.User.Did,
55 Name: name,
56 Knot: knot,
57 Rkey: tid.TID(),
58 Description: description,
59 Created: time.Now(),
60 Labels: s.config.Label.DefaultLabelDefs,
61 }
62 l = l.With("aturi", repo.RepoAt())
63
64 tx, err := s.db.BeginTx(ctx, nil)
65 if err != nil {
66 l.Error("db.BeginTx failed", "err", err)
67 return nil, ErrDatabaseFail
68 }
69 defer tx.Rollback()
70
71 if err = db.AddRepo(tx, &repo); err != nil {
72 l.Error("db.AddRepo failed", "err", err)
73 return nil, ErrDatabaseFail
74 }
75
76 record := repo.AsRecord()
77 _, err = atproto.RepoPutRecord(ctx, atpclient, &atproto.RepoPutRecord_Input{
78 Repo: repo.Did,
79 Collection: tangled.RepoNSID,
80 Rkey: repo.Rkey,
81 Record: &lexutil.LexiconTypeDecoder{
82 Val: &record,
83 },
84 })
85 if err != nil {
86 l.Error("atproto.RepoPutRecord failed", "err", err)
87 return nil, ErrPDSFail
88 }
89 l.Info("wrote to PDS")
90
91 // knotclient, err := s.oauth.ServiceClient(
92 // )
93 panic("unimplemented")
94}