forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Tangled
fork
Configure Feed
Select the types of activity you want to include in your feed.
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.OwnerSlashRepo())
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}