Monorepo for Tangled tangled.org

fix assoc bug

indices are unstable; switch to maps everywhere

Changed files
+43 -36
appview
db
pages
state
+10 -9
appview/db/email.go
··· 67 return did, nil 68 } 69 70 - func GetDidsForEmails(e Execer, ems []string) ([]string, error) { 71 if len(ems) == 0 { 72 - return []string{}, nil 73 } 74 75 // Create placeholders for the IN clause 76 placeholders := make([]string, len(ems)) 77 - args := make([]interface{}, len(ems)) 78 for i, em := range ems { 79 placeholders[i] = "?" 80 args[i] = em 81 } 82 83 query := ` 84 - select did 85 from emails 86 where email in (` + strings.Join(placeholders, ",") + `) 87 ` ··· 92 } 93 defer rows.Close() 94 95 - var dids []string 96 for rows.Next() { 97 - var did string 98 - if err := rows.Scan(&did); err != nil { 99 return nil, err 100 } 101 - dids = append(dids, did) 102 } 103 104 if err := rows.Err(); err != nil { 105 return nil, err 106 } 107 108 - return dids, nil 109 } 110 111 func GetVerificationCodeForEmail(e Execer, did string, email string) (string, error) {
··· 67 return did, nil 68 } 69 70 + func GetEmailToDid(e Execer, ems []string) (map[string]string, error) { 71 if len(ems) == 0 { 72 + return make(map[string]string), nil 73 } 74 75 // Create placeholders for the IN clause 76 placeholders := make([]string, len(ems)) 77 + args := make([]any, len(ems)) 78 for i, em := range ems { 79 placeholders[i] = "?" 80 args[i] = em 81 } 82 83 query := ` 84 + select email, did 85 from emails 86 where email in (` + strings.Join(placeholders, ",") + `) 87 ` ··· 92 } 93 defer rows.Close() 94 95 + assoc := make(map[string]string) 96 + 97 for rows.Next() { 98 + var email, did string 99 + if err := rows.Scan(&email, &did); err != nil { 100 return nil, err 101 } 102 + assoc[email] = did 103 } 104 105 if err := rows.Err(); err != nil { 106 return nil, err 107 } 108 109 + return assoc, nil 110 } 111 112 func GetVerificationCodeForEmail(e Execer, did string, email string) (string, error) {
+4 -3
appview/pages/templates/repo/commit.html
··· 20 21 <div class="flex items-center"> 22 <p class="text-sm text-gray-500"> 23 - {{ if index .EmailToDidOrHandle $commit.Author.Email }} 24 - {{ $handle := index .EmailToDidOrHandle $commit.Author.Email }} 25 - <a href="/@{{ $handle }}" class="no-underline hover:underline text-gray-500">@{{ $handle }}</a> 26 {{ else }} 27 <a href="mailto:{{ $commit.Author.Email }}" class="no-underline hover:underline text-gray-500">{{ $commit.Author.Name }}</a> 28 {{ end }}
··· 20 21 <div class="flex items-center"> 22 <p class="text-sm text-gray-500"> 23 + {{ $didOrHandle := index $.EmailToDidOrHandle $commit.Author.Email }} 24 + 25 + {{ if $didOrHandle }} 26 + <a href="/{{ $didOrHandle }}" class="no-underline hover:underline text-gray-500">{{ $didOrHandle }}</a> 27 {{ else }} 28 <a href="mailto:{{ $commit.Author.Email }}" class="no-underline hover:underline text-gray-500">{{ $commit.Author.Name }}</a> 29 {{ end }}
+3 -3
appview/pages/templates/repo/index.html
··· 164 class="mx-2 before:content-['·'] before:select-none" 165 ></span> 166 <span> 167 - {{ $handle := index $.EmailToDidOrHandle .Author.Email }} 168 <a 169 - href="{{ if $handle }}/@{{ $handle }}{{ else }}mailto:{{ .Author.Email }}{{ end }}" 170 class="text-gray-500 no-underline hover:underline" 171 - >{{ if $handle }}@{{ $handle }}{{ else }}{{ .Author.Name }}{{ end }}</a 172 > 173 </span> 174 <div
··· 164 class="mx-2 before:content-['·'] before:select-none" 165 ></span> 166 <span> 167 + {{ $didOrHandle := index $.EmailToDidOrHandle .Author.Email }} 168 <a 169 + href="{{ if $didOrHandle }}/{{ $didOrHandle }}{{ else }}mailto:{{ .Author.Email }}{{ end }}" 170 class="text-gray-500 no-underline hover:underline" 171 + >{{ if $didOrHandle }}{{ $didOrHandle }}{{ else }}{{ .Author.Name }}{{ end }}</a 172 > 173 </span> 174 <div
+8 -8
appview/pages/templates/repo/log.html
··· 25 </span> 26 <span class="mx-2 before:content-['·'] before:select-none"></span> 27 <span> 28 - {{ $handle := index $.EmailToDidOrHandle $commit.Author.Email }} 29 - {{ if $handle }} 30 <a 31 - href="/@{{ $handle }}" 32 class="text-gray-500 no-underline hover:underline" 33 - >@{{ $handle }}</a 34 > 35 {{ else }} 36 <a ··· 105 class="mx-2 before:content-['·'] before:select-none" 106 ></span> 107 <span> 108 - {{ $handle := index $.EmailToDidOrHandle .Author.Email }} 109 - {{ if $handle }} 110 <a 111 - href="/@{{ $handle }}" 112 class="text-gray-500 no-underline hover:underline" 113 - >@{{ $handle }}</a 114 > 115 {{ else }} 116 <a
··· 25 </span> 26 <span class="mx-2 before:content-['·'] before:select-none"></span> 27 <span> 28 + {{ $didOrHandle := index $.EmailToDidOrHandle $commit.Author.Email }} 29 + {{ if $didOrHandle }} 30 <a 31 + href="/{{ $didOrHandle }}" 32 class="text-gray-500 no-underline hover:underline" 33 + >{{ $didOrHandle }}</a 34 > 35 {{ else }} 36 <a ··· 105 class="mx-2 before:content-['·'] before:select-none" 106 ></span> 107 <span> 108 + {{ $didOrHandle := index $.EmailToDidOrHandle .Author.Email }} 109 + {{ if $didOrHandle }} 110 <a 111 + href="/{{ $didOrHandle }}" 112 class="text-gray-500 no-underline hover:underline" 113 + >{{ $didOrHandle }}</a 114 > 115 {{ else }} 116 <a
+18 -13
appview/state/repo_util.go
··· 81 } 82 83 func EmailToDidOrHandle(s *State, emails []string) map[string]string { 84 - dids, err := db.GetDidsForEmails(s.db, emails) 85 if err != nil { 86 log.Printf("error fetching dids for emails: %v", err) 87 return nil 88 } 89 90 didHandleMap := make(map[string]string) 91 - emailToDid := make(map[string]string) 92 - resolvedIdents := s.resolver.ResolveIdents(context.Background(), dids) 93 - for i, resolved := range resolvedIdents { 94 - if resolved != nil { 95 - didHandleMap[dids[i]] = resolved.Handle.String() 96 - if i < len(emails) { 97 - emailToDid[emails[i]] = dids[i] 98 - } 99 } 100 } 101 102 // Create map of email to didOrHandle for commit display 103 emailToDidOrHandle := make(map[string]string) 104 for email, did := range emailToDid { 105 - if handle, ok := didHandleMap[did]; ok { 106 - emailToDidOrHandle[email] = handle 107 - } else { 108 - emailToDidOrHandle[email] = did 109 } 110 } 111 112 return emailToDidOrHandle 113 }
··· 81 } 82 83 func 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 }