package repo import ( "context" "github.com/bluesky-social/indigo/atproto/identity" "tangled.org/core/appview/db" "tangled.org/core/appview/models" "tangled.org/core/appview/pages/repoinfo" "tangled.org/core/appview/session" ) // MakeRepoInfo constructs [repoinfo.RepoInfo] object from given [models.Repo]. // // NOTE: [repoinfo.RepoInfo] is bad design and should be removed in future. // Avoid using this method if you can. func (s *Service) MakeRepoInfo( ctx context.Context, ownerId *identity.Identity, baseRepo *models.Repo, currentDir, ref string, ) repoinfo.RepoInfo { var ( repoAt = baseRepo.RepoAt() isStarred = false roles = repoinfo.RolesInRepo{} l = s.logger.With("method", "MakeRepoInfo").With("repoAt", repoAt) ) sess, ok := session.FromContext(ctx) if ok { isStarred = db.GetStarStatus(s.db, sess.User.Did, repoAt) roles.Roles = s.enforcer.GetPermissionsInRepo(sess.User.Did, baseRepo.Knot, baseRepo.DidSlashRepo()) } stats := baseRepo.RepoStats if stats == nil { starCount, err := db.GetStarCount(s.db, repoAt) if err != nil { l.Error("failed to get star count", "err", err) } issueCount, err := db.GetIssueCount(s.db, repoAt) if err != nil { l.Error("failed to get issue count", "err", err) } pullCount, err := db.GetPullCount(s.db, repoAt) if err != nil { l.Error("failed to get pull count", "err", err) } stats = &models.RepoStats{ StarCount: starCount, IssueCount: issueCount, PullCount: pullCount, } } var sourceRepo *models.Repo var err error if baseRepo.Source != "" { sourceRepo, err = db.GetRepoByAtUri(s.db, baseRepo.Source) if err != nil { l.Error("failed to get source repo", "source", baseRepo.Source, "err", err) } } return repoinfo.RepoInfo{ // this is basically a models.Repo OwnerDid: baseRepo.Did, OwnerHandle: ownerId.Handle.String(), // TODO: shouldn't use Name: baseRepo.Name, Rkey: baseRepo.Rkey, Description: baseRepo.Description, Website: baseRepo.Website, Topics: baseRepo.Topics, Knot: baseRepo.Knot, Spindle: baseRepo.Spindle, Stats: *stats, // fork repo upstream Source: sourceRepo, // repo path (context) CurrentDir: currentDir, Ref: ref, // info related to the session IsStarred: isStarred, Roles: roles, } }