Skip to content

Commit 8fa75e4

Browse files
Merge branch 'staging' into ISSUE_5188
2 parents b396760 + 945c71b commit 8fa75e4

File tree

57 files changed

+766
-373
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+766
-373
lines changed

backend/VERSION.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
1-
{ "VERSION" : "5.13.1",
1+
{ "VERSION" : "5.14.1",
22
"unity" : {
3-
"current" : "2.20.0",
3+
"current" : "5.20.0",
44
"supported": []
55
},
66
"civil" :{
7-
"current" : "5.10.1",
8-
"supported": []
7+
"current" : "5.14.0",
8+
"supported": ["5.10.1"]
99
},
1010
"navis" :{
11-
"current" : "5.10.2",
12-
"supported": []
11+
"current" : "5.14.0",
12+
"supported": ["5.10.2"]
1313
},
1414
"revit" :{
15-
"current" : "5.10.1",
16-
"supported": []
15+
"current" : "5.14.0",
16+
"supported": ["5.10.1"]
1717
},
1818
"unitydll" : {
19-
"current": "4.4.0",
19+
"current": "5.4.0",
2020
"supported" : []
2121
},
2222
"vba" : {
2323
"current" : "5.8.0",
2424
"supported": []
2525
},
2626
"unreal" : {
27-
"current" : "1.2.2",
28-
"supported": ["1.2.1", "1.2.0", "1.0.1"]
27+
"current" : "5.2.2",
28+
"supported": []
2929
},
3030
"powerbi" : {
3131
"current": "5.10.0",

backend/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "3drepo.io",
3-
"version": "5.13.1",
3+
"version": "5.14.1",
44
"engines": {
55
"node": "18.x.x"
66
},
@@ -27,7 +27,7 @@
2727
"dependencies": {
2828
"@azure/msal-node": "1.18.4",
2929
"@elastic/elasticsearch": "7.17.14",
30-
"amqplib": "0.8.0",
30+
"amqplib": "0.10.5",
3131
"apidoc": "0.29.0",
3232
"app-config": "1.0.1",
3333
"archiver": "6.0.2",
@@ -54,7 +54,7 @@
5454
"file-type": "16.5.4",
5555
"geoip-lite": "1.4.10",
5656
"is-html-content": "1.0.0",
57-
"json2csv": "4.3.3",
57+
"json2csv": "4.5.4",
5858
"lodash": "4.17.21",
5959
"mime-types": "2.1.35",
6060
"moment": "2.30.1",

backend/src/v4/models/project.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
const responseCodes = require("../response_codes.js");
2525
const utils = require("../utils");
2626
const _ = require("lodash");
27-
const { changePermissions, findModelSettings, removePermissionsFromModels } = require("./modelSetting");
2827
const { publish } = require(`${v5Path}/services/eventsManager/eventsManager`);
2928
const { events } = require(`${v5Path}/services/eventsManager/eventsManager.constants`);
29+
const { changePermissions, prepareDefaultView, findModelSettings, findPermissionByUser, removePermissionsFromModels } = require("./modelSetting");
30+
const { getTeamspaceSettings } = require("./teamspaceSetting");
31+
const PermissionTemplates = require("./permissionTemplates");
3032

3133
const PROJECTS_COLLECTION_NAME = "projects";
3234

@@ -300,6 +302,49 @@
300302
return projects.map(p => p.name);
301303
};
302304

305+
Project.listModels = async function(account, project, username, filters) {
306+
const AccountPermissions = require("./accountPermissions");
307+
const ModelHelper = require("./helper/model");
308+
const [dbUser, projectObj] = await Promise.all([
309+
getTeamspaceSettings(account),
310+
Project.findOneProject(account, {name: project})
311+
]);
312+
if (!projectObj) {
313+
throw responseCodes.PROJECT_NOT_FOUND;
314+
}
315+
if (filters && filters.name) {
316+
filters.name = new RegExp(".*" + filters.name + ".*", "i");
317+
}
318+
let modelsSettings = await findModelSettings(account, { _id: { $in : projectObj.models }, ...filters});
319+
let permissions = [];
320+
const accountPerm = AccountPermissions.findByUser(dbUser, username);
321+
const projectPerm = projectObj.permissions.find(p=> p.user === username);
322+
if (accountPerm && accountPerm.permissions) {
323+
permissions = permissions.concat(ModelHelper.flattenPermissions(accountPerm.permissions));
324+
}
325+
if (projectPerm && projectPerm.permissions) {
326+
permissions = permissions.concat(ModelHelper.flattenPermissions(projectPerm.permissions));
327+
}
328+
modelsSettings = await Promise.all(modelsSettings.map(async setting => {
329+
const template = await findPermissionByUser(account, setting._id, username);
330+
let settingsPermissions = [];
331+
if(template) {
332+
const permissionTemplate = PermissionTemplates.findById(dbUser, template.permission);
333+
if (permissionTemplate && permissionTemplate.permissions) {
334+
settingsPermissions = settingsPermissions.concat(ModelHelper.flattenPermissions(permissionTemplate.permissions, true));
335+
}
336+
}
337+
setting = await prepareDefaultView(account, setting._id, setting);
338+
setting.permissions = _.uniq(permissions.concat(settingsPermissions));
339+
setting.model = setting._id;
340+
setting.account = account;
341+
setting.subModels = await ModelHelper.listSubModels(account, setting._id, C.MASTER_BRANCH_NAME);
342+
setting.headRevisions = {};
343+
return setting;
344+
}));
345+
return modelsSettings;
346+
};
347+
303348
Project.isProjectAdmin = async function(teamspace, model, user) {
304349
const projection = { "permissions": { "$elemMatch": { user: user } }};
305350
const project = await Project.findOneProject(teamspace, {models: model}, projection);

backend/src/v4/routes/apidoc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"version": "5.13.1"
2+
"version": "5.14.1"
33
}

backend/src/v4/routes/project.js

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"use strict";
1919
(function() {
2020

21+
const _ = require("lodash");
2122
const express = require("express");
2223
const router = express.Router({mergeParams: true});
2324
const responseCodes = require("../response_codes");
@@ -205,6 +206,133 @@
205206
*/
206207
router.patch("/projects/:project", middlewares.project.canUpdate, updateProject);
207208

209+
/**
210+
* @api {get} /:teamspace/projects/:project/models List models of the project
211+
* @apiName listModels
212+
* @apiGroup Project
213+
*
214+
* @apiDescription It returns a list of models .
215+
*
216+
* @apiPermission canListProjects
217+
*
218+
* @apiParam {String} teamspace Name of the teamspace
219+
* @apiParam {String} project The name of the project to list models
220+
*
221+
* @apiParam (Query) {String} [name] Filters models by name
222+
*
223+
*
224+
* @apiExample {get} Example usage:
225+
* GET /teamSpace1/projects/Bim%20Logo/models?name=log HTTP/1.1
226+
*
227+
* @apiSuccessExample {json} Success:
228+
* [
229+
* {
230+
* "_id": "5ce7dd19-1252-4548-a9c9-4a5414f2e0c5",
231+
* "federate": true,
232+
* "desc": "",
233+
* "name": "Full Logo",
234+
* "__v": 17,
235+
* "timestamp": "2019-05-02T16:17:37.902Z",
236+
* "type": "Federation",
237+
* "subModels": [
238+
* {
239+
* "database": "teamSpace1",
240+
* "model": "b1fceab8-b0e9-4e45-850b-b9888efd6521",
241+
* "name": "block"
242+
* },
243+
* {
244+
* "database": "teamSpace1",
245+
* "model": "7cf61b4f-acdf-4295-b2d0-9b45f9f27418",
246+
* "name": "letters"
247+
* },
248+
* {
249+
* "database": "teamSpace1",
250+
* "model": "2710bd65-37d3-4e7f-b2e0-ffe743ce943f",
251+
* "name": "pipes"
252+
* }
253+
* ],
254+
* "surveyPoints": [
255+
* {
256+
* "position": [
257+
* 0,
258+
* 0,
259+
* 0
260+
* ],
261+
* "latLong": [
262+
* -34.459127,
263+
* 0
264+
* ]
265+
* }
266+
* ],
267+
* "properties": {
268+
* "unit": "mm",
269+
* "topicTypes": [
270+
* {
271+
* "label": "Clash",
272+
* "value": "clash"
273+
* },
274+
* {
275+
* "label": "Diff",
276+
* "value": "diff"
277+
* },
278+
* {
279+
* "label": "RFI",
280+
* "value": "rfi"
281+
* },
282+
* {
283+
* "label": "Risk",
284+
* "value": "risk"
285+
* },
286+
* {
287+
* "label": "H&S",
288+
* "value": "hs"
289+
* },
290+
* {
291+
* "label": "Design",
292+
* "value": "design"
293+
* },
294+
* {
295+
* "label": "Constructibility",
296+
* "value": "constructibility"
297+
* },
298+
* {
299+
* "label": "GIS",
300+
* "value": "gis"
301+
* },
302+
* {
303+
* "label": "For information",
304+
* "value": "for_information"
305+
* },
306+
* {
307+
* "label": "VR",
308+
* "value": "vr"
309+
* }
310+
* ]
311+
* },
312+
* "permissions": [
313+
* "change_model_settings",
314+
* "upload_files",
315+
* "create_issue",
316+
* "comment_issue",
317+
* "view_issue",
318+
* "view_model",
319+
* "download_model",
320+
* "edit_federation",
321+
* "delete_federation",
322+
* "delete_model",
323+
* "manage_model_permission"
324+
* ],
325+
* "status": "ok",
326+
* "id": "5ce7dd19-1252-4548-a9c9-4a5414f2e0c5",
327+
* "model": "5ce7dd19-1252-4548-a9c9-4a5414f2e0c5",
328+
* "account": "teamSpace1",
329+
* "headRevisions": {
330+
* }
331+
* }
332+
* ] *
333+
*/
334+
router.get("/projects/:project/models", middlewares.project.canList, listModels);
335+
208336
/**
209337
* @api {get} /:teamspace/projects List projects
210338
* @apiName listProjects
@@ -446,6 +574,16 @@
446574
});
447575
}
448576

577+
function listModels(req, res, next) {
578+
const filters = _.pick(req.query, "name");
579+
const username = req.session.user.username;
580+
Project.listModels(req.params.account, req.params.project, username, filters).then(models => {
581+
responseCodes.respond(utils.APIInfo(req), req, res, next, responseCodes.OK, models);
582+
}).catch(err => {
583+
responseCodes.respond(utils.APIInfo(req), req, res, next, err, err);
584+
});
585+
}
586+
449587
module.exports = router;
450588

451589
}());

backend/src/v5/middleware/dataConverter/inputs/teamspaces/projects/models/commons/modelSettings.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@ const generateSchema = (newEntry, modelType, teamspace, project, modelId) => {
9595

9696
const commonProps = {
9797
name: newEntry ? name.required() : name,
98-
desc: types.strings.shortDescription,
99-
...(modelType === modelTypes.FEDERATION ? {} : { type: newEntry ? Yup.string().required() : Yup.string() }),
98+
desc: newEntry ? types.strings.shortDescription : types.strings.shortDescription.nullable(),
99+
...(modelType === modelTypes.FEDERATION ? {} : { type: newEntry ? Yup.string().required()
100+
: Yup.string() }),
100101
};
101102

102103
const schema = {
@@ -108,7 +109,7 @@ const generateSchema = (newEntry, modelType, teamspace, project, modelId) => {
108109
}
109110
: {
110111
unit: newEntry ? types.strings.unit.required() : types.strings.unit,
111-
code: types.strings.code,
112+
code: newEntry ? types.strings.code : types.strings.code.nullable(),
112113
surveyPoints: types.surveyPoints,
113114
angleFromNorth: types.degrees,
114115
...(newEntry

backend/src/v5/models/modelSettings.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,11 @@ Models.updateModelSettings = async (teamspace, project, model, data) => {
241241

242242
Object.keys(data).forEach((key) => {
243243
const value = data[key];
244-
if (value !== undefined && value !== null) {
244+
if (value === null) {
245+
if (key === 'unit' || key === 'code') {
246+
toUnset[`properties.${key}`] = 1;
247+
} else toUnset[key] = 1;
248+
} else if (value !== undefined) {
245249
if (key === 'unit' || key === 'code') {
246250
if (!toUpdate.properties) {
247251
toUpdate.properties = {};
@@ -250,8 +254,6 @@ Models.updateModelSettings = async (teamspace, project, model, data) => {
250254
} else {
251255
toUpdate[key] = value;
252256
}
253-
} else if (key === 'defaultView') {
254-
toUnset[key] = 1;
255257
}
256258
});
257259

0 commit comments

Comments
 (0)