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 }, 52 RepoIndexResponse: result, 53 }) 54 55 return 56} 57 58func (s *State) RepoLog(w http.ResponseWriter, r *http.Request) { 59 repoName, knot, id, err := repoKnotAndId(r) 60 if err != nil { 61 log.Println("failed to get repo and knot", err) 62 return 63 } 64 65 ref := chi.URLParam(r, "ref") 66 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/log/%s", knot, id.DID.String(), repoName, ref)) 67 if err != nil { 68 log.Println("failed to reach knotserver", err) 69 return 70 } 71 72 body, err := io.ReadAll(resp.Body) 73 if err != nil { 74 log.Fatalf("Error reading response body: %v", err) 75 return 76 } 77 78 var result types.RepoLogResponse 79 err = json.Unmarshal(body, &result) 80 if err != nil { 81 log.Println("failed to parse json response", err) 82 return 83 } 84 85 s.pages.RepoLog(w, pages.RepoLogParams{ 86 LoggedInUser: s.auth.GetUser(r), 87 RepoInfo: pages.RepoInfo{ 88 OwnerDid: id.DID.String(), 89 OwnerHandle: id.Handle.String(), 90 Name: repoName, 91 }, 92 RepoLogResponse: result, 93 }) 94 return 95} 96 97func (s *State) RepoCommit(w http.ResponseWriter, r *http.Request) { 98 repoName, knot, id, err := repoKnotAndId(r) 99 if err != nil { 100 log.Println("failed to get repo and knot", err) 101 return 102 } 103 104 ref := chi.URLParam(r, "ref") 105 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/commit/%s", knot, id.DID.String(), repoName, ref)) 106 if err != nil { 107 log.Println("failed to reach knotserver", err) 108 return 109 } 110 111 body, err := io.ReadAll(resp.Body) 112 if err != nil { 113 log.Fatalf("Error reading response body: %v", err) 114 return 115 } 116 117 var result types.RepoCommitResponse 118 err = json.Unmarshal(body, &result) 119 if err != nil { 120 log.Println("failed to parse response:", err) 121 return 122 } 123 124 s.pages.RepoCommit(w, pages.RepoCommitParams{ 125 LoggedInUser: s.auth.GetUser(r), 126 RepoInfo: pages.RepoInfo{ 127 OwnerDid: id.DID.String(), 128 OwnerHandle: id.Handle.String(), 129 Name: repoName, 130 }, 131 RepoCommitResponse: result, 132 }) 133 return 134} 135 136func (s *State) RepoTree(w http.ResponseWriter, r *http.Request) { 137 repoName, knot, id, err := repoKnotAndId(r) 138 if err != nil { 139 log.Println("failed to get repo and knot", err) 140 return 141 } 142 143 ref := chi.URLParam(r, "ref") 144 treePath := chi.URLParam(r, "*") 145 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/tree/%s/%s", knot, id.DID.String(), repoName, ref, treePath)) 146 if err != nil { 147 log.Println("failed to reach knotserver", err) 148 return 149 } 150 151 body, err := io.ReadAll(resp.Body) 152 if err != nil { 153 log.Fatalf("Error reading response body: %v", err) 154 return 155 } 156 157 var result types.RepoTreeResponse 158 err = json.Unmarshal(body, &result) 159 if err != nil { 160 log.Println("failed to parse response:", err) 161 return 162 } 163 164 log.Println(result) 165 166 s.pages.RepoTree(w, pages.RepoTreeParams{ 167 LoggedInUser: s.auth.GetUser(r), 168 RepoInfo: pages.RepoInfo{ 169 OwnerDid: id.DID.String(), 170 OwnerHandle: id.Handle.String(), 171 Name: repoName, 172 }, 173 RepoTreeResponse: result, 174 }) 175 return 176} 177 178func (s *State) RepoTags(w http.ResponseWriter, r *http.Request) { 179 repoName, knot, id, err := repoKnotAndId(r) 180 if err != nil { 181 log.Println("failed to get repo and knot", err) 182 return 183 } 184 185 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/tags", knot, id.DID.String(), repoName)) 186 if err != nil { 187 log.Println("failed to reach knotserver", err) 188 return 189 } 190 191 body, err := io.ReadAll(resp.Body) 192 if err != nil { 193 log.Fatalf("Error reading response body: %v", err) 194 return 195 } 196 197 var result types.RepoTagsResponse 198 err = json.Unmarshal(body, &result) 199 if err != nil { 200 log.Println("failed to parse response:", err) 201 return 202 } 203 204 s.pages.RepoTags(w, pages.RepoTagsParams{ 205 LoggedInUser: s.auth.GetUser(r), 206 RepoInfo: pages.RepoInfo{ 207 OwnerDid: id.DID.String(), 208 OwnerHandle: id.Handle.String(), 209 Name: repoName, 210 }, 211 RepoTagsResponse: result, 212 }) 213 return 214} 215 216func (s *State) RepoBranches(w http.ResponseWriter, r *http.Request) { 217 repoName, knot, id, err := repoKnotAndId(r) 218 if err != nil { 219 log.Println("failed to get repo and knot", err) 220 return 221 } 222 223 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/branches", knot, id.DID.String(), repoName)) 224 if err != nil { 225 log.Println("failed to reach knotserver", err) 226 return 227 } 228 229 body, err := io.ReadAll(resp.Body) 230 if err != nil { 231 log.Fatalf("Error reading response body: %v", err) 232 return 233 } 234 235 var result types.RepoBranchesResponse 236 err = json.Unmarshal(body, &result) 237 if err != nil { 238 log.Println("failed to parse response:", err) 239 return 240 } 241 242 s.pages.RepoBranches(w, pages.RepoBranchesParams{ 243 LoggedInUser: s.auth.GetUser(r), 244 RepoInfo: pages.RepoInfo{ 245 OwnerDid: id.DID.String(), 246 OwnerHandle: id.Handle.String(), 247 Name: repoName, 248 }, 249 RepoBranchesResponse: result, 250 }) 251 return 252} 253 254func (s *State) RepoBlob(w http.ResponseWriter, r *http.Request) { 255 repoName, knot, id, err := repoKnotAndId(r) 256 if err != nil { 257 log.Println("failed to get repo and knot", err) 258 return 259 } 260 261 ref := chi.URLParam(r, "ref") 262 filePath := chi.URLParam(r, "*") 263 resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/blob/%s/%s", knot, id.DID.String(), repoName, ref, filePath)) 264 if err != nil { 265 log.Println("failed to reach knotserver", err) 266 return 267 } 268 269 body, err := io.ReadAll(resp.Body) 270 if err != nil { 271 log.Fatalf("Error reading response body: %v", err) 272 return 273 } 274 275 var result types.RepoBlobResponse 276 err = json.Unmarshal(body, &result) 277 if err != nil { 278 log.Println("failed to parse response:", err) 279 return 280 } 281 282 s.pages.RepoBlob(w, pages.RepoBlobParams{ 283 LoggedInUser: s.auth.GetUser(r), 284 RepoInfo: pages.RepoInfo{ 285 OwnerDid: id.DID.String(), 286 OwnerHandle: id.Handle.String(), 287 Name: repoName, 288 }, 289 RepoBlobResponse: result, 290 }) 291 return 292} 293 294func repoKnotAndId(r *http.Request) (string, string, identity.Identity, error) { 295 repoName := chi.URLParam(r, "repo") 296 knot, ok := r.Context().Value("knot").(string) 297 if !ok { 298 log.Println("malformed middleware") 299 return "", "", identity.Identity{}, fmt.Errorf("malformed middleware") 300 } 301 id, ok := r.Context().Value("resolvedId").(identity.Identity) 302 if !ok { 303 log.Println("malformed middleware") 304 return "", "", identity.Identity{}, fmt.Errorf("malformed middleware") 305 } 306 307 return repoName, knot, id, nil 308}