package repo import ( "context" "log/slog" "time" "github.com/bluesky-social/indigo/api/atproto" "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 := session.FromContext(ctx) if sess == nil { l.Error("user session is missing in context") return nil, ErrForbidden } ownerDid := sess.Data.AccountDID l = l.With("did", ownerDid) repo := models.Repo{ Did: ownerDid.String(), 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 } atpclient := sess.APIClient() _, err = atproto.RepoPutRecord(ctx, atpclient, &atproto.RepoPutRecord_Input{ Collection: tangled.RepoNSID, Repo: repo.Did, }) 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") }