-1

I am creating a server instance that will upload a file using 2-legged auth. then modify its version compare them and deliver the results. So far I have created a working version to upload a document in chunks to a storage S3. At the end of my code, the client receives a 201 response from the items.postItem API. However, on my Bim 360 account, I don't see the file. i have followed the tutorial/ process here - (Autodesk-api)upload a file. Can someone help me?

The exact code of my server route

const router = require("express").Router();
const fs = require("fs");
const fsProm = require("fs/promises");
const path = require("path");
const { error } = require("console");
const axios = require("axios");
const ForgeSDK = require("forge-apis");
const HubsApi = new ForgeSDK.HubsApi(); //Hubs Client
const ProjectApi = new ForgeSDK.ProjectsApi(); //Projects Client
const BucketsApi = new ForgeSDK.BucketsApi(); //Buckets Client
const ObjectsApi = new ForgeSDK.ObjectsApi(); //Objects Client
const ItemsApi = new ForgeSDK.ItemsApi(); //items client
let token = require("../tokens/sdkToken");
let hubs = require("../data/hubs");
let projects = require("../data/projects");
let folders = require("../data/folders");
/////////////////////////////////////////////////
function writeObj(object, name) {
  let cwdString = process.cwd().toString();
  file = "";
  file += "{\n";
  Object.keys(object).map((key) => {
    file += key + " : " + String(object[key]) + "\n ";
  });
  file += "}\n";
  let combinedName = cwdString + "/tokens/" + name;
  fs.writeFileSync(combinedName, file);
}
function readChunks(file, loops, arr2stash, chunkZ) {
  let fileDescriptor = 0;
  fs.open(file, "r", (err, fd) => {
    if (err) {
      throw err;
    }
    fileDescriptor = fd;
    for (let i = 0; i < loops; i++) {
      console.log("iteration:" + i);
      let b = Buffer.alloc(chunkZ);
      fs.read(fd, b, 0, chunkZ, null, function (err, xread) {
        if (err) throw err;
        let data;
        if (xread < chunkZ) {
          data = b.subarray(0, xread);
        } else {
          data = b;
        }
        arr2stash.push(data);
      });
    }
    console.log("finishedLoop in rc");
  });
  fs.close(fileDescriptor, function (err) {
    if (err) throw err;
    console.log("file closed");
  });
}
async function chunkFileVersions(path1, path2) {
  let fArr1 = [];
  let fArr2 = [];
  let chunkSize = 10 * 1024 * 1024;
  let stat1 = Math.ceil((await fsProm.stat(path1)).size / chunkSize);
  let stat2 = Math.ceil((await fsProm.stat(path2)).size / chunkSize);
  let tot1 = await fsProm.stat(path1).size;
  let tot2 = await fsProm.stat(path2).size;
  console.log("#ofChunks", stat1, stat2);
  readChunks(path1, stat1, fArr1, chunkSize);
  readChunks(path2, stat2, fArr2, chunkSize);
  return [fArr1, stat1, fArr2, stat2, tot1, tot2];
}
// Initialize the 2-legged OAuth2 client, set specific scopes and optionally set the `autoRefresh` parameter to true
//If you want the token to auto refresh
const autoRefresh = true; // or false
let oAuth2TwoLegged = new ForgeSDK.AuthClientTwoLegged(
  process.env.FORGE_CLIENT_ID,
  process.env.FORGE_CLIENT_SECRET,
  [
    "data:read",
    "data:write",
    "data:create",
    "data:search",
    "bucket:create",
    "bucket:read",
    "bucket:update",
    "bucket:delete",
  ],
  autoRefresh
);
//////////////////////////////////////////////////////////////////////
router.get("/b360", function (req, res) {
  oAuth2TwoLegged.authenticate().then(
    async function (credentials) {
      // The `credentials` object contains an access_token that is being used to call the endpoints.
      // In addition, this object is applied globally on the oAuth2TwoLegged client that you should use when calling secure endpoints.
      token.access_token = credentials.access_token;
      token.token_type = credentials.token_type;
      token.expires_in = credentials.expires_in;
      token.expires_at = credentials.expires_at;
      console.log(credentials);
      //get hub id
      HubsApi.getHubs({}, oAuth2TwoLegged, token).then(
        (hubsRes) => {
          //console.log(hubsRes);
          hubs.id = hubsRes.body.data[0].id;
          // find project id
          ProjectApi.getHubProjects(hubs.id, {}, oAuth2TwoLegged, token).then(
            (resP) => {
              let objs = resP.body.data;
              objs.forEach((obj) => {
                if ((obj.attributes.name = "tester")) {
                  projects.project = obj.id;
                }
              });
              ProjectApi.getProjectTopFolders(
                hubs.id,
                projects.project,
                oAuth2TwoLegged,
                token
              ).then(
                async (topfoldersRes) => {
                  console.log("tpFolds");
                  let folds = topfoldersRes.body.data;
                  folds.forEach((obj) => {
                    if ((obj.attributes.name = "compareTest")) {
                      folders.folder = obj.id;
                    }
                  });
                  let pth = process.cwd() + "/files/CapeCod3.rvt";
                  let pth2 = process.cwd() + "/files/CapeCod3.0001.rvt";
                  let filed = await chunkFileVersions(pth,pth2);
                  let pStr = {
                    jsonapi: { version: "1.0" },
                    data: {
                      type: "objects",
                      attributes: {
                        name: "4.rvt",
                      },
                      relationships: {
                        target: {
                          data: { type: "folders", id: folders.folder },
                        },
                      },
                    },
                  };
                  ProjectApi.postStorage(
                    projects.project,
                    pStr,
                    oAuth2TwoLegged,
                    token
                  ).then(
                    (pstoreRes) => {
                      console.log(
                        "---------------------------------------------"
                      );
                      console.log(pstoreRes.body);
                      console.log(
                        "-----------------------------------------------"
                      );
                      let breakMeUp = pstoreRes.body.data.id;
                      let sp1 = breakMeUp.split("/");
                      let objKey = sp1[1];
                      let sp2 = sp1[0].split(":");
                      let bukKey = sp2[3];
                      console.log(bukKey, objKey);
                      ObjectsApi.getS3UploadURL(
                        bukKey,
                        objKey,
                        {parts:filed[1], minutesExpiration: 15 },
                        oAuth2TwoLegged,
                        token
                      ).then(
                        async (urlRes) => {
                          let uplKey = urlRes.body.uploadKey;
                          let urls = urlRes.body.urls;
                          console.log(
                            "--------------------------------------------------------------------"
                          );
                          console.log(urls[0]);
                          console.log(
                            "---------------------------------------------------------------------"
                          );
                          let chunResponces=[];
                          let data1 = filed[0];
                         for(let i=0;i<filed[1];i++){
                           let banana = await axios({
                                method: "put",
                                url: urls[i],
                                data: data1[i],
                                onUploadProgress:function(progressEvent){
                                    console.log(progressEvent);
                                }
                              }).then((chunkRes)=>chunResponces.push(chunkRes),(err)=>{chunResponces.push(err)})
                         };
                              ObjectsApi.completeS3Upload(
                                bukKey,
                                objKey,
                                {uploadKey:uplKey},
                                {},
                                oAuth2TwoLegged,
                                token
                              ).then(
                                (compUpres) => {
                                  let dataObj = {
                                    jsonapi: { version: "1.0" },
                                    data: {
                                      type: "items",
                                      attributes: {
                                        displayName: "4.rvt",
                                        extension: {
                                          type: "items:autodesk.bim360:File",
                                          version: "1.0",
                                        },
                                      },
                                      relationships: {
                                        tip: {
                                          data: {
                                            type: "versions",
                                            id: "1",
                                          },
                                        },
                                        parent: {
                                          data: {
                                            type: "folders",
                                            id: folders.folder,
                                          },
                                        },
                                      },
                                    },
                                    included: [
                                      {
                                        type: "versions",
                                        id: "1",
                                        attributes: {
                                          name: "4.rvt",
                                          extension: {
                                            type: "versions:autodesk.bim360:File",
                                            version: "1.0",
                                          },
                                        },
                                        relationships: {
                                          storage: {
                                            data: {
                                              type: "objects",
                                              id: breakMeUp,
                                            },
                                          },
                                        },
                                      },
                                    ],
                                  };
                                  ItemsApi.postItem(
                                    projects.project,
                                    dataObj,
                                    oAuth2TwoLegged,
                                    token
                                  ).then((verRes)=>{res.json(verRes)},(err)=>{console.error(err);res.json(err);})
                                },
                                (err) => {
                                  console.error(err);
                                  res.json(err);
                                }
                              );
                        },
                        (err) => {
                          console.error(err);
                          res.json(err);
                        }
                      );
                    },
                    (err) => {
                      console.error(err);
                      res.json(err);
                    }
                  );
                },
                (err) => {
                  console.error(err);
                  res.json(err);
                }
              );
            },
            (err) => {
              console.error(err);
              res.json(err);
            }
          );
        },
        (err) => {
          console.error(err);
        }
      );
    },
    function (err) {
      console.error(err);
    }
  );
});
async function tellmemore(pathTo){
    let leng = (await fsProm.stat(pathTo)).size;
    let dt = Buffer.from(pathTo).toString('binary');
    let legB = (await fsProm.stat(dt)).size;
    return [dt,leng,legB]
};
module.exports = router;

  • In general, access BIM 360 Docs, and upload data, it requires the use of a 3-legged OAuth2 token. Also when you get a 201 means the Storage got created, but then you need to upload to that temporary storage. Are you using the logic built into the sdk to upload? I think your issue is the mix of storage locations and use of a 2 legged not being done correctly. – Jaime Rosales Aug 17 '23 at 23:39

0 Answers0