package repo import ( "context" "log/slog" "time" "github.com/bluesky-social/indigo/api/atproto" lexutil "github.com/bluesky-social/indigo/lex/util" "tangled.org/core/api/tangled" "tangled.org/core/appview/config" "tangled.org/core/appview/db" "tangled.org/core/appview/models" "tangled.org/core/appview/session" "tangled.org/core/rbac" "tangled.org/core/tid" ) type Service struct { logger *slog.Logger config *config.Config db *db.DB enforcer *rbac.Enforcer } func NewService( logger *slog.Logger, config *config.Config, db *db.DB, enforcer *rbac.Enforcer, ) Service { return Service{ logger, config, db, enforcer, } } // NewRepo creates a repository // It expects atproto session to be passed in `ctx` func (s *Service) NewRepo(ctx context.Context, name, description, knot string) (*models.Repo, error) { l := s.logger.With("method", "NewRepo") sess, ok := session.FromContext(ctx) if !ok { l.Error("user session is missing in context") return nil, ErrForbidden } atpclient := sess.AtpClient l = l.With("did", sess.User.Did) repo := models.Repo{ Did: sess.User.Did, Name: name, Knot: knot, Rkey: tid.TID(), Description: description, Created: time.Now(), Labels: s.config.Label.DefaultLabelDefs, } l = l.With("aturi", repo.RepoAt()) tx, err := s.db.BeginTx(ctx, nil) if err != nil { l.Error("db.BeginTx failed", "err", err) return nil, ErrDatabaseFail } defer tx.Rollback() if err = db.AddRepo(tx, &repo); err != nil { l.Error("db.AddRepo failed", "err", err) return nil, ErrDatabaseFail } record := repo.AsRecord() _, err = atproto.RepoPutRecord(ctx, atpclient, &atproto.RepoPutRecord_Input{ Repo: repo.Did, Collection: tangled.RepoNSID, Rkey: repo.Rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &record, }, }) if err != nil { l.Error("atproto.RepoPutRecord failed", "err", err) return nil, ErrPDSFail } l.Info("wrote to PDS") // knotclient, err := s.oauth.ServiceClient( // ) panic("unimplemented") }