// Update the index.json file in the listings directory func (n *OpenBazaarNode) UpdateListingIndex(contract *pb.RicardianContract) error { type listingData struct { Hash string Name string } indexPath := path.Join(n.RepoPath, "root", "listings", "index.json") listingPath := path.Join(n.RepoPath, "root", "listings", contract.VendorListings[0].ListingName, "listing.json") // read existing file file, _ := ioutil.ReadFile(indexPath) listingHash, err := ipfs.AddFile(n.Context, listingPath) if err != nil { return err } ld := listingData{ Hash: listingHash, Name: contract.VendorListings[0].ListingName, } var index []listingData json.Unmarshal(file, &index) // Check to see if the listing we are adding already exists in the list. If so delete it. for i, d := range index { if d.Name != ld.Name { continue } if len(index) == 1 { index = []listingData{} break } index = append(index[:i], index[i+1:]...) } // Append our listing with the new hash to the list index = append(index, ld) // write it back to file f, err := os.Create(indexPath) if err != nil { return err } defer func() { if err := f.Close(); err != nil { panic(err) } }() j, jerr := json.MarshalIndent(index, "", " ") if jerr != nil { return jerr } _, werr := f.Write(j) if werr != nil { return werr } return nil }
func (i *restAPIHandler) PUTImage(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json") type ImgData struct { Directory string Filename string Image string } decoder := json.NewDecoder(r.Body) var images []ImgData err := decoder.Decode(&images) if err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, `{"success": false, "reason": "%s"}`, err) return } var imageHashes []string for _, img := range images { if err := os.MkdirAll(path.Join(i.node.RepoPath, "root", "listings", img.Directory), os.ModePerm); err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"success": false, "reason": "%s"}`, err) return } imgPath := path.Join(i.node.RepoPath, "root", "listings", img.Directory, img.Filename) out, err := os.Create(imgPath) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"success": false, "reason": "%s"}`, err) return } dec := base64.NewDecoder(base64.StdEncoding, strings.NewReader(img.Image)) defer out.Close() _, err = io.Copy(out, dec) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"success": false, "reason": "%s"}`, err) return } hash, aerr := ipfs.AddFile(i.node.Context, imgPath) if aerr != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"success": false, "reason": "%s"}`, aerr) return } imageHashes = append(imageHashes, hash+" "+img.Filename) } jsonHashes, err := json.Marshal(imageHashes) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"success": false, "reason": "%s"}`, err) return } fmt.Fprintf(w, `{"success": true, hashes: "%s"}`, string(jsonHashes)) }
func (s *SelfHostedStorage) Store(peerID peer.ID, ciphertext []byte) (ma.Multiaddr, error) { b := sha256.Sum256(ciphertext) hash := hex.EncodeToString(b[:]) filePath := path.Join(s.repoPath, "outbox", hash) f, err := os.Create(filePath) defer f.Close() if err != nil { return nil, err } _, ferr := f.Write(ciphertext) if ferr != nil { return nil, ferr } addr, err := ipfs.AddFile(s.context, filePath) if err != nil { return nil, err } maAddr, err := ma.NewMultiaddr("/ipfs/" + addr + "/") if err != nil { return nil, err } return maAddr, nil }