A vibe coded tangled fork which supports pijul.
at sl/shared-stacks 94 lines 2.1 kB view raw
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}