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;