this repo has no description
1package state 2 3import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "log" 8 "net/http" 9 10 "github.com/bluesky-social/indigo/atproto/identity" 11 "github.com/go-chi/chi/v5" 12 "github.com/sotangled/tangled/appview/pages" 13 "github.com/sotangled/tangled/types" 14) 15 16func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) { 17 repoName, knot, id, err := repoKnotAndId(r) 18 if err != nil { 19 log.Println("failed to get repo and knot", err) 20 return 21 } 22 23 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s", knot, id.DID.String(), repoName)) 24 if err != nil { 25 log.Println("failed to reach knotserver", err) 26 return 27 } 28 defer resp.Body.Close() 29 30 body, err := io.ReadAll(resp.Body) 31 if err != nil { 32 log.Fatalf("Error reading response body: %v", err) 33 return 34 } 35 36 var result types.RepoIndexResponse 37 err = json.Unmarshal(body, &result) 38 if err != nil { 39 log.Fatalf("Error unmarshalling response body: %v", err) 40 return 41 } 42 43 log.Println(resp.Status, result) 44 45 s.pages.RepoIndexPage(w, pages.RepoIndexParams{ 46 LoggedInUser: s.auth.GetUser(r), 47 RepoInfo: pages.RepoInfo{ 48 OwnerDid: id.DID.String(), 49 OwnerHandle: id.Handle.String(), 50 Name: repoName, 51 Description: result.Description, 52 }, 53 RepoIndexResponse: result, 54 }) 55 56 return 57} 58 59func (s *State) RepoLog(w http.ResponseWriter, r *http.Request) { 60 repoName, knot, id, err := repoKnotAndId(r) 61 if err != nil { 62 log.Println("failed to get repo and knot", err) 63 return 64 } 65 66 ref := chi.URLParam(r, "ref") 67 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/log/%s", knot, id.DID.String(), repoName, ref)) 68 if err != nil { 69 log.Println("failed to reach knotserver", err) 70 return 71 } 72 73 body, err := io.ReadAll(resp.Body) 74 if err != nil { 75 log.Fatalf("Error reading response body: %v", err) 76 return 77 } 78 79 var result types.RepoLogResponse 80 err = json.Unmarshal(body, &result) 81 if err != nil { 82 log.Println("failed to parse json response", err) 83 return 84 } 85 86 s.pages.RepoLog(w, pages.RepoLogParams{ 87 LoggedInUser: s.auth.GetUser(r), 88 RepoInfo: pages.RepoInfo{ 89 OwnerDid: id.DID.String(), 90 OwnerHandle: id.Handle.String(), 91 Name: repoName, 92 Description: result.Description, 93 }, 94 RepoLogResponse: result, 95 }) 96 return 97} 98 99func (s *State) RepoCommit(w http.ResponseWriter, r *http.Request) { 100 repoName, knot, id, err := repoKnotAndId(r) 101 if err != nil { 102 log.Println("failed to get repo and knot", err) 103 return 104 } 105 106 ref := chi.URLParam(r, "ref") 107 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/commit/%s", knot, id.DID.String(), repoName, ref)) 108 if err != nil { 109 log.Println("failed to reach knotserver", err) 110 return 111 } 112 113 body, err := io.ReadAll(resp.Body) 114 if err != nil { 115 log.Fatalf("Error reading response body: %v", err) 116 return 117 } 118 119 var result types.RepoCommitResponse 120 err = json.Unmarshal(body, &result) 121 if err != nil { 122 log.Println("failed to parse response:", err) 123 return 124 } 125 126 s.pages.RepoCommit(w, pages.RepoCommitParams{ 127 LoggedInUser: s.auth.GetUser(r), 128 RepoInfo: pages.RepoInfo{ 129 OwnerDid: id.DID.String(), 130 OwnerHandle: id.Handle.String(), 131 Name: repoName, 132 }, 133 RepoCommitResponse: result, 134 }) 135 return 136} 137 138func (s *State) RepoTree(w http.ResponseWriter, r *http.Request) { 139 repoName, knot, id, err := repoKnotAndId(r) 140 if err != nil { 141 log.Println("failed to get repo and knot", err) 142 return 143 } 144 145 ref := chi.URLParam(r, "ref") 146 treePath := chi.URLParam(r, "*") 147 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/tree/%s/%s", knot, id.DID.String(), repoName, ref, treePath)) 148 if err != nil { 149 log.Println("failed to reach knotserver", err) 150 return 151 } 152 153 body, err := io.ReadAll(resp.Body) 154 if err != nil { 155 log.Fatalf("Error reading response body: %v", err) 156 return 157 } 158 159 var result types.RepoTreeResponse 160 err = json.Unmarshal(body, &result) 161 if err != nil { 162 log.Println("failed to parse response:", err) 163 return 164 } 165 166 log.Println(result) 167 168 s.pages.RepoTree(w, pages.RepoTreeParams{ 169 LoggedInUser: s.auth.GetUser(r), 170 RepoInfo: pages.RepoInfo{ 171 OwnerDid: id.DID.String(), 172 OwnerHandle: id.Handle.String(), 173 Name: repoName, 174 Description: result.Description, 175 }, 176 RepoTreeResponse: result, 177 }) 178 return 179} 180 181func (s *State) RepoTags(w http.ResponseWriter, r *http.Request) { 182 repoName, knot, id, err := repoKnotAndId(r) 183 if err != nil { 184 log.Println("failed to get repo and knot", err) 185 return 186 } 187 188 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/tags", knot, id.DID.String(), repoName)) 189 if err != nil { 190 log.Println("failed to reach knotserver", err) 191 return 192 } 193 194 body, err := io.ReadAll(resp.Body) 195 if err != nil { 196 log.Fatalf("Error reading response body: %v", err) 197 return 198 } 199 200 var result types.RepoTagsResponse 201 err = json.Unmarshal(body, &result) 202 if err != nil { 203 log.Println("failed to parse response:", err) 204 return 205 } 206 207 s.pages.RepoTags(w, pages.RepoTagsParams{ 208 LoggedInUser: s.auth.GetUser(r), 209 RepoInfo: pages.RepoInfo{ 210 OwnerDid: id.DID.String(), 211 OwnerHandle: id.Handle.String(), 212 Name: repoName, 213 }, 214 RepoTagsResponse: result, 215 }) 216 return 217} 218 219func (s *State) RepoBranches(w http.ResponseWriter, r *http.Request) { 220 repoName, knot, id, err := repoKnotAndId(r) 221 if err != nil { 222 log.Println("failed to get repo and knot", err) 223 return 224 } 225 226 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/branches", knot, id.DID.String(), repoName)) 227 if err != nil { 228 log.Println("failed to reach knotserver", err) 229 return 230 } 231 232 body, err := io.ReadAll(resp.Body) 233 if err != nil { 234 log.Fatalf("Error reading response body: %v", err) 235 return 236 } 237 238 var result types.RepoBranchesResponse 239 err = json.Unmarshal(body, &result) 240 if err != nil { 241 log.Println("failed to parse response:", err) 242 return 243 } 244 245 s.pages.RepoBranches(w, pages.RepoBranchesParams{ 246 LoggedInUser: s.auth.GetUser(r), 247 RepoInfo: pages.RepoInfo{ 248 OwnerDid: id.DID.String(), 249 OwnerHandle: id.Handle.String(), 250 Name: repoName, 251 }, 252 RepoBranchesResponse: result, 253 }) 254 return 255} 256 257func repoKnotAndId(r *http.Request) (string, string, identity.Identity, error) { 258 repoName := chi.URLParam(r, "repo") 259 knot, ok := r.Context().Value("knot").(string) 260 if !ok { 261 log.Println("malformed middleware") 262 return "", "", identity.Identity{}, fmt.Errorf("malformed middleware") 263 } 264 id, ok := r.Context().Value("resolvedId").(identity.Identity) 265 if !ok { 266 log.Println("malformed middleware") 267 return "", "", identity.Identity{}, fmt.Errorf("malformed middleware") 268 } 269 270 return repoName, knot, id, nil 271}