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