forked from tangled.org/core
this repo has no description
at master 3.4 kB view raw
1package state 2 3import ( 4 "context" 5 "crypto/rand" 6 "fmt" 7 "log" 8 "math/big" 9 "net/http" 10 11 "github.com/bluesky-social/indigo/atproto/identity" 12 "github.com/bluesky-social/indigo/atproto/syntax" 13 "github.com/go-chi/chi/v5" 14 "github.com/go-git/go-git/v5/plumbing/object" 15 "tangled.sh/tangled.sh/core/appview/auth" 16 "tangled.sh/tangled.sh/core/appview/db" 17 "tangled.sh/tangled.sh/core/appview/pages" 18) 19 20func fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) { 21 repoName := chi.URLParam(r, "repo") 22 knot, ok := r.Context().Value("knot").(string) 23 if !ok { 24 log.Println("malformed middleware") 25 return nil, fmt.Errorf("malformed middleware") 26 } 27 id, ok := r.Context().Value("resolvedId").(identity.Identity) 28 if !ok { 29 log.Println("malformed middleware") 30 return nil, fmt.Errorf("malformed middleware") 31 } 32 33 repoAt, ok := r.Context().Value("repoAt").(string) 34 if !ok { 35 log.Println("malformed middleware") 36 return nil, fmt.Errorf("malformed middleware") 37 } 38 39 parsedRepoAt, err := syntax.ParseATURI(repoAt) 40 if err != nil { 41 log.Println("malformed repo at-uri") 42 return nil, fmt.Errorf("malformed middleware") 43 } 44 45 // pass through values from the middleware 46 description, ok := r.Context().Value("repoDescription").(string) 47 addedAt, ok := r.Context().Value("repoAddedAt").(string) 48 49 return &FullyResolvedRepo{ 50 Knot: knot, 51 OwnerId: id, 52 RepoName: repoName, 53 RepoAt: parsedRepoAt, 54 Description: description, 55 AddedAt: addedAt, 56 }, nil 57} 58 59func RolesInRepo(s *State, u *auth.User, f *FullyResolvedRepo) pages.RolesInRepo { 60 if u != nil { 61 r := s.enforcer.GetPermissionsInRepo(u.Did, f.Knot, f.DidSlashRepo()) 62 return pages.RolesInRepo{r} 63 } else { 64 return pages.RolesInRepo{} 65 } 66} 67 68func uniqueEmails(commits []*object.Commit) []string { 69 emails := make(map[string]struct{}) 70 for _, commit := range commits { 71 if commit.Author.Email != "" { 72 emails[commit.Author.Email] = struct{}{} 73 } 74 if commit.Committer.Email != "" { 75 emails[commit.Committer.Email] = struct{}{} 76 } 77 } 78 var uniqueEmails []string 79 for email := range emails { 80 uniqueEmails = append(uniqueEmails, email) 81 } 82 return uniqueEmails 83} 84 85func EmailToDidOrHandle(s *State, emails []string) map[string]string { 86 emailToDid, err := db.GetEmailToDid(s.db, emails, true) // only get verified emails for mapping 87 if err != nil { 88 log.Printf("error fetching dids for emails: %v", err) 89 return nil 90 } 91 92 var dids []string 93 for _, v := range emailToDid { 94 dids = append(dids, v) 95 } 96 resolvedIdents := s.resolver.ResolveIdents(context.Background(), dids) 97 98 didHandleMap := make(map[string]string) 99 for _, identity := range resolvedIdents { 100 if !identity.Handle.IsInvalidHandle() { 101 didHandleMap[identity.DID.String()] = fmt.Sprintf("@%s", identity.Handle.String()) 102 } else { 103 didHandleMap[identity.DID.String()] = identity.DID.String() 104 } 105 } 106 107 // Create map of email to didOrHandle for commit display 108 emailToDidOrHandle := make(map[string]string) 109 for email, did := range emailToDid { 110 if didOrHandle, ok := didHandleMap[did]; ok { 111 emailToDidOrHandle[email] = didOrHandle 112 } 113 } 114 115 return emailToDidOrHandle 116} 117 118func randomString(n int) string { 119 const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 120 result := make([]byte, n) 121 122 for i := 0; i < n; i++ { 123 n, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letters)))) 124 result[i] = letters[n.Int64()] 125 } 126 127 return string(result) 128}