1package state
2
3import (
4 "context"
5 "fmt"
6 "log"
7 "net/http"
8
9 "github.com/bluesky-social/indigo/atproto/identity"
10 "github.com/bluesky-social/indigo/atproto/syntax"
11 "github.com/go-chi/chi/v5"
12 "github.com/go-git/go-git/v5/plumbing/object"
13 "github.com/sotangled/tangled/appview/auth"
14 "github.com/sotangled/tangled/appview/db"
15 "github.com/sotangled/tangled/appview/pages"
16)
17
18func fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) {
19 repoName := chi.URLParam(r, "repo")
20 knot, ok := r.Context().Value("knot").(string)
21 if !ok {
22 log.Println("malformed middleware")
23 return nil, fmt.Errorf("malformed middleware")
24 }
25 id, ok := r.Context().Value("resolvedId").(identity.Identity)
26 if !ok {
27 log.Println("malformed middleware")
28 return nil, fmt.Errorf("malformed middleware")
29 }
30
31 repoAt, ok := r.Context().Value("repoAt").(string)
32 if !ok {
33 log.Println("malformed middleware")
34 return nil, fmt.Errorf("malformed middleware")
35 }
36
37 parsedRepoAt, err := syntax.ParseATURI(repoAt)
38 if err != nil {
39 log.Println("malformed repo at-uri")
40 return nil, fmt.Errorf("malformed middleware")
41 }
42
43 // pass through values from the middleware
44 description, ok := r.Context().Value("repoDescription").(string)
45 addedAt, ok := r.Context().Value("repoAddedAt").(string)
46
47 return &FullyResolvedRepo{
48 Knot: knot,
49 OwnerId: id,
50 RepoName: repoName,
51 RepoAt: parsedRepoAt,
52 Description: description,
53 AddedAt: addedAt,
54 }, nil
55}
56
57func RolesInRepo(s *State, u *auth.User, f *FullyResolvedRepo) pages.RolesInRepo {
58 if u != nil {
59 r := s.enforcer.GetPermissionsInRepo(u.Did, f.Knot, f.OwnerSlashRepo())
60 return pages.RolesInRepo{r}
61 } else {
62 return pages.RolesInRepo{}
63 }
64}
65
66func uniqueEmails(commits []*object.Commit) []string {
67 emails := make(map[string]struct{})
68 for _, commit := range commits {
69 if commit.Author.Email != "" {
70 emails[commit.Author.Email] = struct{}{}
71 }
72 if commit.Committer.Email != "" {
73 emails[commit.Committer.Email] = struct{}{}
74 }
75 }
76 var uniqueEmails []string
77 for email := range emails {
78 uniqueEmails = append(uniqueEmails, email)
79 }
80 return uniqueEmails
81}
82
83func EmailToDidOrHandle(s *State, emails []string) map[string]string {
84 emailToDid, err := db.GetEmailToDid(s.db, emails)
85 if err != nil {
86 log.Printf("error fetching dids for emails: %v", err)
87 return nil
88 }
89
90 log.Println(emailToDid)
91 var dids []string
92 for _, v := range emailToDid {
93 dids = append(dids, v)
94 }
95 log.Println(dids)
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 log.Println(emailToDidOrHandle)
116
117 return emailToDidOrHandle
118}