Skip to main content

Data Browsing

In this step we'll extend our server so that we can browse the content of other APS-based applications such as BIM 360 Docs or Autodesk Docs. We will basically follow the Data Management service's hierarchy of hubs, projects, folders, items, and versions:

Data Management structure

Browsing hubs

First, let's add a couple of helper methods for browsing through the hubs, projects, folders, items, and versions:

Let's implement the logic for browsing through the individual hubs, projects, folders, items, and versions. Add the following code to the end of the services/aps.js file:

services/aps.js
service.getHubs = async (accessToken) => {
const resp = await dataManagementClient.getHubs({ accessToken });
return resp.data;
};

service.getProjects = async (hubId, accessToken) => {
const resp = await dataManagementClient.getHubProjects(hubId, { accessToken });
return resp.data;
};

service.getProjectContents = async (hubId, projectId, folderId, accessToken) => {
if (!folderId) {
const resp = await dataManagementClient.getProjectTopFolders(hubId, projectId, { accessToken });
return resp.data;
} else {
const resp = await dataManagementClient.getFolderContents(projectId, folderId, { accessToken });
return resp.data;
}
};

service.getItemVersions = async (projectId, itemId, accessToken) => {
const resp = await dataManagementClient.getItemVersions(projectId, itemId, { accessToken });
return resp.data;
};

Server endpoints

Next, let's expose the new functionality to the client-side code through another set of endpoints.

Create a hubs.js file under the routes subfolder with the following content:

routes/hubs.js
const express = require('express');
const { authRefreshMiddleware, getHubs, getProjects, getProjectContents, getItemVersions } = require('../services/aps.js');

let router = express.Router();

router.use('/api/hubs', authRefreshMiddleware);

router.get('/api/hubs', async function (req, res, next) {
try {
const hubs = await getHubs(req.internalOAuthToken.access_token);
res.json(hubs.map(hub => ({ id: hub.id, name: hub.attributes.name })));
} catch (err) {
next(err);
}
});

router.get('/api/hubs/:hub_id/projects', async function (req, res, next) {
try {
const projects = await getProjects(req.params.hub_id, req.internalOAuthToken.access_token);
res.json(projects.map(project => ({ id: project.id, name: project.attributes.name })));
} catch (err) {
next(err);
}
});

router.get('/api/hubs/:hub_id/projects/:project_id/contents', async function (req, res, next) {
try {
const entries = await getProjectContents(req.params.hub_id, req.params.project_id, req.query.folder_id, req.internalOAuthToken.access_token);
res.json(entries.map(entry => ({ id: entry.id, name: entry.attributes.displayName, folder: entry.type === 'folders' })));
} catch (err) {
next(err);
}
});

router.get('/api/hubs/:hub_id/projects/:project_id/contents/:item_id/versions', async function (req, res, next) {
try {
const versions = await getItemVersions(req.params.project_id, req.params.item_id, req.internalOAuthToken.access_token);
res.json(versions.map(version => ({ id: version.id, name: version.attributes.createTime })));
} catch (err) {
next(err);
}
});

module.exports = router;

And mount the router to our server application by modifying server.js:

server.js
const express = require('express');
const session = require('cookie-session');
const { PORT, SERVER_SESSION_SECRET } = require('./config.js');

let app = express();
app.use(express.static('wwwroot'));
app.use(session({ secret: SERVER_SESSION_SECRET, maxAge: 24 * 60 * 60 * 1000 }));
app.use(require('./routes/auth.js'));
app.use(require('./routes/hubs.js'));
app.listen(PORT, () => console.log(`Server listening on port ${PORT}...`));

Try it out

And that's it for the server side. Time to try it out!

Start (or restart) the app from Visual Studio Code as usual, and navigate to http://localhost:8080/api/hubs in the browser. The server should respond with a JSON list of all the hubs you have access to. Try copying the ID of one of the hubs, and use it in another address: http://localhost:8080/api/hubs/your-hub-id/projects. In this case the server application should respond with a JSON list of all projects available under the specified hub.

info

If you skipped the login procedure in the previous step, or restarted your server application, you may need to go to http://localhost:8080/api/auth/login again to make sure that all the authentication data is available in cookies before testing the /api/hubs endpoint.

tip

If you are using Google Chrome, consider installing JSON Formatter or a similar extension to automatically format JSON responses.

Hubs Response