···55 "encoding/json"66 "fmt"77 "io"88- "log"98 "net/http"109 "net/url"1110 "time"···30313132// TODO: proper statuses here on early exit3233func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) {3434+ l := rp.logger.With("handler", "AttachArtifact")3535+3336 user := rp.oauth.GetMultiAccountUser(r)3437 tagParam := chi.URLParam(r, "tag")3538 f, err := rp.repoResolver.Resolve(r)3639 if err != nil {3737- log.Println("failed to get repo and knot", err)4040+ l.Error("failed to get repo and knot", "err", err)3841 rp.pages.Notice(w, "upload", "failed to upload artifact, error in repo resolution")3942 return4043 }41444245 tag, err := rp.resolveTag(r.Context(), f, tagParam)4346 if err != nil {4444- log.Println("failed to resolve tag", err)4747+ l.Error("failed to resolve tag", "err", err)4548 rp.pages.Notice(w, "upload", "failed to upload artifact, error in tag resolution")4649 return4750 }48514952 file, header, err := r.FormFile("artifact")5053 if err != nil {5151- log.Println("failed to upload artifact", err)5454+ l.Error("failed to upload artifact", "err", err)5255 rp.pages.Notice(w, "upload", "failed to upload artifact")5356 return5457 }···58575958 client, err := rp.oauth.AuthorizedClient(r)6059 if err != nil {6161- log.Println("failed to get authorized client", err)6060+ l.Error("failed to get authorized client", "err", err)6261 rp.pages.Notice(w, "upload", "failed to get authorized client")6362 return6463 }65646665 uploadBlobResp, err := xrpc.RepoUploadBlob(r.Context(), client, file, header.Header.Get("Content-Type"))6766 if err != nil {6868- log.Println("failed to upload blob", err)6767+ l.Error("failed to upload blob", "err", err)6968 rp.pages.Notice(w, "upload", "Failed to upload blob to your PDS. Try again later.")7069 return7170 }72717373- log.Println("uploaded blob", humanize.Bytes(uint64(uploadBlobResp.Blob.Size)), uploadBlobResp.Blob.Ref.String())7272+ l.Info("uploaded blob", "size", humanize.Bytes(uint64(uploadBlobResp.Blob.Size)), "blobRef", uploadBlobResp.Blob.Ref.String())74737574 rkey := tid.TID()7675 createdAt := time.Now()···9089 },9190 })9291 if err != nil {9393- log.Println("failed to create record", err)9292+ l.Error("failed to create record", "err", err)9493 rp.pages.Notice(w, "upload", "Failed to create artifact record. Try again later.")9594 return9695 }97969898- log.Println(putRecordResp.Uri)9797+ l.Debug("created record for blob", "aturi", putRecordResp.Uri)999810099 tx, err := rp.db.BeginTx(r.Context(), nil)101100 if err != nil {102102- log.Println("failed to start tx")101101+ l.Error("failed to start tx")103102 rp.pages.Notice(w, "upload", "Failed to create artifact. Try again later.")104103 return105104 }···119118120119 err = db.AddArtifact(tx, artifact)121120 if err != nil {122122- log.Println("failed to add artifact record to db", err)121121+ l.Error("failed to add artifact record to db", "err", err)123122 rp.pages.Notice(w, "upload", "Failed to create artifact. Try again later.")124123 return125124 }126125127126 err = tx.Commit()128127 if err != nil {129129- log.Println("failed to add artifact record to db")128128+ l.Error("failed to add artifact record to db")130129 rp.pages.Notice(w, "upload", "Failed to create artifact. Try again later.")131130 return132131 }···139138}140139141140func (rp *Repo) DownloadArtifact(w http.ResponseWriter, r *http.Request) {141141+ l := rp.logger.With("handler", "DownloadArtifact")142142+142143 f, err := rp.repoResolver.Resolve(r)143144 if err != nil {144144- log.Println("failed to get repo and knot", err)145145+ l.Error("failed to get repo and knot", "err", err)145146 http.Error(w, "failed to resolve repo", http.StatusInternalServerError)146147 return147148 }···153150154151 tag, err := rp.resolveTag(r.Context(), f, tagParam)155152 if err != nil {156156- log.Println("failed to resolve tag", err)153153+ l.Error("failed to resolve tag", "err", err)157154 rp.pages.Notice(w, "upload", "failed to upload artifact, error in tag resolution")158155 return159156 }···165162 orm.FilterEq("name", filename),166163 )167164 if err != nil {168168- log.Println("failed to get artifacts", err)165165+ l.Error("failed to get artifacts", "err", err)169166 http.Error(w, "failed to get artifact", http.StatusInternalServerError)170167 return171168 }172169173170 if len(artifacts) != 1 {174174- log.Printf("too many or too few artifacts found")171171+ l.Error("too many or too few artifacts found")175172 http.Error(w, "artifact not found", http.StatusNotFound)176173 return177174 }···180177181178 ownerId, err := rp.idResolver.ResolveIdent(r.Context(), f.Did)182179 if err != nil {183183- log.Println("failed to resolve repo owner did", f.Did, err)180180+ l.Error("failed to resolve repo owner did", f.Did, "err", err)184181 http.Error(w, "repository owner not found", http.StatusNotFound)185182 return186183 }···194191195192 req, err := http.NewRequest(http.MethodGet, url.String(), nil)196193 if err != nil {197197- log.Println("failed to create request", err)194194+ l.Error("failed to create request", "err", err)198195 http.Error(w, "failed to create request", http.StatusInternalServerError)199196 return200197 }···202199203200 resp, err := http.DefaultClient.Do(req)204201 if err != nil {205205- log.Println("failed to make request", err)202202+ l.Error("failed to make request", "err", err)206203 http.Error(w, "failed to make request to PDS", http.StatusInternalServerError)207204 return208205 }···218215219216 // stream the body directly to the client220217 if _, err := io.Copy(w, resp.Body); err != nil {221221- log.Println("error streaming response to client:", err)218218+ l.Error("error streaming response to client:", "err", err)222219 }223220}224221225222// TODO: proper statuses here on early exit226223func (rp *Repo) DeleteArtifact(w http.ResponseWriter, r *http.Request) {224224+ l := rp.logger.With("handler", "DeleteArtifact")225225+227226 user := rp.oauth.GetMultiAccountUser(r)228227 tagParam := chi.URLParam(r, "tag")229228 filename := chi.URLParam(r, "file")230229 f, err := rp.repoResolver.Resolve(r)231230 if err != nil {232232- log.Println("failed to get repo and knot", err)231231+ l.Error("failed to get repo and knot", "err", err)233232 return234233 }235234···246241 orm.FilterEq("name", filename),247242 )248243 if err != nil {249249- log.Println("failed to get artifacts", err)244244+ l.Error("failed to get artifacts", "err", err)250245 rp.pages.Notice(w, "remove", "Failed to delete artifact. Try again later.")251246 return252247 }···258253 artifact := artifacts[0]259254260255 if user.Active.Did != artifact.Did {261261- log.Println("user not authorized to delete artifact", err)256256+ l.Error("user not authorized to delete artifact", "err", err)262257 rp.pages.Notice(w, "remove", "Unauthorized deletion of artifact.")263258 return264259 }···269264 Rkey: artifact.Rkey,270265 })271266 if err != nil {272272- log.Println("failed to get blob from pds", err)267267+ l.Error("failed to get blob from pds", "err", err)273268 rp.pages.Notice(w, "remove", "Failed to remove blob from PDS.")274269 return275270 }276271277272 tx, err := rp.db.BeginTx(r.Context(), nil)278273 if err != nil {279279- log.Println("failed to start tx")274274+ l.Error("failed to start tx")280275 rp.pages.Notice(w, "remove", "Failed to delete artifact. Try again later.")281276 return282277 }···288283 orm.FilterEq("name", filename),289284 )290285 if err != nil {291291- log.Println("failed to remove artifact record from db", err)286286+ l.Error("failed to remove artifact record from db", "err", err)292287 rp.pages.Notice(w, "remove", "Failed to delete artifact. Try again later.")293288 return294289 }295290296291 err = tx.Commit()297292 if err != nil {298298- log.Println("failed to remove artifact record from db")293293+ l.Error("failed to remove artifact record from db")299294 rp.pages.Notice(w, "remove", "Failed to delete artifact. Try again later.")300295 return301296 }297297+298298+ l.Info("successfully deleted artifact", "tag", tagParam, "file", filename)302299303300 w.Write([]byte{})304301}305302306303func (rp *Repo) resolveTag(ctx context.Context, f *models.Repo, tagParam string) (*types.TagReference, error) {304304+ l := rp.logger.With("handler", "resolveTag")305305+307306 tagParam, err := url.QueryUnescape(tagParam)308307 if err != nil {309308 return nil, err···326317 xrpcBytes, err := tangled.RepoTags(ctx, xrpcc, "", 0, repo)327318 if err != nil {328319 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {329329- log.Println("failed to call XRPC repo.tags", xrpcerr)320320+ l.Error("failed to call XRPC repo.tags", "err", xrpcerr)330321 return nil, xrpcerr331322 }332332- log.Println("failed to reach knotserver", err)323323+ l.Error("failed to reach knotserver", "err", err)333324 return nil, err334325 }335326336327 var result types.RepoTagsResponse337328 if err := json.Unmarshal(xrpcBytes, &result); err != nil {338338- log.Println("failed to decode XRPC tags response", err)329329+ l.Error("failed to decode XRPC tags response", "err", err)339330 return nil, err340331 }341332