From 4eb6e47e2871ebb60f02638a18df58e9d43afc49 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Thu, 18 Jul 2019 18:24:57 +0800 Subject: [PATCH 01/16] added constant with estimation types ESTIMATION_TYPE --- src/constants.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/constants.js b/src/constants.js index 9f23b0a4..eaffc3b9 100644 --- a/src/constants.js +++ b/src/constants.js @@ -184,3 +184,10 @@ export const INVITE_STATUS = { }; export const MAX_PARALLEL_REQUEST_QTY = 10; + +export const ESTIMATION_TYPE = { + FEE: 'fee', + COMMUNITY: 'community', + TOPCODER_SERVICE: 'topcoder_service', + REFERENCE_PROGRAM: 'reference_program', +}; From 95074c72e167d182cb35effdfe6b17ee48c9d68d Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Mon, 12 Aug 2019 14:49:04 +0800 Subject: [PATCH 02/16] winning submission from challenge 30096338 --- .../20190720_project_building_block.sql | 66 + postman.json | 3787 ++++------------- src/constants.js | 10 + src/models/buildingBlock.js | 39 + src/models/projectEstimationItem.js | 59 + src/permissions/index.js | 2 + src/routes/index.js | 3 + src/routes/metadata/list.js | 2 + src/routes/metadata/list.spec.js | 52 +- src/routes/projectEstimationItems/list.js | 50 + .../projectEstimationItems/list.spec.js | 227 + src/routes/projects/create.js | 63 +- src/routes/projects/create.spec.js | 155 + swagger.yaml | 149 + 14 files changed, 1742 insertions(+), 2922 deletions(-) create mode 100644 migrations/20190720_project_building_block.sql create mode 100644 src/models/buildingBlock.js create mode 100644 src/models/projectEstimationItem.js create mode 100644 src/routes/projectEstimationItems/list.js create mode 100644 src/routes/projectEstimationItems/list.spec.js diff --git a/migrations/20190720_project_building_block.sql b/migrations/20190720_project_building_block.sql new file mode 100644 index 00000000..dbc2d0d6 --- /dev/null +++ b/migrations/20190720_project_building_block.sql @@ -0,0 +1,66 @@ +-- +-- CREATE NEW TABLE: +-- building_blocks +-- project_estimation_item +-- +CREATE TABLE building_blocks ( + id bigint NOT NULL, + "key" character varying(255) NOT NULL, + "config" json NOT NULL DEFAULT '{}'::json, + "privateConfig" json NOT NULL DEFAULT '{}'::json, + "deletedAt" timestamp with time zone, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "deletedBy" bigint, + "createdBy" bigint NOT NULL, + "updatedBy" bigint NOT NULL +); + +ALTER TABLE building_blocks + ADD CONSTRAINT building_blocks_key_uniq UNIQUE (key); + +CREATE SEQUENCE building_blocks_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE building_blocks_id_seq OWNED BY building_blocks.id; + +ALTER TABLE building_blocks + ALTER COLUMN id SET DEFAULT nextval('building_blocks_id_seq'); + +ALTER TABLE ONLY building_blocks + ADD CONSTRAINT building_blocks_pkey PRIMARY KEY (id); + +CREATE TABLE project_estimation_items ( + id bigint NOT NULL, + "projectEstimationId" bigint NOT NULL, + "price" double precision NOT NULL, + "type" character varying(255) NOT NULL, + "markupUsedReference" character varying(255) NOT NULL, + "markupUsedReferenceId" bigint NOT NULL, + "metadata" json NOT NULL DEFAULT '{}'::json, + "deletedAt" timestamp with time zone, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "deletedBy" bigint, + "createdBy" bigint NOT NULL, + "updatedBy" bigint NOT NULL +); + +CREATE SEQUENCE project_estimation_items_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE project_estimation_items_id_seq OWNED BY project_estimation_items.id; + +ALTER TABLE project_estimation_items + ALTER COLUMN id SET DEFAULT nextval('project_estimation_items_id_seq'); + +ALTER TABLE ONLY project_estimation_items + ADD CONSTRAINT project_estimation_items_pkey PRIMARY KEY (id); diff --git a/postman.json b/postman.json index 17ee5a26..23bb21c4 100644 --- a/postman.json +++ b/postman.json @@ -1,19 +1,24 @@ { + "variables": [], "info": { - "_postman_id": "efae2a9b-b869-4965-b889-3278870b29ea", "name": "tc-project-service", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + "_postman_id": "4cbbb8e2-9b2c-bbc1-69ca-ab37ec7d6329", + "description": "", + "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" }, "item": [ { "name": "Project Attachments", + "description": "", "item": [ { "name": "bookmarks", + "description": "", "item": [ { "name": " Create project without bookmarks", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -29,22 +34,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "description": "" }, "response": [] }, { "name": " Create project with valid bookmarks", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -60,22 +57,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"bookmarks\":[{\n \"title\":\"title1\",\n \"address\":\"address1\"\n },{\n \"title\":\"title2\",\n \"address\":\"address2\"\n }],\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "description": "" }, "response": [] }, { "name": " Create project with invalid bookmarks", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -91,22 +80,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"bookmarks\":[{\n \"title\":\"title1\",\n \"invalid\":3,\n \"address\":\"address1\"\n },{\n \"title\":\"title2\",\n \"address\":\"address2\"\n }],\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "description": "" }, "response": [] }, { "name": "get project", "request": { + "url": "{{api-url}}/v4/projects/2", "method": "GET", "header": [ { @@ -118,23 +99,18 @@ "value": "application/json" } ], - "url": { - "raw": "{{api-url}}/v4/projects/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update project with bookmarks", "request": { + "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -150,23 +126,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name\",\n \"bookmarks\":[{\n \"title\":\"title1\",\n \"address\":\"address1\"\n },{\n \"title\":\"title2\",\n \"address\":\"address2\"\n }]\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2" - ] - } + "description": "" }, "response": [] }, { "name": "Delete project all bookmarks null", "request": { + "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -182,23 +149,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name2\",\n \"bookmarks\":null\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2" - ] - } + "description": "" }, "response": [] }, { "name": "Update project with invalid bookmarks", "request": { + "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -214,23 +172,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name2\",\n \"bookmarks\":3\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2" - ] - } + "description": "" }, "response": [] }, { "name": "get projects with admin token", "request": { + "url": "{{api-url}}/v4/projects", "method": "GET", "header": [ { @@ -238,16 +187,11 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] } @@ -257,6 +201,7 @@ { "name": "Upload attachment", "request": { + "url": "{{api-url}}/v4/projects/7/attachments", "method": "POST", "header": [ { @@ -272,18 +217,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"title\": \"first attachment submission\",\n\t\t\"filePath\": \"asdjshdasdas/asdsadj/asdasd.png\",\n\t\t\"s3Bucket\": \"topcoder-project-service\",\n\t\t\"contentType\": \"application/png\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/attachments", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "attachments" - ] - }, "description": "Create an project attachment" }, "response": [] @@ -291,6 +224,7 @@ { "name": "Update attachment", "request": { + "url": "{{api-url}}/v4/projects/7/attachments/2", "method": "PATCH", "header": [ { @@ -306,19 +240,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"title\": \"first attachment submission updated\",\n\t\t\"description\": \"updated project attachment\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/attachments/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "attachments", - "2" - ] - }, "description": "Update project attachment" }, "response": [] @@ -326,6 +247,7 @@ { "name": "Delete attachment", "request": { + "url": "{{api-url}}/v4/projects/7/attachments/2", "method": "DELETE", "header": [ { @@ -341,19 +263,6 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/attachments/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "attachments", - "2" - ] - }, "description": "Delete a project attachment" }, "response": [] @@ -362,10 +271,12 @@ }, { "name": "Project With TemplateId issue", + "description": "", "item": [ { "name": "Create project with templateId (not existed)", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -381,22 +292,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project with templateId\",\n\t\t\"description\": \"Hello I am a test project with templateId\",\n\t\t\"type\": \"generic\",\n\t\t\"templateId\": 3000\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "description": "" }, "response": [] }, { "name": "Create project with templateId", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -412,16 +315,7 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"name\": \"test project with templateId\",\n \"description\": \"Hello I am a test project with templateId\",\n \"type\": \"generic\",\n \"templateId\": 3\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "description": "" }, "response": [] } @@ -429,10 +323,12 @@ }, { "name": "Project Members", + "description": "", "item": [ { "name": "Create project member with no payload", "request": { + "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -448,18 +344,6 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "members" - ] - }, "description": "Request payload is mandatory while creating project. If no request payload is specified this should result in 422 status code." }, "response": [] @@ -467,6 +351,7 @@ { "name": "Create project copilot with invalid userId", "request": { + "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -482,18 +367,6 @@ "mode": "raw", "raw": "{\n\"param\":{\n\t\"role\": \"copilot\"\n}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "members" - ] - }, "description": "Certain fields are mandatory while creating project. If invalid fields are specified this should result in 422 status code." }, "response": [] @@ -501,6 +374,7 @@ { "name": "Create project copilot with valid values", "request": { + "url": "{{api-url}}/v4/projects/7/members", "method": "POST", "header": [ { @@ -516,18 +390,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"userId\": 40051331,\n\t\t\"isPrimary\": true\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "members" - ] - }, "description": "If the request payload is valid, than project member should be created." }, "response": [] @@ -535,6 +397,7 @@ { "name": "Create project member, if user already registered", "request": { + "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -550,18 +413,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"userId\": 40051331,\n\t\t\"isPrimary\": true\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "members" - ] - }, "description": "If the request payload is valid and user is already registered with the specified role than this should result in 400." }, "response": [] @@ -569,6 +420,7 @@ { "name": "Create project manager with valid values", "request": { + "url": "{{api-url}}/v4/projects/7/members", "method": "POST", "header": [ { @@ -584,18 +436,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"manager\",\n\t\t\"userId\": 40051330,\n\t\t\"isPrimary\": true\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "members" - ] - }, "description": "If the request payload is valid, than project manager should be added. This should sync with the direct project is project is associated with direct project." }, "response": [] @@ -603,6 +443,7 @@ { "name": "Create project customer with valid values", "request": { + "url": "{{api-url}}/v4/projects/7/members", "method": "POST", "header": [ { @@ -618,18 +459,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"customer\",\n\t\t\"userId\": 40051332,\n\t\t\"isPrimary\": true\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "members" - ] - }, "description": "If the request payload is valid, than project customer should be added. This should sync with the direct project is project is associated with direct project." }, "response": [] @@ -637,6 +466,7 @@ { "name": "Update project member", "request": { + "url": "{{api-url}}/v4/projects/1/members/1", "method": "PATCH", "header": [ { @@ -652,19 +482,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"isPrimary\": true\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/members/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "members", - "1" - ] - }, "description": "Update a project's member." }, "response": [] @@ -672,6 +489,7 @@ { "name": "Update project member with isPrimary False", "request": { + "url": "{{api-url}}/v4/projects/1/members/1", "method": "PATCH", "header": [ { @@ -687,19 +505,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"isPrimary\": false\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/members/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "members", - "1" - ] - }, "description": "Update a project's member." }, "response": [] @@ -707,6 +512,7 @@ { "name": "wrong role", "request": { + "url": "{{api-url}}/v4/projects/3/members/5", "method": "PATCH", "header": [ { @@ -722,25 +528,14 @@ "mode": "raw", "raw": " {\n \"param\": {\n \"role\": \"wrong\"\n }\n } " }, - "url": { - "raw": "{{api-url}}/v4/projects/3/members/5", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "3", - "members", - "5" - ] - } + "description": "" }, "response": [] }, { "name": "Delete project member", "request": { + "url": "{{api-url}}/v4/projects/3/members/5", "method": "DELETE", "header": [ { @@ -756,19 +551,6 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/3/members/5", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "3", - "members", - "5" - ] - }, "description": "Delete a project's member" }, "response": [] @@ -776,6 +558,7 @@ { "name": "editing project member roles & primary option", "request": { + "url": "{{api-url}}/v4/projects/1/members/2", "method": "PATCH", "header": [ { @@ -791,19 +574,7 @@ "mode": "raw", "raw": " {\n \"param\": {\n \"role\": \"manager\",\n \"isPrimary\": true\n }\n } " }, - "url": { - "raw": "{{api-url}}/v4/projects/1/members/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "members", - "2" - ] - } + "description": "" }, "response": [] } @@ -811,10 +582,12 @@ }, { "name": "Projects", + "description": "Requests for all things projects.", "item": [ { "name": "Create project without payload", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -830,16 +603,6 @@ "mode": "raw", "raw": "{\n\t\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - }, "description": "Request body is mandatory while creating project. If invalid request body is supplied this should return 422 status code." }, "response": [] @@ -847,6 +610,7 @@ { "name": "Create project without valid name", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -862,16 +626,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - }, "description": "Certain fields are mandatory while creating project. If invalid request body is supplied this should return 422 status code." }, "response": [] @@ -879,6 +633,7 @@ { "name": "Create project with valid values", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -894,16 +649,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project\",\n\t\t\"description\": \"Hello I am a test project\",\n\t\t\"type\": \"generic\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - }, "description": "Valid request body. Project should be created successfully." }, "response": [] @@ -911,6 +656,7 @@ { "name": "Create project by inactive user", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -926,48 +672,39 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project\",\n\t\t\"description\": \"Hello I am a test project\",\n\t\t\"type\": \"generic\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - }, "description": "Valid request body. Project should be created successfully." }, "response": [] }, { - "name": "Get project by id", + "name": "Create project with project estimations", "request": { - "method": "GET", + "url": "{{api-url}}/v4/projects", + "method": "POST", "header": [ { "key": "Authorization", - "value": "Bearer {{jwt-token}}" + "value": "Bearer {{jwt-token}}", + "description": "" + }, + { + "key": "Content-Type", + "value": "application/json", + "description": "" } ], - "url": { - "raw": "{{api-url}}/v4/projects/7", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7" - ] + "body": { + "mode": "raw", + "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project\",\n\t\t\"description\": \"Hello I am a test project\",\n\t\t\"type\": \"generic\",\n\t\t\"estimation\": [{\n\t\t\t\"buildingBlockKey\": \"BLOCK_KEY\",\n\t\t\t \"conditions\": \"( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || ONLY_ONE_OS_DESKTOP || ONLY_ONE_OS_PROGRESSIVE) && SCREENS_COUNT_SMALL && CA_NEEDED)\",\n\t\t\t \"price\": 5000,\n\t\t\t \"quantity\": 10,\n\t\t\t \"minTime\": 35,\n\t\t\t \"maxTime\": 35,\n\t\t\t \"metadata\": {\n\t\t\t \"deliverable\": \"dev-qa\"\n\t\t\t }\n\t\t}]\n\t}\n}" }, - "description": "Get a project by id. project members and attachments should also be returned." + "description": "Valid request body. Project should be created successfully with project estimations." }, "response": [] }, { - "name": "Get project by id and request specific fields", + "name": "Get project by id", "request": { + "url": "{{api-url}}/v4/projects/7", "method": "GET", "header": [ { @@ -975,6 +712,17 @@ "value": "Bearer {{jwt-token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "Get a project by id. project members and attachments should also be returned." + }, + "response": [] + }, + { + "name": "Get project by id and request specific fields", + "request": { "url": { "raw": "{{api-url}}/v4/projects/1?fields=id,name,description,members.id,members.projectId", "host": [ @@ -990,7 +738,19 @@ "key": "fields", "value": "id,name,description,members.id,members.projectId" } - ] + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" }, "description": "Get a project by id. project members and attachments should also be returned. Only those fields which are specified should be returned." }, @@ -999,6 +759,7 @@ { "name": "List projects DB", "request": { + "url": "{{api-url}}/v4/projects/db", "method": "GET", "header": [ { @@ -1006,16 +767,9 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/db", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "db" - ] + "body": { + "mode": "raw", + "raw": "" }, "description": "List all the project with no filter. Default sort and limits are applied." }, @@ -1024,13 +778,6 @@ { "name": "List projects DB with limit and offset", "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], "url": { "raw": "{{api-url}}/v4/projects/db?limit=1&offset=1", "host": [ @@ -1050,15 +797,9 @@ "key": "offset", "value": "1" } - ] + ], + "variable": [] }, - "description": "List all the project with no filter. Limit of 1 and offset of 1 is applied" - }, - "response": [] - }, - { - "name": "List projects DB with filters applied", - "request": { "method": "GET", "header": [ { @@ -1066,10 +807,21 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/db?filter=type%3Dgeneric", - "host": [ - "{{api-url}}" + "body": { + "mode": "raw", + "raw": "" + }, + "description": "List all the project with no filter. Limit of 1 and offset of 1 is applied" + }, + "response": [] + }, + { + "name": "List projects DB with filters applied", + "request": { + "url": { + "raw": "{{api-url}}/v4/projects/db?filter=type%3Dgeneric", + "host": [ + "{{api-url}}" ], "path": [ "v4", @@ -1081,15 +833,9 @@ "key": "filter", "value": "type%3Dgeneric" } - ] + ], + "variable": [] }, - "description": "List all the project with filters applied. The filter string should be url encoded. Default limit and offset is applicable" - }, - "response": [] - }, - { - "name": "List projects DB with sort applied", - "request": { "method": "GET", "header": [ { @@ -1097,6 +843,17 @@ "value": "Bearer {{jwt-token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "List all the project with filters applied. The filter string should be url encoded. Default limit and offset is applicable" + }, + "response": [] + }, + { + "name": "List projects DB with sort applied", + "request": { "url": { "raw": "{{api-url}}/v4/projects/db?sort=type%20desc", "host": [ @@ -1112,15 +869,9 @@ "key": "sort", "value": "type%20desc" } - ] + ], + "variable": [] }, - "description": "List all the project with custom sort and no filter. Default sort and limits are applied. The sort string has to be url encoded. Sort is of type `key asc|desc`" - }, - "response": [] - }, - { - "name": "List projects DB and return specific fields", - "request": { "method": "GET", "header": [ { @@ -1128,6 +879,17 @@ "value": "Bearer {{jwt-token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "List all the project with custom sort and no filter. Default sort and limits are applied. The sort string has to be url encoded. Sort is of type `key asc|desc`" + }, + "response": [] + }, + { + "name": "List projects DB and return specific fields", + "request": { "url": { "raw": "{{api-url}}/v4/projects/db?fields=id,name,description", "host": [ @@ -1143,7 +905,19 @@ "key": "fields", "value": "id,name,description" } - ] + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" }, "description": "List all the project with no filter. Default sort and limits are applied. The fields to return is specified as comma separated list. Only those fields should be returned." }, @@ -1152,6 +926,7 @@ { "name": "List projects DB with copilot token", "request": { + "url": "{{api-url}}/v4/projects/db", "method": "GET", "header": [ { @@ -1159,23 +934,18 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/db", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "db" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "List projects", "request": { + "url": "{{api-url}}/v4/projects", "method": "GET", "header": [ { @@ -1183,15 +953,9 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] + "body": { + "mode": "raw", + "raw": "" }, "description": "List all the project with no filter. Default sort and limits are applied." }, @@ -1200,13 +964,6 @@ { "name": "List projects with limit and offset", "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], "url": { "raw": "{{api-url}}/v4/projects?limit=1&offset=1", "host": [ @@ -1225,15 +982,9 @@ "key": "offset", "value": "1" } - ] + ], + "variable": [] }, - "description": "List all the project with no filter. Limit of 1 and offset of 1 is applied" - }, - "response": [] - }, - { - "name": "List projects with filters applied", - "request": { "method": "GET", "header": [ { @@ -1241,6 +992,17 @@ "value": "Bearer {{jwt-token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "List all the project with no filter. Limit of 1 and offset of 1 is applied" + }, + "response": [] + }, + { + "name": "List projects with filters applied", + "request": { "url": { "raw": "{{api-url}}/v4/projects?filter=type%3Dgeneric", "host": [ @@ -1255,15 +1017,9 @@ "key": "filter", "value": "type%3Dgeneric" } - ] + ], + "variable": [] }, - "description": "List all the project with filters applied. The filter string should be url encoded. Default limit and offset is applicable" - }, - "response": [] - }, - { - "name": "List projects with sort applied", - "request": { "method": "GET", "header": [ { @@ -1271,6 +1027,17 @@ "value": "Bearer {{jwt-token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "List all the project with filters applied. The filter string should be url encoded. Default limit and offset is applicable" + }, + "response": [] + }, + { + "name": "List projects with sort applied", + "request": { "url": { "raw": "{{api-url}}/v4/projects?sort=type%20desc", "host": [ @@ -1285,15 +1052,9 @@ "key": "sort", "value": "type%20desc" } - ] + ], + "variable": [] }, - "description": "List all the project with custom sort and no filter. Default sort and limits are applied. The sort string has to be url encoded. Sort is of type `key asc|desc`" - }, - "response": [] - }, - { - "name": "List projects and return specific fields", - "request": { "method": "GET", "header": [ { @@ -1301,6 +1062,17 @@ "value": "Bearer {{jwt-token}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "List all the project with custom sort and no filter. Default sort and limits are applied. The sort string has to be url encoded. Sort is of type `key asc|desc`" + }, + "response": [] + }, + { + "name": "List projects and return specific fields", + "request": { "url": { "raw": "{{api-url}}/v4/projects?fields=id,name,description", "host": [ @@ -1315,7 +1087,19 @@ "key": "fields", "value": "id,name,description" } - ] + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" }, "description": "List all the project with no filter. Default sort and limits are applied. The fields to return is specified as comma separated list. Only those fields should be returned." }, @@ -1324,6 +1108,7 @@ { "name": "List projects with copilot token", "request": { + "url": "{{api-url}}/v4/projects", "method": "GET", "header": [ { @@ -1331,22 +1116,18 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "DELETE project by id", "request": { + "url": "{{api-url}}/v4/projects/3", "method": "DELETE", "header": [ { @@ -1358,17 +1139,6 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/3", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "3" - ] - }, "description": "Delete a project by id" }, "response": [] @@ -1376,6 +1146,7 @@ { "name": "Update project", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1391,17 +1162,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"name\": \"project name updated\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - }, "description": "Update the project name. Name should be updated successfully." }, "response": [] @@ -1409,6 +1169,7 @@ { "name": "Update project 403", "request": { + "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -1424,17 +1185,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"project name updated\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2" - ] - }, "description": "Update the project name. If user don't have permission to the project than it should return 403." }, "response": [] @@ -1442,6 +1192,7 @@ { "name": "Update project 404", "request": { + "url": "{{api-url}}/v4/projects/10", "method": "PATCH", "header": [ { @@ -1457,17 +1208,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"project name updated\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/10", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "10" - ] - }, "description": "Update the project name. If project is not found than this result in 404 status code." }, "response": [] @@ -1475,6 +1215,7 @@ { "name": "Update project status to in review", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1490,17 +1231,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"in_review\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - }, "description": "Update the project status." }, "response": [] @@ -1508,6 +1238,7 @@ { "name": "Update project status to reviewed", "request": { + "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1523,17 +1254,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"reviewed\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7" - ] - }, "description": "Update the project status." }, "response": [] @@ -1541,6 +1261,7 @@ { "name": "Update project status to paused", "request": { + "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1556,17 +1277,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"paused\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7" - ] - }, "description": "Update the project status." }, "response": [] @@ -1574,6 +1284,7 @@ { "name": "Update project status to cancelled with cancelReason", "request": { + "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1589,17 +1300,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"cancelled\",\n \"cancelReason\": \"price/cost\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7" - ] - }, "description": "Update the project status. While cancelling the project `cancelReason` is mandatory." }, "response": [] @@ -1607,6 +1307,7 @@ { "name": "Update project status to cancelled", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1622,17 +1323,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"status\": \"cancelled\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - }, "description": "Update the project status. While cancelling the project `cancelReason` is mandatory. If no `cancelReason` is supplied this should result in 422 status code." }, "response": [] @@ -1640,6 +1330,7 @@ { "name": "Update project status to completed", "request": { + "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1655,17 +1346,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"completed\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7" - ] - }, "description": "Update the project status." }, "response": [] @@ -1673,6 +1353,7 @@ { "name": "Move project out of cancel state.", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1688,17 +1369,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"status\": \"active\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - }, "description": "Move a project out of cancel state. Only admin and manager is allowed to do so." }, "response": [] @@ -1706,6 +1376,7 @@ { "name": "Move project out of cancel state 403", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1721,17 +1392,6 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"status\": \"active\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - }, "description": "Move a project out of cancel state. Only admin and manager is allowed to do so." }, "response": [] @@ -1739,6 +1399,7 @@ { "name": "Update project details", "request": { + "url": "{{api-url}}/v4/projects/8", "method": "PATCH", "header": [ { @@ -1754,17 +1415,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"details\": {\n \"summary\": \"project name updated\"\n }\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/8", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "8" - ] - }, "description": "Update the project details. This should fire specification modified event" }, "response": [] @@ -1772,6 +1422,7 @@ { "name": "Update project bookmarks", "request": { + "url": "{{api-url}}/v4/projects/8", "method": "PATCH", "header": [ { @@ -1787,17 +1438,6 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"bookmarks\": [\n {\n \"title\": \"test\",\n \"address\": \"http://topcoder.com\"\n }\n \n ]\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/8", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "8" - ] - }, "description": "Update the project bookmarks. This should fire project link created event" }, "response": [] @@ -1805,6 +1445,7 @@ { "name": "launch a project by topcoder managers ", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1820,23 +1461,14 @@ "mode": "raw", "raw": "{\n \n \"param\":{\n \"name\": \"updatedProject name\",\n \"status\": \"active\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "launch a project by member", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1852,23 +1484,14 @@ "mode": "raw", "raw": "{\n \n \"param\":{\n \"name\": \"updatedProject name\",\n \"status\": \"active\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "launch a project by copilot", "request": { + "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1884,29 +1507,20 @@ "mode": "raw", "raw": "{\n \n \"param\":{\n \"name\": \"updatedProject name\",\n \"status\": \"active\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1" - ] - } + "description": "" }, "response": [] } - ], - "description": "Requests for all things projects." + ] }, { "name": "EventHandling and Integration with Direct Project API", + "description": "", "item": [ { "name": "mock direct projects", "request": { + "url": "https://api.topcoder-dev.com/v3/direct/projects", "method": "GET", "header": [ { @@ -1918,26 +1532,18 @@ "value": "application/json" } ], - "url": { - "raw": "https://api.topcoder-dev.com/v3/direct/projects", - "protocol": "https", - "host": [ - "api", - "topcoder-dev", - "com" - ], - "path": [ - "v3", - "direct", - "projects" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": " Create direct project when a new project is successfully created", "request": { + "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -1953,22 +1559,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects" - ] - } + "description": "" }, "response": [] }, { "name": "Response error from direct project service", "request": { + "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -1984,24 +1582,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"userId\": 2, \n \"role\": \"copilot\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "members" - ] - } + "description": "" }, "response": [] }, { "name": " Add co-pilot when a co-pilot is added to a project", "request": { + "url": "{{api-url}}/v4/projects/2/members", "method": "POST", "header": [ { @@ -2017,24 +1605,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"userId\": 2, \n \"role\": \"copilot\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/2/members", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2", - "members" - ] - } + "description": "" }, "response": [] }, { "name": "remove copilot from direct project when editing project member role", "request": { + "url": "{{api-url}}/v4/projects/2/members/4", "method": "PATCH", "header": [ { @@ -2050,25 +1628,14 @@ "mode": "raw", "raw": " {\n \"param\": {\n \"role\": \"customer\",\n \"isPrimary\": true\n }\n } " }, - "url": { - "raw": "{{api-url}}/v4/projects/2/members/4", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2", - "members", - "4" - ] - } + "description": "" }, "response": [] }, { "name": " Sync billing account id with direct", "request": { + "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -2084,23 +1651,14 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name\"\n }\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2" - ] - } + "description": "" }, "response": [] }, { "name": "Delete co-pilot when a co-pilot is removed from a project", "request": { + "url": "{{api-url}}/v4/projects/2/members/4", "method": "DELETE", "header": [ { @@ -2116,52 +1674,20 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/2/members/4", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "2", - "members", - "4" - ] - } + "description": "" }, "response": [] } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "ef96ac6a-0fc0-4a64-a4fe-5390e17afe67", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "12f9d794-0872-4058-aafa-77b89e72025b", - "type": "text/javascript", - "exec": [ - "" - ] - } - } ] }, { "name": "Project Phase", + "description": "", "item": [ { "name": "Create Phase", "request": { + "url": "{{api-url}}/v4/projects/1/phases", "method": "POST", "header": [ { @@ -2177,24 +1703,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase\",\n\t\t\"status\": \"active\",\n\t\t\"startDate\": \"2018-05-15T00:00:00\",\n\t\t\"endDate\": \"2018-05-16T00:00:00\",\n\t\t\"budget\": 20,\n\t\t\"details\": {\n\t\t\t\"aDetails\": \"a details\"\n\t\t}\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases" - ] - } + "description": "" }, "response": [] }, { "name": "Create Phase with order", "request": { + "url": "{{api-url}}/v4/projects/1/phases", "method": "POST", "header": [ { @@ -2210,24 +1726,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase\",\n\t\t\"status\": \"active\",\n\t\t\"startDate\": \"2018-05-15T00:00:00\",\n\t\t\"endDate\": \"2018-05-16T00:00:00\",\n\t\t\"budget\": 20,\n\t\t\"details\": {\n\t\t\t\"aDetails\": \"a details\"\n\t\t},\n\t\t\"order\": 1\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases" - ] - } + "description": "" }, "response": [] }, { "name": "Create Phase with productTemplateId", "request": { + "url": "{{api-url}}/v4/projects/1/phases", "method": "POST", "header": [ { @@ -2243,24 +1749,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase\",\n\t\t\"status\": \"active\",\n\t\t\"startDate\": \"2018-05-15T00:00:00\",\n\t\t\"endDate\": \"2018-05-16T00:00:00\",\n\t\t\"budget\": 20,\n\t\t\"details\": {\n\t\t\t\"aDetails\": \"a details\"\n\t\t},\n\t\t\"order\": 1,\n\t\t\"productTemplateId\": 1\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases" - ] - } + "description": "" }, "response": [] }, { "name": "List Phase DB", "request": { + "url": "{{api-url}}/v4/projects/1/phases/db", "method": "GET", "header": [ { @@ -2272,36 +1768,17 @@ "value": "application/json" } ], - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/db", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "db" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "List Phase DB with fields", "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - }, - { - "key": "Content-Type", - "value": "application/json" - } - ], "url": { "raw": "{{api-url}}/v4/projects/1/phases/db?fields=status,name,budget", "host": [ @@ -2319,14 +1796,9 @@ "key": "fields", "value": "status,name,budget" } - ] - } - }, - "response": [] - }, - { - "name": "List Phase DB with sort", - "request": { + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -2338,6 +1810,17 @@ "value": "application/json" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "List Phase DB with sort", + "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases/db?sort=status desc", "host": [ @@ -2355,14 +1838,9 @@ "key": "sort", "value": "status desc" } - ] - } - }, - "response": [] - }, - { - "name": "List Phase DB with sort by order", - "request": { + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -2374,6 +1852,17 @@ "value": "application/json" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "List Phase DB with sort by order", + "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases/db?sort=order desc", "host": [ @@ -2391,14 +1880,9 @@ "key": "sort", "value": "order desc" } - ] - } - }, - "response": [] - }, - { - "name": "List Phase", - "request": { + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -2410,24 +1894,18 @@ "value": "application/json" } ], - "url": { - "raw": "{{api-url}}/v4/projects/1/phases", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { - "name": "List Phase with fields", + "name": "List Phase", "request": { + "url": "{{api-url}}/v4/projects/1/phases", "method": "GET", "header": [ { @@ -2439,6 +1917,17 @@ "value": "application/json" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "List Phase with fields", + "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases?fields=status,name,budget", "host": [ @@ -2455,14 +1944,9 @@ "key": "fields", "value": "status,name,budget" } - ] - } - }, - "response": [] - }, - { - "name": "List Phase with sort", - "request": { + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -2474,6 +1958,17 @@ "value": "application/json" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "List Phase with sort", + "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases?sort=status desc", "host": [ @@ -2490,14 +1985,9 @@ "key": "sort", "value": "status desc" } - ] - } - }, - "response": [] - }, - { - "name": "List Phase with sort by order", - "request": { + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -2509,6 +1999,17 @@ "value": "application/json" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "List Phase with sort by order", + "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases?sort=order desc", "host": [ @@ -2525,14 +2026,32 @@ "key": "sort", "value": "order desc" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get Phase", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1", "method": "GET", "header": [ { @@ -2544,25 +2063,18 @@ "value": "application/json" } ], - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update Phase", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1", "method": "PATCH", "header": [ { @@ -2578,25 +2090,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase xxx\",\n\t\t\"status\": \"inactive\",\n\t\t\"startDate\": \"2018-05-14T00:00:00\",\n\t\t\"endDate\": \"2018-05-15T00:00:00\",\n\t\t\"budget\": 30,\n\t\t\"progress\": 15,\n\t\t\"details\": {\n\t\t\t\"message\": \"phase details\"\n\t\t}\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update Phase with order", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1", "method": "PATCH", "header": [ { @@ -2612,25 +2113,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase xxx\",\n\t\t\"status\": \"inactive\",\n\t\t\"startDate\": \"2018-05-14T00:00:00\",\n\t\t\"endDate\": \"2018-05-15T00:00:00\",\n\t\t\"budget\": 30,\n\t\t\"progress\": 15,\n\t\t\"details\": {\n\t\t\t\"message\": \"phase details\"\n\t\t},\n\t\t\"order\": 1\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete Phase", "request": { + "url": "{{api-url}}/v4/projects/1/phases/3", "method": "DELETE", "header": [ { @@ -2646,19 +2136,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/3", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "3" - ] - } + "description": "" }, "response": [] } @@ -2666,10 +2144,12 @@ }, { "name": "Phase Products", + "description": "", "item": [ { "name": "Create Phase Product", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1/products", "method": "POST", "header": [ { @@ -2685,26 +2165,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test phase product\",\n\t\t\"type\": \"type 1\",\n\t\t\"estimatedPrice\": 10\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1/products", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1", - "products" - ] - } + "description": "" }, "response": [] }, { "name": "List Phase DB Products", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1/products/db", "method": "GET", "header": [ { @@ -2712,27 +2180,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1/products/db", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1", - "products", - "db" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "List Phase Products", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1/products", "method": "GET", "header": [ { @@ -2740,26 +2199,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1/products", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1", - "products" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get Phase Product", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1/products/1", "method": "GET", "header": [ { @@ -2767,27 +2218,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1/products/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1", - "products", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update Phase Product", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1/products/1", "method": "PATCH", "header": [ { @@ -2803,27 +2245,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test phase product xxx\",\n\t\t\"type\": \"type 2\",\n\t\t\"templateId\": 10,\n\t\t\"estimatedPrice\": 1.234567,\n\t\t\"actualPrice\": 2.34567,\n\t\t\"details\": {\n\t\t\t\"message\": \"this is a JSON type. You can use any json\"\n\t\t}\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1/products/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1", - "products", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete Phase Product", "request": { + "url": "{{api-url}}/v4/projects/1/phases/1/products/1", "method": "DELETE", "header": [ { @@ -2835,21 +2264,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/1/phases/1/products/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "phases", - "1", - "products", - "1" - ] - } + "description": "" }, "response": [] } @@ -2857,10 +2272,12 @@ }, { "name": "Project Templates", + "description": "", "item": [ { "name": "Create project template", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2876,24 +2293,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"scope\":{\r\n \"scope1\":\"scope 1\"\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\"\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create project template with form, priceConfig, planConfig", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2909,24 +2316,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create project template with only form key", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2942,24 +2339,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"dev\"\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create project template with wrong form key", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2975,24 +2362,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"wrong-key\"\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create project template with wrong model version", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -3008,24 +2385,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1123\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1123\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1123\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "List project templates", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "GET", "header": [ { @@ -3037,24 +2404,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get project template", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "GET", "header": [ { @@ -3066,25 +2427,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Upgrade a project template with from, priceConfig, planConfig", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/2/upgrade", "method": "POST", "header": [ { @@ -3100,26 +2454,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 2\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"qa\",\t\r\n \t \"version\": 2\t\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/2/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "2", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Upgrade a project template with wrong model version", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1/upgrade", "method": "POST", "header": [ { @@ -3135,26 +2477,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1234\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1234\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1234\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "1", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Upgrade a project template without define form, priceConfig, planConfig", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/3/upgrade", "method": "POST", "header": [ { @@ -3170,26 +2500,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{ \r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/3/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "3", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Update project template", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "PATCH", "header": [ { @@ -3205,25 +2523,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"scope\":{\r\n \"scope1\":\"scope 1\",\r\n \"scope2\": [\"a\"]\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\",\r\n \"phase2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update project template with define form, priceConfig, planConfig", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "PATCH", "header": [ { @@ -3239,25 +2546,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"form\": {\r\n \"key\": \"dev\",\r\n \"version\": 1\r\n },\r\n \"priceConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1\r\n },\r\n \"planConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update project template with wrong form, priceConfig, planConfig", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "PATCH", "header": [ { @@ -3273,25 +2569,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n\t\"form\": {\r\n \"key\": \"dev\",\r\n \"version\": 1123\r\n },\r\n \"priceConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1123\r\n },\r\n \"planConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1123\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete project template", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTemplates/2", "method": "DELETE", "header": [ { @@ -3307,19 +2592,7 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"new category\",\r\n \"scope\":{\r\n \"scope1\":\"scope 1\",\r\n \"scope2\": [\"a\"]\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\",\r\n \"phase2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTemplates", - "2" - ] - } + "description": "" }, "response": [] } @@ -3327,10 +2600,12 @@ }, { "name": "Product Templates", + "description": "", "item": [ { "name": "Create product template", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -3346,24 +2621,14 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"template\": {\r\n \"template1\": {\r\n \"name\": \"template 1\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 1\"\r\n },\r\n \"others\": [\"others 11\", \"others 12\"]\r\n },\r\n \"template2\": {\r\n \"name\": \"template 2\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 2\"\r\n },\r\n \"others\": [\"others 21\", \"others 22\"]\r\n }\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create product template with form", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -3379,24 +2644,14 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"form\": {\r\n\t\t\"key\": \"dev\",\r\n\t\t\"version\": 1\r\n\t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create product template with wrong form key", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -3412,24 +2667,14 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"form\": {\r\n\t\t\"key\": \"wrong-key\"\r\n\t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create product template with wrong model version", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -3445,24 +2690,14 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"form\": {\r\n\t\t\"key\": \"dev\",\r\n\t\t\"version\": 1123\r\n\t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "List product templates", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "GET", "header": [ { @@ -3474,24 +2709,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get product template", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates/3", "method": "GET", "header": [ { @@ -3503,25 +2732,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates/3", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates", - "3" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update product template", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates/1", "method": "PATCH", "header": [ { @@ -3537,25 +2759,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"productKey\":\"new productKey\",\r\n \"category\":\"key1\",\r\n \"icon\":\"http://example.com/icon-new.ico\",\r\n \"brief\": \"new brief\",\r\n \"details\": \"new details\",\r\n \"aliases\":{\r\n \"alias1\":\"scope 1\",\r\n \"alias2\": [\"a\"]\r\n },\r\n \"template\":{\r\n \"template1\":\"template 1\",\r\n \"template2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete product template", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates/1", "method": "DELETE", "header": [ { @@ -3571,25 +2782,14 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Upgrade a product template with form", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates/2/upgrade", "method": "POST", "header": [ { @@ -3607,26 +2807,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t\"version\": 2\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates/2/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates", - "2", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Upgrade a product template with wrong model version", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates/1/upgrade", "method": "POST", "header": [ { @@ -3644,26 +2832,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t\"version\": 1234\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates/1/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates", - "1", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Upgrade a product template without define form", "request": { + "url": "{{api-url}}/v4/projects/metadata/productTemplates/3/upgrade", "method": "POST", "header": [ { @@ -3681,20 +2857,7 @@ "mode": "raw", "raw": "{\r\n \"param\":{ \r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productTemplates/3/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productTemplates", - "3", - "upgrade" - ] - } + "description": "" }, "response": [] } @@ -3702,10 +2865,12 @@ }, { "name": "Project Type", + "description": "", "item": [ { "name": "Create project type", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTypes", "method": "POST", "header": [ { @@ -3721,24 +2886,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"key\": \"new key\",\r\n \"displayName\": \"new displayName\",\r\n \"icon\": \"http://example.com/icon4.ico\",\r\n \t\"question\": \"question 4\",\r\n \t\"info\": \"info 4\",\r\n \t\"aliases\": [\"key-41\", \"key_42\"],\r\n \t\"metadata\": {}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTypes", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTypes" - ] - } + "description": "" }, "response": [] }, { "name": "List project types", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTypes", "method": "GET", "header": [ { @@ -3750,24 +2905,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTypes", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTypes" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get project type", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTypes/generic", "method": "GET", "header": [ { @@ -3779,25 +2928,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTypes/generic", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTypes", - "generic" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update project type", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", "method": "PATCH", "header": [ { @@ -3813,25 +2955,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"displayName\": \"Chatbot-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTypes", - "chatbot" - ] - } + "description": "" }, "response": [] }, { "name": "Delete project type", "request": { + "url": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", "method": "DELETE", "header": [ { @@ -3847,19 +2978,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "projectTypes", - "chatbot" - ] - } + "description": "" }, "response": [] } @@ -3867,10 +2986,12 @@ }, { "name": "Product Category", + "description": "", "item": [ { "name": "Create product category", "request": { + "url": "{{api-url}}/v4/projects/metadata/productCategories", "method": "POST", "header": [ { @@ -3886,24 +3007,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"key\": \"generic\",\r\n \"displayName\": \"new displayName\",\r\n \"icon\": \"icon\",\r\n \"question\": \"question\",\r\n \"info\": \"info\",\r\n \"aliases\": [\"key-1\", \"key-2\"]\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productCategories", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productCategories" - ] - } + "description": "" }, "response": [] }, { "name": "List product categories", "request": { + "url": "{{api-url}}/v4/projects/metadata/productCategories", "method": "GET", "header": [ { @@ -3915,24 +3026,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productCategories", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productCategories" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get product category", "request": { + "url": "{{api-url}}/v4/projects/metadata/productCategories/generic", "method": "GET", "header": [ { @@ -3944,25 +3049,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productCategories/generic", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productCategories", - "generic" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update product category", "request": { + "url": "{{api-url}}/v4/projects/metadata/productCategories/generic", "method": "PATCH", "header": [ { @@ -3978,25 +3076,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"displayName\": \"Chatbot-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productCategories/generic", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productCategories", - "generic" - ] - } + "description": "" }, "response": [] }, { "name": "Delete product category", "request": { + "url": "{{api-url}}/v4/projects/metadata/productCategories/generic", "method": "DELETE", "header": [ { @@ -4012,62 +3099,20 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"new category\",\r\n \"scope\":{\r\n \"scope1\":\"scope 1\",\r\n \"scope2\": [\"a\"]\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\",\r\n \"phase2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/productCategories/generic", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "productCategories", - "generic" - ] - } + "description": "" }, "response": [] } - ], - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJhZG1pbmlzdHJhdG9yIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJwc2hhaDEiLCJleHAiOjI0NjI0OTQ2MTgsInVzZXJJZCI6IjQwMTM1OTc4IiwiaWF0IjoxNDYyNDk0MDE4LCJlbWFpbCI6InBzaGFoMUB0ZXN0LmNvbSIsImp0aSI6ImY0ZTFhNTE0LTg5ODAtNDY0MC04ZWM1LWUzNmUzMWE3ZTg0OSJ9.XuNN7tpMOXvBG1QwWRQROj7NfuUbqhkjwn39Vy4tR5I", - "type": "string" - } - ] - }, - "event": [ - { - "listen": "prerequest", - "script": { - "id": "f0092ef5-e624-4c25-87b2-b6a9e4c81ec8", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "9183c429-a5e0-4bf9-96a2-89f4d66e9b0d", - "type": "text/javascript", - "exec": [ - "" - ] - } - } ] }, { "name": "Project upgrade", + "description": "Request to migrate projects.", "item": [ { "name": "Migrate project", "request": { + "url": "{{api-url}}/v4/projects/6/upgrade", "method": "POST", "header": [ { @@ -4083,24 +3128,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/6/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "6", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Migrate project (completed)", "request": { + "url": "{{api-url}}/v4/projects/7/upgrade", "method": "POST", "header": [ { @@ -4116,24 +3151,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Migrate project with phase name", "request": { + "url": "{{api-url}}/v4/projects/6/upgrade", "method": "POST", "header": [ { @@ -4149,24 +3174,14 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3,\n\t\t\"phaseName\": \"Custom phase name\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/6/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "6", - "upgrade" - ] - } + "description": "" }, "response": [] }, { "name": "Migrate project with phase name (completed)", "request": { + "url": "{{api-url}}/v4/projects/7/upgrade", "method": "POST", "header": [ { @@ -4182,30 +3197,20 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3,\n\t\t\"phaseName\": \"Custom phase name\"\n\t}\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/7/upgrade", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "7", - "upgrade" - ] - } + "description": "" }, "response": [] } - ], - "description": "Request to migrate projects." + ] }, { "name": "Timeline", + "description": "", "item": [ { "name": "Create timeline", "request": { + "url": "{{api-url}}/v4/timelines", "method": "POST", "header": [ { @@ -4221,22 +3226,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"description\":\"new description\",\r\n \"startDate\":\"2018-05-29T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-30T00:00:00.000Z\",\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines" - ] - } + "description": "" }, "response": [] }, { "name": "Create timeline with templateId", "request": { + "url": "{{api-url}}/v4/timelines", "method": "POST", "header": [ { @@ -4252,22 +3249,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"description\":\"new description\",\r\n \"startDate\":\"2018-05-29T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-30T00:00:00.000Z\",\r\n \"reference\": \"project\",\r\n \"referenceId\": 1,\r\n \"templateId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines" - ] - } + "description": "" }, "response": [] }, { "name": "Create timeline with invalid data", "request": { + "url": "{{api-url}}/v4/timelines", "method": "POST", "header": [ { @@ -4283,33 +3272,13 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"startDate\":\"2018-05-29T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-28T00:00:00.000Z\",\r\n \"reference\": \"invalid\",\r\n \"referenceId\": 0\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines" - ] - } + "description": "" }, "response": [] }, { "name": "List timelines (filter by reference and referenceId)", "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token-copilot-40051332}}" - } - ], "url": { "raw": "{{api-url}}/v4/timelines?filter=reference%3Dphase%26referenceId%3D1", "host": [ @@ -4324,14 +3293,32 @@ "key": "filter", "value": "reference%3Dphase%26referenceId%3D1" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-copilot-40051332}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get timeline", "request": { + "url": "{{api-url}}/v4/timelines/1", "method": "GET", "header": [ { @@ -4343,23 +3330,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/timelines/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update timeline", "request": { + "url": "{{api-url}}/v4/timelines/1", "method": "PATCH", "header": [ { @@ -4375,23 +3357,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"timeline 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"startDate\": \"2018-05-01T00:00:00.000Z\",\r\n \"endDate\": null,\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update timeline (startDate)", "request": { + "url": "{{api-url}}/v4/timelines/1", "method": "PATCH", "header": [ { @@ -4407,23 +3380,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"timeline 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"startDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"endDate\": null,\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update timeline (endDate)", "request": { + "url": "{{api-url}}/v4/timelines/1", "method": "PATCH", "header": [ { @@ -4439,23 +3403,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"timeline 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"startDate\": \"2018-05-04T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete timeline", "request": { + "url": "{{api-url}}/v4/timelines/4", "method": "DELETE", "header": [ { @@ -4471,17 +3426,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/timelines/4", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "4" - ] - } + "description": "" }, "response": [] } @@ -4489,10 +3434,12 @@ }, { "name": "Milestone", + "description": "", "item": [ { "name": "Create milestone", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones", "method": "POST", "header": [ { @@ -4508,24 +3455,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 3\",\r\n \"description\": \"description 3\",\r\n \"duration\": 4,\r\n \"startDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"completionDate\": \"2018-05-08T00:00:00.000Z\",\r\n \"status\": \"open\",\r\n \"type\": \"type3\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 2,\r\n 3,\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 3\",\r\n \"activeText\": \"activeText 3\",\r\n \"completedText\": \"completedText 3\",\r\n \"blockedText\": \"blockedText 3\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones" - ] - } + "description": "" }, "response": [] }, { "name": "Create milestone with invalid data", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones", "method": "POST", "header": [ { @@ -4541,24 +3478,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"startDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-04T00:00:00.000Z\",\r\n \"completionDate\": \"2018-05-04T00:00:00.000Z\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones" - ] - } + "description": "" }, "response": [] }, { "name": "List milestones", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones", "method": "GET", "header": [ { @@ -4570,35 +3497,17 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "List milestones (sort)", "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token-copilot-40051332}}" - } - ], "url": { "raw": "{{api-url}}/v4/timelines/1/milestones?sort=order desc", "host": [ @@ -4615,14 +3524,32 @@ "key": "sort", "value": "order desc" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-copilot-40051332}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get milestone", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "GET", "header": [ { @@ -4634,25 +3561,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update milestone", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -4668,25 +3588,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-09-28T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone - paused", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -4702,25 +3611,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"status\": \"paused\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"statusComment\": \"milestone paused\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone - resume", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -4736,25 +3634,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"status\": \"resume\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"statusComment\": \"milestone resume\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (active)", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/2", "method": "PATCH", "header": [ { @@ -4770,25 +3657,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 2-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-10-28T00:00:00.000Z\",\r\n \"status\": \"active\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "2" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (completed)", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/2", "method": "PATCH", "header": [ { @@ -4804,25 +3680,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 2-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-10-28T00:00:00.000Z\",\r\n \"status\": \"completed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "2" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 1 => 2)", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -4838,25 +3703,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 2,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 2 => 1)", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -4872,25 +3726,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 1 => 3)", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -4906,25 +3749,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 3,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 3 => 1)", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -4940,25 +3772,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete milestone", "request": { + "url": "{{api-url}}/v4/timelines/1/milestones/2", "method": "DELETE", "header": [ { @@ -4974,19 +3795,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/timelines/1/milestones/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "1", - "milestones", - "2" - ] - } + "description": "" }, "response": [] } @@ -4994,10 +3803,12 @@ }, { "name": "Milestone Template", + "description": "", "item": [ { "name": "Create milestone template", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "POST", "header": [ { @@ -5013,24 +3824,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 3\",\r\n \"description\": \"description 3\",\r\n \"duration\": 33,\r\n \"type\": \"type3\",\r\n \"order\": 1,\r\n \"activeText\": \"activeText 1\",\r\n \"completedText\": \"completedText 1\",\r\n \"blockedText\": \"blockedText 1\",\r\n \"plannedText\": \"planned Text 1\",\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1,\r\n\t\"metadata\": {}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create milestone template with invalid referenceId", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "POST", "header": [ { @@ -5046,24 +3847,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 3\",\r\n \"description\": \"description 3\",\r\n \"duration\": 33,\r\n \"type\": \"type3\",\r\n \"order\": 1,\r\n \"activeText\": \"activeText 1\",\r\n \"completedText\": \"completedText 1\",\r\n \"blockedText\": \"blockedText 1\",\r\n \"plannedText\": \"planned Text 1\",\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1000,\r\n\t\"metadata\": {}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Create milestone template with invalid data", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "POST", "header": [ { @@ -5079,24 +3870,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates" - ] - } + "description": "" }, "response": [] }, { "name": "Clone milestone template", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", "method": "POST", "header": [ { @@ -5112,25 +3893,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"sourceReference\": \"productTemplate\",\r\n \"sourceReferenceId\": 1,\r\n \"reference\": \"productTemplate\",\r\n \"referenceId\": 2\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "clone" - ] - } + "description": "" }, "response": [] }, { "name": "Clone milestone template with invalid referenceId", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", "method": "POST", "header": [ { @@ -5146,25 +3916,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"sourceReference\": \"productTemplate\",\r\n \"sourceReferenceId\": 1,\r\n \"reference\": \"productTemplate\",\r\n \"referenceId\": 2000\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "clone" - ] - } + "description": "" }, "response": [] }, { "name": "Clone milestone template with invalid sourceReferenceId", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", "method": "POST", "header": [ { @@ -5180,25 +3939,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"sourceReference\": \"productTemplate\",\r\n \"sourceReferenceId\": 1000,\r\n \"reference\": \"productTemplate\",\r\n \"referenceId\": 2\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "clone" - ] - } + "description": "" }, "response": [] }, { "name": "List milestone templates", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "GET", "header": [ { @@ -5210,35 +3958,17 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "List milestone templates (filter)", "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token-copilot-40051332}}" - } - ], "url": { "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates?filter=reference%3DproductTemplate%26referenceId%3D1", "host": [ @@ -5255,14 +3985,9 @@ "key": "filter", "value": "reference%3DproductTemplate%26referenceId%3D1" } - ] - } - }, - "response": [] - }, - { - "name": "List milestone templates (sort)", - "request": { + ], + "variable": [] + }, "method": "GET", "header": [ { @@ -5274,6 +3999,17 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" + }, + "response": [] + }, + { + "name": "List milestone templates (sort)", + "request": { "url": { "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates?filter=reference%3DproductTemplate%26referenceId%3D1&sort=order desc", "host": [ @@ -5294,14 +4030,32 @@ "key": "sort", "value": "order desc" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-copilot-40051332}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get milestone template", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "GET", "header": [ { @@ -5313,25 +4067,18 @@ "value": "Bearer {{jwt-token}}" } ], - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Update milestone", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -5347,25 +4094,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\t\"name\": \"milestoneTemplate 1-updated\",\r\n\t\"description\": \"description 1-updated\",\r\n\t\"duration\": 34,\r\n\t\"type\": \"type1-updated\",\r\n\t\"order\": 1,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 1 => 2)", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -5381,25 +4117,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 1-updated\",\r\n \"description\": \"description 1-updated\",\r\n \"duration\": 34,\r\n \"type\": \"type1-updated\",\r\n \"order\": 2,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 2 => 1)", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -5415,25 +4140,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\t\"name\": \"milestoneTemplate 1-updated\",\r\n\t\"description\": \"description 1-updated\",\r\n\t\"duration\": 34,\r\n\t\"type\": \"type1-updated\",\r\n\t\"order\": 1,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 1 => 3)", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -5449,25 +4163,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 1-updated\",\r\n \"description\": \"description 1-updated\",\r\n \"duration\": 34,\r\n \"type\": \"type1-updated\",\r\n \"order\": 3,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone (order 3 => 1)", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -5483,25 +4186,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 1-updated\",\r\n \"description\": \"description 1-updated\",\r\n \"duration\": 34,\r\n \"type\": \"type1-updated\",\r\n \"order\": 1,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Update milestone with metadata", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -5517,25 +4209,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\t\"name\": \"milestoneTemplate 5-updated\",\r\n\t\"description\": \"description 5-updated\",\r\n\t\"duration\": 34,\r\n\t\"type\": \"type5-updated\",\r\n\t\"order\": 5,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1,\r\n\t\"metadata\": {\r\n \"metadata1\": {\r\n \"name\": \"metadata 1 - update\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 1 - update\",\r\n \"newDetails\": \"new\"\r\n },\r\n \"others\": [\"others new\"]\r\n },\r\n \"metadata3\": {\r\n \"name\": \"metadata 3\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 3\"\r\n },\r\n \"others\": [\"others 31\", \"others 32\"]\r\n }\r\n }\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete milestone", "request": { + "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/2", "method": "DELETE", "header": [ { @@ -5551,19 +4232,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/2", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "timelines", - "metadata", - "milestoneTemplates", - "2" - ] - } + "description": "" }, "response": [] } @@ -5571,57 +4240,28 @@ }, { "name": "Metadata", + "description": "", "item": [ { "name": "Get all metadata", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata", "method": "GET", "header": [ { - "key": "", - "value": "", - "type": "text" + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}", + "description": "" } ], - "url": { - "raw": "{{api-url}}/v4/projects/metadata", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata" - ] - } + "body": {}, + "description": "" }, "response": [] }, { "name": "Get all metadata with includeAllVersion", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, - "method": "GET", - "header": [], "url": { "raw": "{{api-url}}/v4/projects/metadata?includeAllReferred=true", "host": [ @@ -5637,8 +4277,16 @@ "key": "includeAllReferred", "value": "true" } - ] - } + ], + "variable": [] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] } @@ -5646,116 +4294,54 @@ }, { "name": "Form Version", + "description": "", "item": [ { "name": "List forms", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get a particular version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get latest version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Create form", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions", "method": "POST", "header": [ { @@ -5769,36 +4355,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions" - ] - } + "description": "" }, "response": [] }, { "name": "Update form", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", "method": "PATCH", "header": [ { @@ -5812,37 +4376,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test111\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete form", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", "method": "DELETE", "header": [ { @@ -5856,21 +4397,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions", - "1" - ] - } + "description": "" }, "response": [] } @@ -5878,89 +4405,40 @@ }, { "name": "Form Revision", + "description": "", "item": [ { "name": "List all revision for version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions", - "1", - "revisions" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get a particular revision", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions", - "1", - "revisions", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Create form", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", "method": "POST", "header": [ { @@ -5974,38 +4452,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions", - "1", - "revisions" - ] - } + "description": "" }, "response": [] }, { "name": "Create for no exist key", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/no-exist-2222key36/versions/1/revisions", "method": "POST", "header": [ { @@ -6019,38 +4473,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/no-exist-2222key36/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "no-exist-2222key36", - "versions", - "1", - "revisions" - ] - } + "description": "" }, "response": [] }, { "name": "Delete revision", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", "method": "DELETE", "header": [ { @@ -6064,23 +4494,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "form", - "dev", - "versions", - "1", - "revisions", - "1" - ] - } + "description": "" }, "response": [] } @@ -6088,116 +4502,54 @@ }, { "name": "Price Config Version", + "description": "", "item": [ { "name": "List price configs", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get a particular version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get latest version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Create priceConfig", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", "method": "POST", "header": [ { @@ -6211,36 +4563,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions" - ] - } + "description": "" }, "response": [] }, { "name": "Update priceConfig", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", "method": "PATCH", "header": [ { @@ -6254,37 +4584,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test111\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete priceConfig", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", "method": "DELETE", "header": [ { @@ -6298,133 +4605,48 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions", - "1" - ] - } + "description": "" }, "response": [] } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "59182724-4332-4d76-90ea-f7520a7b1be9", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "abc13dca-e8a4-4995-970f-00e5889a5f2d", - "type": "text/javascript", - "exec": [ - "" - ] - } - } ] }, { "name": "Price Config Revision", + "description": "", "item": [ { "name": "List all revision for version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/3/revisions", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/3/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions", - "3", - "revisions" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get a particular revision", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions", - "1", - "revisions", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Create price config", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions", "method": "POST", "header": [ { @@ -6438,38 +4660,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions", - "1", - "revisions" - ] - } + "description": "" }, "response": [] }, { "name": "Create for no exist key", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/no-exist-key/versions/1/revisions", "method": "POST", "header": [ { @@ -6483,38 +4681,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/no-exist-key/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "no-exist-key", - "versions", - "1", - "revisions" - ] - } + "description": "" }, "response": [] }, { "name": "Delete revision", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", "method": "DELETE", "header": [ { @@ -6528,23 +4702,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "priceConfig", - "dev", - "versions", - "1", - "revisions", - "1" - ] - } + "description": "" }, "response": [] } @@ -6552,116 +4710,54 @@ }, { "name": "Plan Config Version", + "description": "", "item": [ { "name": "List plan configs", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get a particular version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/3", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/3", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions", - "3" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get latest version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Create plan config", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", "method": "POST", "header": [ { @@ -6675,36 +4771,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions" - ] - } + "description": "" }, "response": [] }, { "name": "Update plan config", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", "method": "PATCH", "header": [ { @@ -6718,37 +4792,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test111\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions", - "1" - ] - } + "description": "" }, "response": [] }, { "name": "Delete plan config", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", "method": "DELETE", "header": [ { @@ -6762,21 +4813,7 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions", - "1" - ] - } + "description": "" }, "response": [] } @@ -6784,89 +4821,40 @@ }, { "name": "Plan Config Revision", + "description": "", "item": [ { "name": "List all revision for version", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions", - "1", - "revisions" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Get a particular revision", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", "method": "GET", "header": [], - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions", - "1", - "revisions", - "1" - ] - } + "body": { + "mode": "raw", + "raw": "" + }, + "description": "" }, "response": [] }, { "name": "Create plan config", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", "method": "POST", "header": [ { @@ -6880,38 +4868,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions", - "1", - "revisions" - ] - } + "description": "" }, "response": [] }, { "name": "Create for no exist key", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/no-exist-key/versions/1/revisions", "method": "POST", "header": [ { @@ -6925,38 +4889,14 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/no-exist-key/versions/1/revisions", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "no-exist-key", - "versions", - "1", - "revisions" - ] - } + "description": "" }, "response": [] }, { "name": "Delete revision", "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiYWRtaW5pc3RyYXRvciJdLCJpc3MiOiJodHRwczovL2FwaS50b3Bjb2Rlci1kZXYuY29tIiwiaGFuZGxlIjoidGVzdDEiLCJleHAiOjI1NjMwNzY2ODksInVzZXJJZCI6IjQwMDUxMzMzIiwiaWF0IjoxNDYzMDc2MDg5LCJlbWFpbCI6InRlc3RAdG9wY29kZXIuY29tIiwianRpIjoiYjMzYjc3Y2QtYjUyZS00MGZlLTgzN2UtYmViOGUwYWU2YTRhIn0.wKWUe0-SaiFVN-VR_-GwgFlvWaDkSbc8H55ktb9LAVw", - "type": "string" - } - ] - }, + "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", "method": "DELETE", "header": [ { @@ -6970,23 +4910,30 @@ "mode": "raw", "raw": "" }, - "url": { - "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "metadata", - "planConfig", - "dev", - "versions", - "1", - "revisions", - "1" - ] - } + "description": "" + }, + "response": [] + } + ] + }, + { + "name": "Project Estimation Item", + "description": "", + "item": [ + { + "name": "List Project estimation items", + "request": { + "url": "{{api-url}}/v4/projects/1/estimations/1/items", + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}", + "description": "" + } + ], + "body": {}, + "description": "" }, "response": [] } diff --git a/src/constants.js b/src/constants.js index eaffc3b9..e785deae 100644 --- a/src/constants.js +++ b/src/constants.js @@ -191,3 +191,13 @@ export const ESTIMATION_TYPE = { TOPCODER_SERVICE: 'topcoder_service', REFERENCE_PROGRAM: 'reference_program', }; + +export const ADMIN_ESTIMATION_ITEM_TYPES = [ + ESTIMATION_TYPE.FEE, + ESTIMATION_TYPE.COMMUNITY, + ESTIMATION_TYPE.TOPCODER_SERVICE, +]; + +export const COPILOT_ESTIMATION_ITEM_TYPES = [ + ESTIMATION_TYPE.COMMUNITY, +]; diff --git a/src/models/buildingBlock.js b/src/models/buildingBlock.js new file mode 100644 index 00000000..e39e229d --- /dev/null +++ b/src/models/buildingBlock.js @@ -0,0 +1,39 @@ +/* eslint-disable valid-jsdoc */ + +/** + * The Building block model + */ +module.exports = (sequelize, DataTypes) => { + const BuildingBlock = sequelize.define('BuildingBlock', { + id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true }, + key: { type: DataTypes.STRING(255), allowNull: false, unique: true }, + config: { type: DataTypes.JSON, allowNull: false, defaultValue: {} }, + privateConfig: { type: DataTypes.JSON, allowNull: false, defaultValue: {} }, + deletedAt: DataTypes.DATE, + createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + updatedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + deletedBy: DataTypes.BIGINT, + createdBy: { type: DataTypes.BIGINT, allowNull: false }, + updatedBy: { type: DataTypes.BIGINT, allowNull: false }, + }, { + tableName: 'building_blocks', + paranoid: true, + timestamps: true, + updatedAt: 'updatedAt', + createdAt: 'createdAt', + deletedAt: 'deletedAt', + hooks: { + beforeFind: (options) => { + if (!options.includePrivateConfigForInternalUsage) { + // try to remove privateConfig from attributes + const idx = options.attributes.indexOf('privateConfig'); + if (idx >= 0) { + options.attributes.splice(idx, 1); + } + } + }, + }, + }); + + return BuildingBlock; +}; diff --git a/src/models/projectEstimationItem.js b/src/models/projectEstimationItem.js new file mode 100644 index 00000000..36d284c3 --- /dev/null +++ b/src/models/projectEstimationItem.js @@ -0,0 +1,59 @@ +/* eslint-disable valid-jsdoc, no-param-reassign */ +import util from '../util'; +import { + MANAGER_ROLES, + PROJECT_MEMBER_ROLE, + ADMIN_ESTIMATION_ITEM_TYPES, + COPILOT_ESTIMATION_ITEM_TYPES, +} from '../constants'; + +/** + * The Project Estimation Item model + */ +module.exports = (sequelize, DataTypes) => { + const ProjectEstimationItem = sequelize.define('ProjectEstimationItem', { + id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true }, + projectEstimationId: { type: DataTypes.BIGINT, allowNull: false }, + price: { type: DataTypes.DOUBLE, allowNull: false }, + type: { type: DataTypes.STRING(255), allowNull: false }, + markupUsedReference: { type: DataTypes.STRING(255), allowNull: false }, + markupUsedReferenceId: { type: DataTypes.BIGINT, allowNull: false }, + metadata: { type: DataTypes.JSON, allowNull: false, defaultValue: {} }, + deletedAt: DataTypes.DATE, + createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + updatedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + deletedBy: DataTypes.BIGINT, + createdBy: { type: DataTypes.BIGINT, allowNull: false }, + updatedBy: { type: DataTypes.BIGINT, allowNull: false }, + }, { + tableName: 'project_estimation_items', + paranoid: true, + timestamps: true, + updatedAt: 'updatedAt', + createdAt: 'createdAt', + deletedAt: 'deletedAt', + hooks: { + beforeFind: (options, callback) => { + if (!options.reqUser || !options.members) { + callback(new Error( + 'You must provide auth user and project members to get project estimation items')); + } else if (util.hasPermission({ topcoderRoles: MANAGER_ROLES }, options.reqUser, options.members)) { + // do nothing. admins can see every field. + options.where.type = ADMIN_ESTIMATION_ITEM_TYPES; + callback(null); + } else if (util.hasPermission( + { projectRoles: PROJECT_MEMBER_ROLE.COPILOT }, + options.reqUser, + options.members)) { + options.where.type = COPILOT_ESTIMATION_ITEM_TYPES; + callback(null); + } else { + options.where.type = { $eq: null }; + callback(null); + } + }, + }, + }); + + return ProjectEstimationItem; +}; diff --git a/src/permissions/index.js b/src/permissions/index.js index 5acab2be..8c8dfe79 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -98,4 +98,6 @@ module.exports = () => { Authorizer.setPolicy('planConfig.edit', projectAdmin); Authorizer.setPolicy('planConfig.delete', projectAdmin); Authorizer.setPolicy('planConfig.view', true); // anyone can view price config + + Authorizer.setPolicy('projectEstimation.item.list', copilotAndAbove); }; diff --git a/src/routes/index.js b/src/routes/index.js index c6f711ef..c5dae306 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -271,6 +271,9 @@ router.route('/v4/projects/metadata/planConfig/:key/versions/:version(\\d+)') .patch(require('./planConfig/version/update')) .delete(require('./planConfig/version/delete')); +router.route('/v4/projects/:projectId/estimations/:estimationId/items') + .get(require('./projectEstimationItems/list')); + // register error handler router.use((err, req, res, next) => { // eslint-disable-line no-unused-vars // DO NOT REMOVE next arg.. even though eslint diff --git a/src/routes/metadata/list.js b/src/routes/metadata/list.js index cde3445c..6ce46915 100644 --- a/src/routes/metadata/list.js +++ b/src/routes/metadata/list.js @@ -137,6 +137,7 @@ module.exports = [ models.Form.latestVersion(), models.PriceConfig.latestVersion(), models.PlanConfig.latestVersion(), + models.BuildingBlock.findAll(query), ]) .then((results) => { res.json(util.wrapResponse(req.id, { @@ -148,6 +149,7 @@ module.exports = [ forms: results[5], priceConfigs: results[6], planConfigs: results[7], + buildingBlocks: results[8], })); }) .catch(next); diff --git a/src/routes/metadata/list.spec.js b/src/routes/metadata/list.spec.js index 56e3471c..38326fcf 100644 --- a/src/routes/metadata/list.spec.js +++ b/src/routes/metadata/list.spec.js @@ -179,6 +179,31 @@ const planConfigs = [ }, ]; +const buildingBlocks = [ + { + key: 'key1', + config: { + hello: 'world', + }, + privateConfig: { + message: 'you should not see this', + }, + createdBy: 1, + updatedBy: 1, + }, + { + key: 'key2', + config: { + hello: 'topcoder', + }, + privateConfig: { + message: 'you should not see this', + }, + createdBy: 1, + updatedBy: 1, + }, +]; + describe('GET all metadata', () => { beforeEach(() => testUtil.clearDb() .then(() => models.ProjectTemplate.bulkCreate(projectTemplates)) @@ -188,7 +213,8 @@ describe('GET all metadata', () => { .then(() => models.ProductCategory.bulkCreate(productCategories)) .then(() => models.Form.bulkCreate(forms)) .then(() => models.PriceConfig.bulkCreate(priceConfigs)) - .then(() => models.PlanConfig.bulkCreate(planConfigs)), + .then(() => models.PlanConfig.bulkCreate(planConfigs)) + .then(() => models.BuildingBlock.bulkCreate(buildingBlocks)), ); after(testUtil.clearDb); @@ -285,5 +311,29 @@ describe('GET all metadata', () => { }) .expect(200, done); }); + + it('should return correct building blocks for admin', (done) => { + request(server) + .get('/v4/projects/metadata') + .set({ + Authorization: `Bearer ${testUtil.jwts.copilot}`, + }) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + should.exist(resJson.buildingBlocks); + resJson.buildingBlocks.length.should.be.eql(2); + resJson.buildingBlocks[0].key.should.be.eql('key1'); + should.not.exist(resJson.buildingBlocks[0].privateConfig); + resJson.buildingBlocks[1].key.should.be.eql('key2'); + should.not.exist(resJson.buildingBlocks[1].privateConfig); + done(); + } + }); + }); }); }); diff --git a/src/routes/projectEstimationItems/list.js b/src/routes/projectEstimationItems/list.js new file mode 100644 index 00000000..10a9bfaa --- /dev/null +++ b/src/routes/projectEstimationItems/list.js @@ -0,0 +1,50 @@ +/** + * API to get project estimation items + */ +import validate from 'express-validation'; +import Joi from 'joi'; +import { middleware as tcMiddleware } from 'tc-core-library-js'; +import util from '../../util'; +import models from '../../models'; + +const permissions = tcMiddleware.permissions; + +const schema = { + params: { + projectId: Joi.number().integer().positive().required(), + estimationId: Joi.number().integer().positive().required(), + }, +}; + +module.exports = [ + validate(schema), + permissions('projectEstimation.item.list'), + (req, res, next) => models.ProjectEstimation.find({ + where: { + id: req.params.estimationId, + projectId: req.params.projectId, + deletedAt: { $eq: null }, + }, + raw: true, + }).then((estimation) => { + if (!estimation) { + const apiErr = new Error('Project Estimation not found for projectId ' + + `${req.params.projectId} and estimation id ${req.params.estimationId}`); + apiErr.status = 404; + return Promise.reject(apiErr); + } + return models.ProjectEstimationItem.findAll({ + where: { + projectEstimationId: req.params.estimationId, + deletedAt: { $eq: null }, + attributes: { exclude: ['deletedAt', 'deletedBy'] }, + }, + raw: true, + reqUser: req.authUser, + members: req.context.currentProjectMembers, + }).then((items) => { + res.json(util.wrapResponse(req.id, items)); + return Promise.resolve(); + }); + }).catch(next), +]; diff --git a/src/routes/projectEstimationItems/list.spec.js b/src/routes/projectEstimationItems/list.spec.js new file mode 100644 index 00000000..20846cf6 --- /dev/null +++ b/src/routes/projectEstimationItems/list.spec.js @@ -0,0 +1,227 @@ +/** + * Tests for list.js + */ +import chai from 'chai'; +import request from 'supertest'; +import _ from 'lodash'; +import models from '../../models'; +import server from '../../app'; +import testUtil from '../../tests/util'; + +const should = chai.should(); + +const project = { + id: 1, + name: 'test project 1', + type: 'generic', + status: 'active', + createdBy: 1, + updatedBy: 1, + lastActivityAt: new Date(), + lastActivityUserId: 1, +}; + +const projectMembers = [ + { + userId: testUtil.userIds.admin, + role: 'manager', + projectId: 1, + createdBy: 1, + updatedBy: 1, + }, + { + userId: testUtil.userIds.copilot, + role: 'copilot', + projectId: 1, + createdBy: 1, + updatedBy: 1, + }, + { + userId: testUtil.userIds.member, + role: 'manager', + projectId: 1, + createdBy: 1, + updatedBy: 1, + }, +]; + +const projectEstimations = [ + { + id: 1, + buildingBlockKey: 'key1', + conditions: ' empty condition ', + price: 1000, + quantity: 100, + minTime: 2, + maxTime: 2, + metadata: {}, + projectId: 1, + createdBy: 1, + updatedBy: 1, + }, +]; + +const projectEstimationItems = [ + { + projectEstimationId: 1, + price: 1234, + type: 'community', + markupUsedReference: 'buildingBlock', + markupUsedReferenceId: 1, + createdBy: 1, + updatedBy: 1, + }, + { + projectEstimationId: 1, + price: 5678, + type: 'topcoder_service', + markupUsedReference: 'buildingBlock', + markupUsedReferenceId: 1, + createdBy: 1, + updatedBy: 1, + }, + { + projectEstimationId: 1, + price: 1982, + type: 'fee', + markupUsedReference: 'buildingBlock', + markupUsedReferenceId: 1, + createdBy: 1, + updatedBy: 1, + }, +]; + +describe('GET project estimation items', () => { + beforeEach(() => testUtil.clearDb() + .then(() => models.Project.create(project)) + .then(() => models.ProjectMember.bulkCreate(projectMembers)) + .then(() => models.ProjectEstimation.bulkCreate(projectEstimations)) + .then(() => models.ProjectEstimationItem.bulkCreate(projectEstimationItems)) + .then(() => Promise.resolve()), + ); + after(testUtil.clearDb); + + const url = '/v4/projects/1/estimations/1/items'; + + describe(`GET ${url}`, () => { + it('should return 403 if user is not authenticated', (done) => { + request(server) + .get(url) + .expect(403, done); + }); + + it('should return 403 if user is not copilot or above', (done) => { + request(server) + .get(url) + .set({ + Authorization: `Bearer ${testUtil.jwts.member2}`, + }) + .expect(403, done); + }); + + it('should return 404 if project not exists', (done) => { + request(server) + .get('/v4/projects/999/estimations/1/items') + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(404, done); + }); + + it('should return 404 if project estimation not exists', (done) => { + request(server) + .get('/v4/projects/1/estimations/999/items') + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(404, done); + }); + + it('should return all project estimation items for admin', (done) => { + request(server) + .get(url) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + resJson.length.should.be.eql(3); + // convert items to map with type. + const itemMap = {}; + _.forEach(resJson, (item) => { + itemMap[item.type] = item; + }); + should.exist(itemMap.community); + itemMap.community.price.should.be.eql(1234); + itemMap.community.projectEstimationId.should.be.eql(1); + itemMap.community.type.should.be.eql('community'); + + should.exist(itemMap.topcoder_service); + itemMap.topcoder_service.price.should.be.eql(5678); + itemMap.topcoder_service.projectEstimationId.should.be.eql(1); + itemMap.topcoder_service.type.should.be.eql('topcoder_service'); + + should.exist(itemMap.fee); + itemMap.fee.price.should.be.eql(1982); + itemMap.fee.projectEstimationId.should.be.eql(1); + itemMap.fee.type.should.be.eql('fee'); + + done(); + } + }); + }); + + it('should return 1 project estimation item for copilot', (done) => { + request(server) + .get(url) + .set({ + Authorization: `Bearer ${testUtil.jwts.copilot}`, + }) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + resJson.length.should.be.eql(1); + // convert items to map with type. + should.exist(resJson[0]); + + const item = resJson[0]; + + item.price.should.be.eql(1234); + item.projectEstimationId.should.be.eql(1); + item.type.should.be.eql('community'); + + done(); + } + }); + }); + + it('should return 0 project estimation items for non-admin but project manager', (done) => { + request(server) + .get(url) + .set({ + Authorization: `Bearer ${testUtil.jwts.member}`, + }) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + resJson.length.should.be.eql(0); + // convert items to map with type. + done(); + } + }); + }); + }); +}); diff --git a/src/routes/projects/create.js b/src/routes/projects/create.js index bcc62509..49f9873b 100644 --- a/src/routes/projects/create.js +++ b/src/routes/projects/create.js @@ -78,6 +78,55 @@ const createProjectValdiations = { }, }; +/** + * Create ProjectEstimationItem with BuildingBlock. + * @param {Array} estimations the project estimations + * @param {Number} userId the request user id + * @returns {Promise} the promise that resolves to the created ProjectEstimationItem + */ +function createEstimationItemsWithBuildingBlock(estimations, userId) { + const buildingBlockKeys = _.map(estimations, estimation => estimation.buildingBlockKey); + // get all building blocks + return models.BuildingBlock.findAll({ + where: { deletedAt: { $eq: null }, key: buildingBlockKeys }, + raw: true, + includePrivateConfigForInternalUsage: true, + }).then((buildingBlocks) => { + const blocks = {}; + _.forEach(buildingBlocks, (block) => { + if (block) { + blocks[block.key] = block; + } + }); + const estimationItems = []; + _.forEach(estimations, (estimation) => { + const block = blocks[estimation.buildingBlockKey]; + if (block && _.get(block, 'privateConfig.priceItems')) { + _.forOwn(block.privateConfig.priceItems, (item, key) => { + let itemPrice; + if (_.isString(item) && item.endsWith('%')) { + const percent = _.toNumber(item.replace('%', '')) / 100; + itemPrice = _.toNumber(estimation.price) * percent; + } else { + itemPrice = item; + } + estimationItems.push({ + projectEstimationId: estimation.id, + price: itemPrice, + type: key, + markupUsedReference: 'buildingBlock', + markupUsedReferenceId: block.id, + createdBy: userId, + updatedBy: userId, + }); + }); + } + }); + + return models.ProjectEstimationItem.bulkCreate(estimationItems, { returning: true }); + }); +} + /** * Create the project, project phases and products. This needs to be done before creating direct project. * @param {Object} req the request @@ -113,6 +162,17 @@ function createProjectAndPhases(req, project, projectTemplate, productTemplates) }); } return Promise.resolve(newProject); + }).then((newProject) => { + req.log.debug('creating project estimation items with building blocks'); + if (result.estimations && result.estimations.length > 0) { + return createEstimationItemsWithBuildingBlock(result.estimations, req.authUser.userId) + .then((estimationItems) => { + req.log.debug(`creating ${estimationItems.length} project estimation items`); + // ignore project estimation items for now + return Promise.resolve(newProject); + }); + } + return Promise.resolve(newProject); }).then((newProject) => { if (project.attachments && (project.attachments.length > 0)) { req.log.debug('creating project attachments'); @@ -128,7 +188,8 @@ function createProjectAndPhases(req, project, projectTemplate, productTemplates) }); } return Promise.resolve(newProject); - }).then((newProject) => { + }) + .then((newProject) => { result.newProject = newProject; // backward compatibility for releasing the service before releasing the front end diff --git a/src/routes/projects/create.spec.js b/src/routes/projects/create.spec.js index ef057d35..00607b3b 100644 --- a/src/routes/projects/create.spec.js +++ b/src/routes/projects/create.spec.js @@ -158,6 +158,46 @@ describe('Project create', () => { updatedBy: 2, }, ])) + .then(() => models.BuildingBlock.bulkCreate([ + { + id: 1, + key: 'BLOCK_KEY', + config: {}, + privateConfig: { + priceItems: { + community: 3456, + topcoder_service: '19%', + fee: 1234, + }, + }, + createdBy: 1, + updatedBy: 2, + }, + { + id: 2, + key: 'BLOCK_KEY2', + config: {}, + privateConfig: { + message: 'invalid config', + }, + createdBy: 1, + updatedBy: 2, + }, + { + id: 3, + key: 'BLOCK_KEY3', + config: {}, + privateConfig: { + priceItems: { + community: '34%', + topcoder_service: 6789, + fee: '56%', + }, + }, + createdBy: 1, + updatedBy: 2, + }, + ])) .then(() => done()); }); @@ -707,5 +747,120 @@ describe('Project create', () => { } }); }); + + it('should create correct estimation items with estimation', (done) => { + const validBody = _.cloneDeep(body); + validBody.param.estimation = [ + { + conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE) )', + price: 1000, + minTime: 2, + maxTime: 2, + metadata: {}, + buildingBlockKey: 'BLOCK_KEY', + }, + { + conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE) )', + price: 1000, + minTime: 2, + maxTime: 2, + metadata: {}, + buildingBlockKey: 'BLOCK_KEY2', + }, + { + conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE) )', + price: 1000, + minTime: 2, + maxTime: 2, + metadata: {}, + buildingBlockKey: 'BLOCK_KEY3', + }, + ]; + validBody.param.templateId = 3; + const mockHttpClient = _.merge(testUtil.mockHttpClient, { + post: () => Promise.resolve({ + status: 200, + data: { + id: 'requesterId', + version: 'v3', + result: { + success: true, + status: 200, + content: { + projectId: 128, + }, + }, + }, + }), + }); + sandbox.stub(util, 'getHttpClient', () => mockHttpClient); + request(server) + .post('/v4/projects') + .set({ + Authorization: `Bearer ${testUtil.jwts.member}`, + }) + .send(validBody) + .expect('Content-Type', /json/) + .expect(201) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + should.exist(resJson.name); + should.exist(resJson.estimations); + resJson.estimations.length.should.be.eql(3); + + const totalPromises = []; + // check estimation items one by one + _.forEach(resJson.estimations, estimation => models.ProjectEstimationItem.findAll({ + where: { + projectEstimationId: estimation.id, + }, + raw: true, + }).then((items) => { + totalPromises.concat(_.map(items, (item) => { + should.exist(item.type); + should.exist(item.price); + should.exist(item.markupUsedReference); + should.exist(item.markupUsedReferenceId); + + item.markupUsedReference.should.be.eql('buildingBlock'); + if (estimation.buildingBlockKey === 'BLOCK_KEY') { + if (item.type === 'community') { + item.price.should.be.eql(3456); + } else if (item.type === 'topcoder_service') { + item.price.should.be.eql(190); + } else if (item.type === 'fee') { + item.price.should.be.eql(1234); + } else { + return Promise.reject('estimation item type is not correct'); + } + } else if (estimation.buildingBlockKey === 'BLOCK_KEY2') { + return Promise.reject('should not create estimation item for invalid building block'); + } else if (estimation.buildingBlockKey === 'BLOCK_KEY3') { + if (item.type === 'community') { + item.price.should.be.eql(340); + } else if (item.type === 'topcoder_service') { + item.price.should.be.eql(6789); + } else if (item.type === 'fee') { + item.price.should.be.eql(560); + } else { + return Promise.reject('estimation item type is not correct'); + } + } else { + return Promise.reject('estimation building block key is not correct'); + } + return Promise.resolve(); + })); + })); + + Promise.all(totalPromises).then(() => { + done(); + }).catch(e => done(e)); + } + }); + }); }); }); diff --git a/swagger.yaml b/swagger.yaml index 54d651ec..e31e626d 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -2943,6 +2943,32 @@ paths: description: Invalid server state or unknown error schema: $ref: '#/definitions/ErrorModel' + '/projects/{projectId}/estimations/{estimationId}/items': + get: + tags: + - Project Estimation Item + security: + - Bearer [] + description: get project estimation items + parameters: + - $ref: '#/parameters/projectIdParam' + - $ref: '#/parameters/projectEstimationIdParam' + responses: + '200': + description: List of project estimation items + $ref: '#/definitions/ProjectEstimationItemListResponse' + '403': + description: No permission or wrong token + schema: + $ref: '#/definitions/ErrorModel' + '404': + description: Model not found + schema: + $ref: '#/definitions/ErrorModel' + '500': + description: Invalid server state or unknown error + schema: + $ref: '#/definitions/ErrorModel' parameters: projectIdParam: @@ -3069,6 +3095,13 @@ parameters: required: true type: integer format: int64 + projectEstimationIdParam: + name: estimationId + in: path + description: project estimation identifier + required: true + type: integer + format: int64 definitions: ResponseMetadata: title: Metadata object for a response @@ -5136,6 +5169,10 @@ definitions: type: array items: $ref: '#/definitions/ProductCategory' + buildingBlocks: + type: array + items: + $ref: '#/definitions/BuildingBlock' ProjectMemberInvite: type: object properties: @@ -5570,3 +5607,115 @@ definitions: format: int64 description: READ-ONLY. User that last updated this object readOnly: true + BuildingBlock: + title: BuildingBlock object + type: object + required: + - id + - key + - config + properties: + id: + type: integer + format: int64 + description: the id + key: + type: string + description: building block key. Unique field. + config: + type: object + description: building block config + createdAt: + type: string + description: Datetime (GMT) when object was created + readOnly: true + createdBy: + type: integer + format: int64 + description: READ-ONLY. User who created this object + readOnly: true + updatedAt: + type: string + description: READ-ONLY. Datetime (GMT) when object was updated + readOnly: true + updatedBy: + type: integer + format: int64 + description: READ-ONLY. User that last updated this object + readOnly: true + ProjectEstimationItem: + title: ProjectEstimationItem object + type: object + required: + - id + - projectEstimationId + - price + - type + - markupUsedReference + - markupUsedReferenceId + - metadata + properties: + id: + type: integer + format: int64 + description: the id + projectEstimationId: + type: integer + format: int64 + description: the ProjectEstimation id + price: + type: number + format: float + description: the price of this estimation item + type: + type: string + description: the type of this estimation + markupUsedReference: + type: string + description: the reference type of this estimation. Can be "buildingBlock" for example + markupUsedReferenceId: + type: integer + format: int64 + description: the reference object id + metadata: + type: object + description: the metadata of this item + createdAt: + type: string + description: Datetime (GMT) when object was created + readOnly: true + createdBy: + type: integer + format: int64 + description: READ-ONLY. User who created this object + readOnly: true + updatedAt: + type: string + description: READ-ONLY. Datetime (GMT) when object was updated + readOnly: true + updatedBy: + type: integer + format: int64 + description: READ-ONLY. User that last updated this object + readOnly: true + ProjectEstimationItemListResponse: + title: ProjectEstimationItem list response + type: object + properties: + id: + type: string + description: unique id identifying the request + version: + type: string + result: + type: object + properties: + success: + type: boolean + status: + type: string + description: http status code + content: + type: array + items: + $ref: '#/definitions/ProjectEstimationItem' From 647ee723d1e4eba6e238060e8abeae66c9a30245 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Mon, 12 Aug 2019 14:54:12 +0800 Subject: [PATCH 03/16] =?UTF-8?q?fix=20=E2=80=9CGET=20/projects/{id}/estim?= =?UTF-8?q?ations/{id}/items=E2=80=9D=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/projectEstimationItems/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/projectEstimationItems/list.js b/src/routes/projectEstimationItems/list.js index 10a9bfaa..3b960c92 100644 --- a/src/routes/projectEstimationItems/list.js +++ b/src/routes/projectEstimationItems/list.js @@ -37,8 +37,8 @@ module.exports = [ where: { projectEstimationId: req.params.estimationId, deletedAt: { $eq: null }, - attributes: { exclude: ['deletedAt', 'deletedBy'] }, }, + attributes: { exclude: ['deletedAt', 'deletedBy'] }, raw: true, reqUser: req.authUser, members: req.context.currentProjectMembers, From df06bf3ab324073f3783ff098ab358ae54c1b63e Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Wed, 14 Aug 2019 13:21:24 +0800 Subject: [PATCH 04/16] winning submission from the challenge 30096337 --- config/m2m.local.js | 6 +- config/mock.local.js | 10 +- local/seed/seedProjects.js | 17 +- ..._settings_and_project_estimation_items.sql | 74 + package-lock.json | 6287 +++++++++++------ postman.json | 836 ++- src/constants.js | 7 + src/models/projectEstimationItem.js | 41 + src/models/projectSetting.js | 104 + src/permissions/index.js | 8 +- src/permissions/projectSetting.js | 47 + src/routes/index.js | 8 + src/routes/projectSettings/create.js | 115 + src/routes/projectSettings/create.spec.js | 376 + src/routes/projectSettings/delete.js | 83 + src/routes/projectSettings/delete.spec.js | 291 + src/routes/projectSettings/list.js | 58 + src/routes/projectSettings/list.spec.js | 243 + src/routes/projectSettings/update.js | 128 + src/routes/projectSettings/update.spec.js | 566 ++ src/util.js | 90 +- swagger.yaml | 255 + 22 files changed, 7329 insertions(+), 2321 deletions(-) create mode 100644 migrations/20190423_project_settings_and_project_estimation_items.sql create mode 100644 src/models/projectEstimationItem.js create mode 100644 src/models/projectSetting.js create mode 100644 src/permissions/projectSetting.js create mode 100644 src/routes/projectSettings/create.js create mode 100644 src/routes/projectSettings/create.spec.js create mode 100644 src/routes/projectSettings/delete.js create mode 100644 src/routes/projectSettings/delete.spec.js create mode 100644 src/routes/projectSettings/list.js create mode 100644 src/routes/projectSettings/list.spec.js create mode 100644 src/routes/projectSettings/update.js create mode 100644 src/routes/projectSettings/update.spec.js diff --git a/config/m2m.local.js b/config/m2m.local.js index 8fb26130..e7e52f33 100644 --- a/config/m2m.local.js +++ b/config/m2m.local.js @@ -11,19 +11,19 @@ if (process.env.NODE_ENV === 'test') { logLevel: 'debug', captureLogs: 'false', logentriesToken: '', - rabbitmqURL: 'amqp://dockerhost:5672', + rabbitmqURL: 'amqp://0.0.0.0:5672', fileServiceEndpoint: 'https://api.topcoder-dev.com/v3/files/', directProjectServiceEndpoint: 'https://api.topcoder-dev.com/v3/direct', connectProjectsUrl: 'https://connect.topcoder-dev.com/projects/', memberServiceEndpoint: 'https://api.topcoder-dev.com/v3/members', dbConfig: { - masterUrl: 'postgres://coder:mysecretpassword@dockerhost:5432/projectsdb', + masterUrl: 'postgres://coder:mysecretpassword@0.0.0.0:5432/projectsdb', maxPoolSize: 50, minPoolSize: 4, idleTimeout: 1000, }, elasticsearchConfig: { - host: 'dockerhost:9200', + host: '0.0.0.0:9200', // target elasticsearch 2.3 version apiVersion: '2.3', indexName: 'projects', diff --git a/config/mock.local.js b/config/mock.local.js index bec4dd70..dae12807 100644 --- a/config/mock.local.js +++ b/config/mock.local.js @@ -5,25 +5,25 @@ if (process.env.NODE_ENV === 'test') { config = require('./test.json'); } else { config = { - identityServiceEndpoint: "http://dockerhost:3001/", + identityServiceEndpoint: "http://0.0.0.0:3001/", authSecret: 'secret', authDomain: 'topcoder-dev.com', logLevel: 'debug', captureLogs: 'false', logentriesToken: '', - rabbitmqURL: 'amqp://dockerhost:5672', + rabbitmqURL: 'amqp://0.0.0.0:5672', fileServiceEndpoint: 'https://api.topcoder-dev.com/v3/files/', directProjectServiceEndpoint: 'https://api.topcoder-dev.com/v3/direct', connectProjectsUrl: 'https://connect.topcoder-dev.com/projects/', - memberServiceEndpoint: 'http://dockerhost:3001/v3/members', + memberServiceEndpoint: 'http://0.0.0.0:3001/v3/members', dbConfig: { - masterUrl: 'postgres://coder:mysecretpassword@dockerhost:5432/projectsdb', + masterUrl: 'postgres://coder:mysecretpassword@0.0.0.0:5432/projectsdb', maxPoolSize: 50, minPoolSize: 4, idleTimeout: 1000, }, elasticsearchConfig: { - host: 'dockerhost:9200', + host: '0.0.0.0:9200', // target elasticsearch 2.3 version apiVersion: '2.3', indexName: 'projects', diff --git a/local/seed/seedProjects.js b/local/seed/seedProjects.js index e1d50417..3c0f2aa0 100644 --- a/local/seed/seedProjects.js +++ b/local/seed/seedProjects.js @@ -1,4 +1,5 @@ import util from '../../src/tests/util'; +import models from '../../src/models'; const axios = require('axios'); const Promise = require('bluebird'); @@ -54,6 +55,21 @@ module.exports = (targetUrl, token) => { }); } + await models.ProjectEstimation.create({ + projectId, + buildingBlockKey: 'BLOCK_KEY', + conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || CA_NEEDED)', + price: 6500.50, + quantity: 10, + minTime: 35, + maxTime: 35, + metadata: { + deliverable: 'dev-qa', + }, + createdBy: 1, + updatedBy: 1, + }); + // creating invitations if (Array.isArray(invites)) { let promises = [] @@ -134,4 +150,3 @@ function updateProjectMemberInvite(projectId, params, targetUrl, headers) { console.log(`Failed to update project member invites ${projectId}: ${err.message}`); }) } - diff --git a/migrations/20190423_project_settings_and_project_estimation_items.sql b/migrations/20190423_project_settings_and_project_estimation_items.sql new file mode 100644 index 00000000..cf6086b0 --- /dev/null +++ b/migrations/20190423_project_settings_and_project_estimation_items.sql @@ -0,0 +1,74 @@ +-- CREATE NEW TABLES: +-- project_settings +-- project_estimation_items +-- + +-- +-- project_settings +-- + +CREATE TABLE project_settings ( + id bigint NOT NULL, + key character varying(255), + value character varying(255), + "valueType" character varying(255), + "projectId" bigint NOT NULL, + metadata json NOT NULL DEFAULT '{}'::json, + "readPermission" json NOT NULL DEFAULT '{}'::json, + "writePermission" json NOT NULL DEFAULT '{}'::json, + "deletedAt" timestamp with time zone, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "deletedBy" bigint, + "createdBy" bigint NOT NULL, + "updatedBy" bigint NOT NULL, + CONSTRAINT project_settings_pkey PRIMARY KEY (id) +); + +CREATE SEQUENCE project_settings_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE project_settings_id_seq OWNED BY project_settings.id; + +ALTER TABLE project_settings + ALTER COLUMN id SET DEFAULT nextval('project_settings_id_seq'); + +ALTER TABLE project_settings + ADD CONSTRAINT project_settings_key_project_id UNIQUE (key, "projectId"); + +-- +-- project_estimation_items +-- + +CREATE TABLE project_estimation_items ( + id bigint NOT NULL, + "projectEstimationId" bigint NOT NULL, + price double precision NOT NULL, + type character varying(255) NOT NULL, + "markupUsedReference" character varying(255) NOT NULL, + "markupUsedReferenceId" bigint NOT NULL, + metadata json NOT NULL DEFAULT '{}'::json, + "deletedAt" timestamp with time zone, + "createdAt" timestamp with time zone, + "updatedAt" timestamp with time zone, + "deletedBy" bigint, + "createdBy" bigint NOT NULL, + "updatedBy" bigint NOT NULL, + CONSTRAINT project_estimation_items_pkey PRIMARY KEY (id) +); + +CREATE SEQUENCE project_estimation_items_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE project_estimation_items_id_seq OWNED BY form.id; + +ALTER TABLE project_estimation_items + ALTER COLUMN id SET DEFAULT nextval('project_estimation_items_id_seq'); diff --git a/package-lock.json b/package-lock.json index 10c0fce6..c3a80717 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-1.1.2.tgz", "integrity": "sha1-13hAmZ4/fkPnSzsNQzkcFSb3k7g=", "requires": { - "component-type": "1.2.1", - "join-component": "1.1.0" + "component-type": "^1.2.1", + "join-component": "^1.1.0" } }, "@types/bluebird": { @@ -23,8 +23,8 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", "requires": { - "@types/connect": "3.4.32", - "@types/node": "10.12.15" + "@types/connect": "*", + "@types/node": "*" } }, "@types/connect": { @@ -32,49 +32,43 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", "requires": { - "@types/node": "10.12.15" + "@types/node": "*" } }, - "@types/events": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" - }, "@types/express": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", - "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.0.tgz", + "integrity": "sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw==", "requires": { - "@types/body-parser": "1.17.0", - "@types/express-serve-static-core": "4.16.0", - "@types/serve-static": "1.13.2" + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" } }, "@types/express-jwt": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.34.tgz", - "integrity": "sha1-/b7kxq9cCiRu8qkz9VGZc8dxfwI=", + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", + "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", "requires": { - "@types/express": "4.16.0", - "@types/express-unless": "0.0.32" + "@types/express": "*", + "@types/express-unless": "*" } }, "@types/express-serve-static-core": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", - "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.7.tgz", + "integrity": "sha512-847KvL8Q1y3TtFLRTXcVakErLJQgdpFSaq+k043xefz9raEf0C7HalpSY7OW5PyjCnY8P7bPW5t/Co9qqp+USg==", "requires": { - "@types/events": "1.2.0", - "@types/node": "10.12.15", - "@types/range-parser": "1.2.3" + "@types/node": "*", + "@types/range-parser": "*" } }, "@types/express-unless": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.0.32.tgz", - "integrity": "sha512-6YpJyFNlDDnPnRjMOvJCoDYlSDDmG/OEEUsPk7yhNkL4G9hUYtgab6vi1CcWsGSSSM0CsvNlWTG+ywAGnvF03g==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.1.tgz", + "integrity": "sha512-5fuvg7C69lemNgl0+v+CUxDYWVPSfXHhJPst4yTLcqi4zKJpORCxnDrnnilk3k0DTq/WrAUdvXFs01+vUqUZHw==", "requires": { - "@types/express": "4.16.0" + "@types/express": "*" } }, "@types/geojson": { @@ -83,19 +77,19 @@ "integrity": "sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==" }, "@types/lodash": { - "version": "4.14.116", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", - "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==" + "version": "4.14.136", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.136.tgz", + "integrity": "sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==" }, "@types/mime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" }, "@types/node": { - "version": "10.12.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.15.tgz", - "integrity": "sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA==" + "version": "12.6.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", + "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==" }, "@types/range-parser": { "version": "1.2.3", @@ -107,8 +101,8 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", "requires": { - "@types/express-serve-static-core": "4.16.0", - "@types/mime": "2.0.0" + "@types/express-serve-static-core": "*", + "@types/mime": "*" } }, "abbrev": { @@ -122,7 +116,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "requires": { - "mime-types": "2.1.17", + "mime-types": "~2.1.16", "negotiator": "0.6.1" } }, @@ -138,7 +132,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -155,8 +149,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ajv-keywords": { @@ -165,32 +159,15 @@ "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "amqplib": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.1.tgz", "integrity": "sha1-fMz+ur5WwumE6noiQ/fO/m+/xs8=", "requires": { - "bitsyntax": "0.0.4", - "bluebird": "3.5.1", + "bitsyntax": "~0.0.4", + "bluebird": "^3.4.6", "buffer-more-ints": "0.0.2", - "readable-stream": "1.1.14" + "readable-stream": "1.x >=1.1.9" } }, "analytics-node": { @@ -198,15 +175,15 @@ "resolved": "https://registry.npmjs.org/analytics-node/-/analytics-node-2.4.1.tgz", "integrity": "sha1-H5bI64h7bEdpEESsf8mhIx+wIPc=", "requires": { - "@segment/loosely-validate-event": "1.1.2", - "clone": "2.1.1", - "commander": "2.11.0", - "crypto-token": "1.0.1", - "debug": "2.6.9", - "lodash": "4.17.4", - "remove-trailing-slash": "0.1.0", - "superagent": "3.8.0", - "superagent-retry": "0.6.0" + "@segment/loosely-validate-event": "^1.1.2", + "clone": "^2.1.1", + "commander": "^2.9.0", + "crypto-token": "^1.0.1", + "debug": "^2.6.2", + "lodash": "^4.17.4", + "remove-trailing-slash": "^0.1.0", + "superagent": "^3.5.0", + "superagent-retry": "^0.6.0" } }, "ansi-align": { @@ -215,7 +192,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -236,8 +213,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -246,7 +223,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -272,9 +249,10 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, + "optional": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "app-module-path": { @@ -288,7 +266,7 @@ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "archy": { @@ -303,7 +281,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -312,7 +290,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -321,6 +299,12 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", @@ -350,7 +334,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -381,7 +365,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "assert-plus": { @@ -395,6 +379,12 @@ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -412,8 +402,8 @@ "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.8.tgz", "integrity": "sha512-1Sy1jDhjlgxcSd9/ICHqiAHT8VSJ9R1lzEyWwP/4Hm9p8nVTNtU0SxG/Z15XHD/aZvQraSw9BpDU3EBcFnOVrw==", "requires": { - "semver": "5.4.1", - "shimmer": "1.1.0" + "semver": "^5.3.0", + "shimmer": "^1.1.0" } }, "asynckit": { @@ -421,18 +411,24 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "auth0-js": { - "version": "9.8.2", - "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.8.2.tgz", - "integrity": "sha512-fwUkIABBA0e1B6hfkePtjOFlhXzvOUc/ZFx3NE1X9Ij3VZeqtJK7QU/Pc6tar+NkOpgZbRUXkxEG5qPGiwixWQ==", - "requires": { - "base64-js": "1.2.1", - "idtoken-verifier": "1.2.0", - "js-cookie": "2.2.0", - "qs": "6.5.1", - "superagent": "3.8.3", - "url-join": "4.0.0", - "winchan": "0.2.1" + "version": "9.11.2", + "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.11.2.tgz", + "integrity": "sha512-DP70OnHWapQ5gCwA1kgLpj9henNhwBZUKIR4Bi1pZcSD+1z5oosHvqNkRIreHaq4SGvZd9Mgus5WYsw8vTTMXg==", + "requires": { + "base64-js": "^1.2.0", + "idtoken-verifier": "^1.4.1", + "js-cookie": "^2.2.0", + "qs": "^6.4.0", + "superagent": "^3.8.3", + "url-join": "^4.0.0", + "winchan": "^0.2.1" }, "dependencies": { "debug": { @@ -440,7 +436,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "formidable": { @@ -454,35 +450,35 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "superagent": { @@ -490,16 +486,16 @@ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.2.6", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.3.6" + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" } } } @@ -511,7 +507,7 @@ "requires": { "buffer": "4.9.1", "crypto-browserify": "1.0.9", - "events": "1.1.1", + "events": "^1.1.1", "jmespath": "0.15.0", "querystring": "0.2.0", "sax": "1.2.1", @@ -543,8 +539,8 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", "requires": { - "follow-redirects": "1.2.6", - "is-buffer": "1.1.6" + "follow-redirects": "^1.2.5", + "is-buffer": "^1.1.5" } }, "babel-cli": { @@ -553,21 +549,21 @@ "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.11.0", - "convert-source-map": "1.5.0", - "fs-readdir-recursive": "1.0.0", - "glob": "7.1.2", - "lodash": "4.17.4", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "chokidar": "^1.6.1", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" }, "dependencies": { "babel-runtime": { @@ -576,8 +572,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "glob": { @@ -586,12 +582,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -602,9 +598,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -613,25 +609,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" }, "dependencies": { "babel-runtime": { @@ -640,8 +636,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "json5": { @@ -658,10 +654,10 @@ "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0" + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.17.0" } }, "babel-generator": { @@ -670,14 +666,14 @@ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" }, "dependencies": { "babel-runtime": { @@ -686,8 +682,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -698,10 +694,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -710,8 +706,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -722,10 +718,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -734,8 +730,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -746,11 +742,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -759,8 +755,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -771,8 +767,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -781,8 +777,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -793,8 +789,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -803,8 +799,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -815,8 +811,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -825,8 +821,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -837,9 +833,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -848,8 +844,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -860,12 +856,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -874,8 +870,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -886,8 +882,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -896,8 +892,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -908,7 +904,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -917,8 +913,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -935,7 +931,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -944,8 +940,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -956,7 +952,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -965,8 +961,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -977,7 +973,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -986,8 +982,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -998,11 +994,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -1011,8 +1007,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1023,15 +1019,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1040,8 +1036,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1052,8 +1048,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1062,8 +1058,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1074,7 +1070,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1083,8 +1079,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1095,8 +1091,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1105,8 +1101,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1117,7 +1113,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1126,8 +1122,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1138,9 +1134,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1149,8 +1145,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1161,7 +1157,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1170,8 +1166,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1182,9 +1178,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1193,8 +1189,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1205,10 +1201,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" }, "dependencies": { "babel-runtime": { @@ -1217,8 +1213,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1229,9 +1225,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1240,8 +1236,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1252,9 +1248,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1263,8 +1259,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1275,8 +1271,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1285,8 +1281,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1297,12 +1293,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1311,8 +1307,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1323,8 +1319,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1333,8 +1329,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1345,7 +1341,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1354,8 +1350,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1366,9 +1362,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1377,8 +1373,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1389,7 +1385,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1398,8 +1394,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1410,7 +1406,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1419,8 +1415,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1431,9 +1427,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" }, "dependencies": { "babel-runtime": { @@ -1442,8 +1438,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1454,7 +1450,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-runtime": { @@ -1463,7 +1459,7 @@ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" }, "dependencies": { "babel-runtime": { @@ -1472,8 +1468,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1484,8 +1480,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" }, "dependencies": { "babel-runtime": { @@ -1494,8 +1490,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1506,9 +1502,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "babel-runtime": { @@ -1517,8 +1513,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" }, "dependencies": { "regenerator-runtime": { @@ -1543,30 +1539,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, "babel-register": { @@ -1575,13 +1571,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { "babel-runtime": { @@ -1590,18 +1586,18 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } }, "babel-runtime": { "version": "6.6.1", - "resolved": "http://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz", "integrity": "sha1-eIuUtvY04luRvWxd9y1GdFevsAA=", "requires": { - "core-js": "2.5.1" + "core-js": "^2.1.0" } }, "babel-template": { @@ -1610,11 +1606,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -1623,8 +1619,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1635,15 +1631,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" }, "dependencies": { "babel-runtime": { @@ -1652,8 +1648,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1664,10 +1660,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" }, "dependencies": { "babel-runtime": { @@ -1676,8 +1672,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -1693,7 +1689,7 @@ "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", "requires": { - "precond": "0.2.3" + "precond": "0.2" } }, "balanced-match": { @@ -1701,6 +1697,73 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", @@ -1711,7 +1774,7 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "beeper": { @@ -1721,13 +1784,13 @@ "dev": true }, "bin-protocol": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bin-protocol/-/bin-protocol-3.0.4.tgz", - "integrity": "sha1-RlqdNQb+sOEmtStbIWDZNuFbJ/Q=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bin-protocol/-/bin-protocol-3.1.1.tgz", + "integrity": "sha512-9vCGfaHC2GBHZwGQdG+DpyXfmLvx9uKtf570wMLwIc9wmTIDgsdCBXQxTZu5X2GyogkfBks2Ode4N0sUVxJ2qQ==", "requires": { - "lodash": "4.17.4", - "long": "3.2.0", - "protocol-buffers-schema": "3.3.2" + "lodash": "^4.17.11", + "long": "^4.0.0", + "protocol-buffers-schema": "^3.0.0" } }, "binary-extensions": { @@ -1760,30 +1823,30 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.15" + "type-is": "~1.6.15" } }, "boxen": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", - "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -1793,12 +1856,12 @@ "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.0" + "color-convert": "^1.9.0" } }, "camelcase": { @@ -1808,20 +1871,20 @@ "dev": true }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "is-fullwidth-code-point": { @@ -1836,8 +1899,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -1846,16 +1909,16 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^3.0.0" } } } @@ -1865,7 +1928,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1875,9 +1938,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "buffer": { @@ -1885,9 +1948,9 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" }, "dependencies": { "isarray": { @@ -1928,10 +1991,10 @@ "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", "requires": { - "dtrace-provider": "0.8.5", - "moment": "2.22.2", - "mv": "2.1.1", - "safe-json-stringify": "1.0.4" + "dtrace-provider": "~0.8", + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" } }, "bytes": { @@ -1939,13 +2002,38 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -1954,17 +2042,10 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, "caseless": { @@ -1972,26 +2053,15 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, "chai": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, "requires": { - "assertion-error": "1.0.2", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" } }, "chai-as-promised": { @@ -2000,7 +2070,7 @@ "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, "requires": { - "check-error": "1.0.2" + "check-error": "^1.0.2" } }, "chalk": { @@ -2008,11 +2078,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "check-error": { @@ -2032,23 +2102,60 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, + "optional": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", @@ -2061,12 +2168,12 @@ "integrity": "sha1-OlrnT9drYmevZm5p4q+70B3vNNE=", "dev": true, "requires": { - "ansi-regex": "2.1.1", - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "memoizee": "0.4.11", - "timers-ext": "0.1.2" + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.12", + "es6-iterator": "2", + "memoizee": "^0.4.3", + "timers-ext": "0.1" } }, "cli-cursor": { @@ -2075,7 +2182,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-width": { @@ -2084,27 +2191,6 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, "clone": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", @@ -2137,15 +2223,25 @@ "dependencies": { "semver": { "version": "5.0.1", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz", "integrity": "sha1-n7P0AE+QDYPEeWj+QvdYPgWDLMk=" } } }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -2167,7 +2263,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -2190,7 +2286,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", "requires": { - "mime-db": "1.37.0" + "mime-db": ">= 1.36.0 < 2" }, "dependencies": { "mime-db": { @@ -2205,13 +2301,13 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "2.0.15", + "compressible": "~2.0.14", "debug": "2.6.9", - "on-headers": "1.0.1", + "on-headers": "~1.0.1", "safe-buffer": "5.1.2", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "accepts": { @@ -2219,7 +2315,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.21", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -2233,7 +2329,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "requires": { - "mime-db": "1.37.0" + "mime-db": "~1.37.0" } }, "safe-buffer": { @@ -2254,9 +2350,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { "isarray": { @@ -2271,13 +2367,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -2286,7 +2382,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -2306,22 +2402,22 @@ "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "dev": true, "requires": { - "ini": "1.3.4", - "proto-list": "1.2.4" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, "configstore": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.1.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "connection-parse": { @@ -2350,8 +2446,8 @@ "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.0.tgz", "integrity": "sha1-4Z/Da1lwkKXU5KOy6j68XilpSiQ=", "requires": { - "async-listener": "0.6.8", - "emitter-listener": "1.0.1" + "async-listener": "^0.6.0", + "emitter-listener": "^1.0.1" } }, "convert-source-map": { @@ -2375,6 +2471,12 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", @@ -2390,8 +2492,8 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" + "object-assign": "^4", + "vary": "^1" } }, "create-error-class": { @@ -2400,7 +2502,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { @@ -2409,9 +2511,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "dependencies": { "lru-cache": { @@ -2420,8 +2522,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } } } @@ -2453,7 +2555,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.35" + "es5-ext": "^0.10.9" } }, "dashdash": { @@ -2461,7 +2563,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "dateformat": { @@ -2484,6 +2586,12 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -2502,9 +2610,9 @@ } }, "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "deep-is": { @@ -2519,7 +2627,7 @@ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" }, "dependencies": { "strip-bom": { @@ -2528,7 +2636,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -2539,7 +2647,7 @@ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "clone": "1.0.2" + "clone": "^1.0.2" }, "dependencies": { "clone": { @@ -2550,19 +2658,72 @@ } } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.4.5" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -2592,7 +2753,7 @@ "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", "dev": true, "requires": { - "fs-exists-sync": "0.1.0" + "fs-exists-sync": "^0.1.0" } }, "detect-indent": { @@ -2601,7 +2762,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "diff": { @@ -2616,8 +2777,8 @@ "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" }, "dependencies": { "isarray": { @@ -2634,7 +2795,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dottie": { @@ -2648,22 +2809,16 @@ "integrity": "sha1-mOu6Ihr6xG4cOf02hY2Pk2dSS5I=", "optional": true, "requires": { - "nan": "2.7.0" + "nan": "^2.3.3" } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, "duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "1.1.14" + "readable-stream": "~1.1.9" } }, "duplexer3": { @@ -2677,8 +2832,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ecdsa-sig-formatter": { @@ -2686,7 +2841,7 @@ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "editorconfig": { @@ -2695,11 +2850,11 @@ "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", "dev": true, "requires": { - "bluebird": "3.5.1", - "commander": "2.11.0", - "lru-cache": "3.2.0", - "semver": "5.4.1", - "sigmund": "1.0.1" + "bluebird": "^3.0.5", + "commander": "^2.9.0", + "lru-cache": "^3.2.0", + "semver": "^5.1.0", + "sigmund": "^1.0.1" }, "dependencies": { "lru-cache": { @@ -2708,7 +2863,7 @@ "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", "dev": true, "requires": { - "pseudomap": "1.0.2" + "pseudomap": "^1.0.1" } } } @@ -2723,11 +2878,11 @@ "resolved": "https://registry.npmjs.org/elasticsearch/-/elasticsearch-11.0.1.tgz", "integrity": "sha1-0YBoTGvefs+g+iTmL6HIcu6uCOc=", "requires": { - "chalk": "1.1.3", - "forever-agent": "0.6.1", - "lodash": "3.10.1", - "lodash-compat": "3.10.2", - "promise": "7.3.1" + "chalk": "^1.0.0", + "forever-agent": "^0.6.0", + "lodash": "^3.10.0", + "lodash-compat": "^3.0.0", + "promise": "^7.1.1" }, "dependencies": { "lodash": { @@ -2763,7 +2918,7 @@ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", "dev": true, "requires": { - "once": "1.3.3" + "once": "~1.3.0" }, "dependencies": { "once": { @@ -2772,7 +2927,7 @@ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } } } @@ -2783,7 +2938,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es5-ext": { @@ -2792,8 +2947,8 @@ "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -2802,9 +2957,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2813,31 +2968,25 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -2846,8 +2995,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -2856,10 +3005,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -2878,10 +3027,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -2890,41 +3039,41 @@ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.9", - "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.5.1", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.1", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" }, "dependencies": { "glob": { @@ -2933,12 +3082,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "user-home": { @@ -2947,7 +3096,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } } } @@ -2958,7 +3107,7 @@ "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", "dev": true, "requires": { - "eslint-restricted-globals": "0.1.1" + "eslint-restricted-globals": "^0.1.1" } }, "eslint-import-resolver-node": { @@ -2967,8 +3116,8 @@ "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", "dev": true, "requires": { - "debug": "2.6.9", - "resolve": "1.5.0" + "debug": "^2.6.8", + "resolve": "^1.2.0" } }, "eslint-module-utils": { @@ -2977,8 +3126,8 @@ "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", "dev": true, "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" } }, "eslint-plugin-import": { @@ -2987,16 +3136,16 @@ "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", "dev": true, "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.1", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.1.1", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0" }, "dependencies": { "doctrine": { @@ -3005,8 +3154,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "isarray": { @@ -3029,8 +3178,8 @@ "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.1.1", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -3045,7 +3194,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -3054,8 +3203,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -3081,23 +3230,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" - } - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", - "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" + "d": "1", + "es5-ext": "~0.10.14" } }, "events": { @@ -3111,13 +3245,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit-hook": { @@ -3132,7 +3266,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -3141,7 +3275,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "expand-tilde": { @@ -3150,7 +3284,7 @@ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.1" } }, "express": { @@ -3158,36 +3292,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", "requires": { - "accepts": "1.3.4", + "accepts": "~1.3.4", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.0", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", + "proxy-addr": "~2.0.2", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.1", "serve-static": "1.13.1", "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", + "statuses": "~1.3.1", + "type-is": "~1.6.15", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "setprototypeof": { @@ -3207,8 +3341,8 @@ "resolved": "https://registry.npmjs.org/express-list-routes/-/express-list-routes-0.1.4.tgz", "integrity": "sha1-xlwxw/thnHnAVD97TsToMFbs5hY=", "requires": { - "colors": "1.1.2", - "lodash": "3.10.1" + "colors": "^1.0.3", + "lodash": "^3.0.0" }, "dependencies": { "lodash": { @@ -3223,7 +3357,7 @@ "resolved": "https://registry.npmjs.org/express-request-id/-/express-request-id-1.4.0.tgz", "integrity": "sha1-J3ssCUmAPmgQTJ1Fw+aJNPlr9aI=", "requires": { - "uuid": "3.3.2" + "uuid": "^3.0.1" } }, "express-sanitizer": { @@ -3239,7 +3373,7 @@ "resolved": "https://registry.npmjs.org/express-validation/-/express-validation-0.6.0.tgz", "integrity": "sha1-DXf0r8flixIBat7FmzJb7v2dwmg=", "requires": { - "lodash": "4.17.4" + "lodash": "^4.9.0" } }, "extend": { @@ -3247,13 +3381,34 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extsprintf": { @@ -3267,8 +3422,8 @@ "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", "dev": true, "requires": { - "chalk": "1.1.3", - "time-stamp": "1.1.0" + "chalk": "^1.1.1", + "time-stamp": "^1.0.0" } }, "fast-deep-equal": { @@ -3293,8 +3448,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { @@ -3303,8 +3458,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "filename-regex": { @@ -3319,8 +3474,8 @@ "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" + "glob": "^7.0.3", + "minimatch": "^3.0.3" }, "dependencies": { "glob": { @@ -3329,27 +3484,54 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + } } }, "finalhandler": { @@ -3358,12 +3540,12 @@ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" }, "dependencies": { "statuses": { @@ -3385,8 +3567,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "findup-sync": { @@ -3395,10 +3577,10 @@ "integrity": "sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow=", "dev": true, "requires": { - "detect-file": "0.1.0", - "is-glob": "2.0.1", - "micromatch": "2.3.11", - "resolve-dir": "0.1.1" + "detect-file": "^0.1.0", + "is-glob": "^2.0.1", + "micromatch": "^2.3.7", + "resolve-dir": "^0.1.0" } }, "fined": { @@ -3407,11 +3589,11 @@ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.1" + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" }, "dependencies": { "expand-tilde": { @@ -3420,7 +3602,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } } } @@ -3443,27 +3625,32 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "follow-redirects": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.2.6.tgz", - "integrity": "sha512-FrMqZ/FONtHnbqO651UPpfRUVukIEwJhXMfdr/JWAmrDbeYBu773b1J6gdWDyRIj4hvvzQEHoEOTrdR8o6KLYA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "requires": { - "debug": "3.1.0" + "debug": "^3.2.6" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -3479,7 +3666,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "forever-agent": { @@ -3492,9 +3679,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "formatio": { @@ -3503,7 +3690,7 @@ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", "dev": true, "requires": { - "samsam": "1.1.2" + "samsam": "~1.1" } }, "formidable": { @@ -3516,17 +3703,20 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, "fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", @@ -3539,9 +3729,9 @@ "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-readdir-recursive": { @@ -3556,286 +3746,847 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, + "optional": true, "requires": { - "globule": "0.1.0" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "generic-pool": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.2.tgz", - "integrity": "sha1-iGvFvwvrfblugby7oHiBjeWmJoM=" - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, "dev": true, + "optional": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "ms": "^2.1.1" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "minipass": "^2.2.1" } - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "0.5.2" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "0.1.1" - } - }, - "global-dirs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", - "integrity": "sha1-ENNAOeDfBCcuJizyQiT3IJQ0308=", - "dev": true, - "requires": { - "ini": "1.3.4" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true, - "requires": { - "global-prefix": "0.1.5", - "is-windows": "0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1", - "ini": "1.3.4", - "is-windows": "0.2.0", - "which": "1.3.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } - } - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { + }, "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "version": "7.1.3", + "bundled": true, "dev": true, + "optional": true, "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, "dev": true, + "optional": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "number-is-nan": "^1.0.0" } - } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "~0.1.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "generic-pool": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.2.tgz", + "integrity": "sha1-iGvFvwvrfblugby7oHiBjeWmJoM=" + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } } }, "glogg": { @@ -3844,7 +4595,7 @@ "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", "dev": true, "requires": { - "sparkles": "1.0.0" + "sparkles": "^1.0.0" } }, "got": { @@ -3853,17 +4604,17 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { @@ -3884,19 +4635,19 @@ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", "dev": true, "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.8", - "interpret": "1.0.4", - "liftoff": "2.3.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" }, "dependencies": { "minimist": { @@ -3919,8 +4670,8 @@ "integrity": "sha1-Jh2xhuGDl/7z9qLCLpwxW/qIrgw=", "dev": true, "requires": { - "chalk": "1.1.3", - "object-assign": "3.0.0" + "chalk": "^1.0.0", + "object-assign": "^3.0.0" }, "dependencies": { "object-assign": { @@ -3937,24 +4688,24 @@ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" + "through2": "^2.0.0", + "vinyl": "^0.5.0" }, "dependencies": { "minimist": { @@ -3977,28 +4728,43 @@ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { - "glogg": "1.0.0" + "glogg": "^1.0.0" } }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, + "optional": true, "requires": { - "amdefine": "1.0.1" + "commander": "~2.20.0", + "source-map": "~0.6.1" } } } @@ -4013,19 +4779,19 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { - "ajv": "6.6.1", - "har-schema": "2.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" }, "dependencies": { "ajv": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", - "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } } } @@ -4036,7 +4802,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -4044,7 +4810,7 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -4059,7 +4825,67 @@ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "dev": true, "requires": { - "sparkles": "1.0.0" + "sparkles": "^1.0.0" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "hashring": { @@ -4067,14 +4893,14 @@ "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", "integrity": "sha1-/aTv3oqiLNuX+x0qZeiEAeHBRM4=", "requires": { - "connection-parse": "0.0.7", - "simple-lru-cache": "0.0.2" + "connection-parse": "0.0.x", + "simple-lru-cache": "0.0.x" } }, "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" }, "home-or-tmp": { "version": "2.0.0", @@ -4082,8 +4908,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { @@ -4092,7 +4918,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -4114,7 +4940,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" } }, "http-signature": { @@ -4122,9 +4948,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.15.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -4133,84 +4959,18 @@ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "idtoken-verifier": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-1.2.0.tgz", - "integrity": "sha512-8jmmFHwdPz8L73zGNAXHHOV9yXNC+Z0TUBN5rafpoaFaLFltlIFr1JkQa3FYAETP23eSsulVw0sBiwrE8jqbUg==", - "requires": { - "base64-js": "1.2.1", - "crypto-js": "3.1.9-1", - "jsbn": "0.1.1", - "superagent": "3.8.3", - "url-join": "1.1.0" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-1.4.1.tgz", + "integrity": "sha512-BoJc00Gj37hrNlx7NYmd8uJFvvC9/FiWDKugDluP4JmgOGT/AfNlPfnRmi9fHEEqSatnIIr3WTyf0dlhHfSHnA==", + "requires": { + "base64-js": "^1.2.0", + "crypto-js": "^3.1.9-1", + "jsbn": "^0.1.0", + "promise-polyfill": "^8.1.3", + "unfetch": "^4.1.0", + "url-join": "^1.1.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "2.1.1" - } - }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.2.6", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.3.6" - } - }, "url-join": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", @@ -4257,8 +5017,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -4278,19 +5038,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" } }, "interpret": { @@ -4305,7 +5065,7 @@ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -4325,8 +5085,17 @@ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "dev": true, "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -4341,7 +5110,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.10.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -4355,7 +5124,44 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" + } + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-dotfile": { @@ -4370,7 +5176,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4391,7 +5197,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -4400,7 +5206,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -4409,7 +5215,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-installed-globally": { @@ -4418,20 +5224,27 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "0.1.0", - "is-path-inside": "1.0.0" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, "is-my-json-valid": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-npm": { @@ -4446,7 +5259,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-obj": { @@ -4467,7 +5280,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -4476,7 +5289,7 @@ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-object": { @@ -4485,7 +5298,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -4532,7 +5345,7 @@ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "dev": true, "requires": { - "is-unc-path": "0.1.2" + "is-unc-path": "^0.1.1" } }, "is-resolvable": { @@ -4541,7 +5354,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "1.0.3" + "tryit": "^1.0.1" } }, "is-retry-allowed": { @@ -4567,7 +5380,7 @@ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.0" } }, "is-utf8": { @@ -4626,14 +5439,14 @@ "integrity": "sha1-BglrwI6Yuq10Sq5Gli2N+frGPQg=", "dev": true, "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "istanbul-api": "1.2.1", - "js-yaml": "3.10.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "which": "1.3.0", - "wordwrap": "1.0.0" + "abbrev": "1.0.x", + "async": "1.x", + "istanbul-api": "^1.0.0-alpha", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "which": "^1.1.1", + "wordwrap": "^1.0.0" } }, "istanbul-api": { @@ -4642,17 +5455,17 @@ "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", "dev": true, "requires": { - "async": "2.5.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.9.1", - "istanbul-lib-report": "1.1.2", - "istanbul-lib-source-maps": "1.2.2", - "istanbul-reports": "1.1.3", - "js-yaml": "3.10.0", - "mkdirp": "0.5.1", - "once": "1.4.0" + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.9.1", + "istanbul-lib-report": "^1.1.2", + "istanbul-lib-source-maps": "^1.2.2", + "istanbul-reports": "^1.1.3", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" }, "dependencies": { "async": { @@ -4661,7 +5474,7 @@ "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "^4.14.0" } } } @@ -4678,7 +5491,7 @@ "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -4687,13 +5500,13 @@ "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "dev": true, "requires": { - "babel-generator": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.1.1", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -4702,10 +5515,10 @@ "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "supports-color": { @@ -4714,7 +5527,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -4725,11 +5538,11 @@ "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -4747,12 +5560,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "rimraf": { @@ -4761,7 +5574,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } } } @@ -4772,7 +5585,7 @@ "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "jade": { @@ -4809,10 +5622,10 @@ "resolved": "https://registry.npmjs.org/joi/-/joi-8.4.2.tgz", "integrity": "sha1-vXd0ZY/pkFjYmU7R1LmWJITruFk=", "requires": { - "hoek": "4.2.0", - "isemail": "2.2.1", - "moment": "2.22.2", - "topo": "2.0.2" + "hoek": "4.x.x", + "isemail": "2.x.x", + "moment": "2.x.x", + "topo": "2.x.x" } }, "join-component": { @@ -4826,10 +5639,10 @@ "integrity": "sha512-6YX1g+lIl0/JDxjFFbgj7fz6i0bWFa2Hdc7PfGqFhynaEiYe1NJ3R1nda0VGaRiGU82OllR+EGDoWFpGr3k5Kg==", "dev": true, "requires": { - "config-chain": "1.1.11", - "editorconfig": "0.13.3", - "mkdirp": "0.5.1", - "nopt": "3.0.6" + "config-chain": "~1.1.5", + "editorconfig": "^0.13.2", + "mkdirp": "~0.5.0", + "nopt": "~3.0.1" } }, "js-cookie": { @@ -4849,13 +5662,13 @@ "dev": true }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -4885,7 +5698,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -4904,7 +5717,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -4924,15 +5737,15 @@ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz", "integrity": "sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag==", "requires": { - "jws": "3.1.5", - "lodash.includes": "4.3.0", - "lodash.isboolean": "3.0.3", - "lodash.isinteger": "4.0.4", - "lodash.isnumber": "3.0.3", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.once": "4.1.1", - "ms": "2.1.1" + "jws": "^3.1.5", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1" }, "dependencies": { "ms": { @@ -4960,20 +5773,77 @@ "requires": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.10", - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "jwks-rsa": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.3.0.tgz", - "integrity": "sha512-9q+d5VffK/FvFAjuXoddrq7zQybFSINV4mcwJJExGKXGyjWWpTt3vsn/aX33aB0heY02LK0qSyicdtRK0gVTig==", - "requires": { - "@types/express-jwt": "0.0.34", - "debug": "2.6.9", - "limiter": "1.1.3", - "lru-memoizer": "1.12.0", - "ms": "2.0.0", - "request": "2.88.0" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.6.0.tgz", + "integrity": "sha512-gLhpd7Ka7Jy8ofm9OVj0PFPtSdx3+W2dncF3UCA1wDTAbvfiB1GhHbbyQlz8bqLF5+rge7pgD/DALRfgZi8Fgg==", + "requires": { + "@types/express-jwt": "0.0.42", + "debug": "^2.6.9", + "jsonwebtoken": "^8.5.1", + "limiter": "^1.1.4", + "lru-memoizer": "^1.12.0", + "ms": "^2.1.1", + "request": "^2.88.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "jws": { @@ -4981,8 +5851,8 @@ "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", "requires": { - "jwa": "1.1.6", - "safe-buffer": "5.1.1" + "jwa": "^1.1.5", + "safe-buffer": "^5.0.1" } }, "kind-of": { @@ -4991,7 +5861,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "latest-version": { @@ -5000,7 +5870,7 @@ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-ass": { @@ -5009,20 +5879,13 @@ "integrity": "sha1-fQ0U7vPslwLG8wxg6oHxqNP5APs=", "dev": true }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "le_node": { @@ -5045,7 +5908,7 @@ }, "semver": { "version": "5.1.0", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" } } @@ -5056,8 +5919,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "libpq": { @@ -5066,7 +5929,7 @@ "integrity": "sha512-0TVzqkbAZZiM8JJy5sagRyXOkvU9zTBlgGX6YdzuWECobc5F81Tp6uuS+djMZrnB5YN4O/ff52hsvXYBRW2gdQ==", "requires": { "bindings": "1.2.1", - "nan": "2.11.0" + "nan": "^2.10.0" }, "dependencies": { "nan": { @@ -5082,15 +5945,15 @@ "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", "dev": true, "requires": { - "extend": "3.0.1", - "findup-sync": "0.4.3", - "fined": "1.1.0", - "flagged-respawn": "0.3.2", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.mapvalues": "4.6.0", - "rechoir": "0.6.2", - "resolve": "1.5.0" + "extend": "^3.0.0", + "findup-sync": "^0.4.2", + "fined": "^1.0.1", + "flagged-respawn": "^0.3.2", + "lodash.isplainobject": "^4.0.4", + "lodash.isstring": "^4.0.1", + "lodash.mapvalues": "^4.4.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" }, "dependencies": { "findup-sync": { @@ -5099,18 +5962,18 @@ "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", "dev": true, "requires": { - "detect-file": "0.1.0", - "is-glob": "2.0.1", - "micromatch": "2.3.11", - "resolve-dir": "0.1.1" + "detect-file": "^0.1.0", + "is-glob": "^2.0.1", + "micromatch": "^2.3.7", + "resolve-dir": "^0.1.0" } } } }, "limiter": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.3.tgz", - "integrity": "sha512-zrycnIMsLw/3ZxTbW7HCez56rcFGecWTx5OZNplzcXUUmJLmoYArC6qdJzmAN5BWiNXGcpjhF9RQ1HSv5zebEw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", + "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==" }, "load-json-file": { "version": "2.0.0", @@ -5118,10 +5981,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -5130,8 +5993,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -5148,25 +6011,15 @@ "integrity": "sha1-/sfervF+fDoKVeHaBCgD4l2RdF0=" }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash-compat": { "version": "3.10.2", "resolved": "https://registry.npmjs.org/lodash-compat/-/lodash-compat-3.10.2.tgz", "integrity": "sha1-xpQBKKnTD46QLNLPmf0Muk7PwYM=" }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, "lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", @@ -5185,23 +6038,6 @@ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", "dev": true }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "3.0.1", - "lodash._isiterateecall": "3.0.9", - "lodash.restparam": "3.6.1" - } - }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", @@ -5238,40 +6074,19 @@ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._createassigner": "3.1.1", - "lodash.keys": "3.1.2" - } - }, "lodash.cond": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true, - "requires": { - "lodash.assign": "3.2.0", - "lodash.restparam": "3.6.1" - } - }, "lodash.escape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "dev": true, "requires": { - "lodash._root": "3.0.1" + "lodash._root": "^3.0.0" } }, "lodash.includes": { @@ -5322,9 +6137,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "lodash.mapvalues": { @@ -5350,15 +6165,15 @@ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" } }, "lodash.templatesettings": { @@ -5367,8 +6182,8 @@ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" } }, "lolex": { @@ -5378,15 +6193,9 @@ "dev": true }, "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "loose-envify": { "version": "1.3.1", @@ -5394,13 +6203,13 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, "lru-cache": { @@ -5410,23 +6219,23 @@ "dev": true }, "lru-memoizer": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-1.12.0.tgz", - "integrity": "sha1-7+ZXBsyKnMZT+A8NWm6jitlQ41I=", - "requires": { - "lock": "0.1.4", - "lodash": "4.17.4", - "lru-cache": "4.0.2", - "very-fast-args": "1.1.0" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-1.13.0.tgz", + "integrity": "sha512-q0wMolfI7yimhZ36kBAfMLOIuDBpRkieN9do0YPjSzCaiy6r73s8wOEq7Ue/B95VSRbXzfnOr1O1QdJc5UIqaw==", + "requires": { + "lock": "~0.1.2", + "lodash": "^4.17.4", + "lru-cache": "~4.0.0", + "very-fast-args": "^1.1.0" }, "dependencies": { "lru-cache": { "version": "4.0.2", - "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" } } } @@ -5437,16 +6246,16 @@ "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", "dev": true, "requires": { - "es5-ext": "0.10.35" + "es5-ext": "~0.10.2" } }, "make-dir": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -5463,10 +6272,19 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "media-typer": { @@ -5480,7 +6298,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "memoizee": { @@ -5489,14 +6307,14 @@ "integrity": "sha1-vemBdmPJ5A/bKk6hw2cpYIeujI8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-weak-map": "2.0.2", - "event-emitter": "0.3.5", - "is-promise": "2.1.0", - "lru-queue": "0.1.0", - "next-tick": "1.0.0", - "timers-ext": "0.1.2" + "d": "1", + "es5-ext": "^0.10.30", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.2" } }, "memwatch-next": { @@ -5504,8 +6322,8 @@ "resolved": "https://registry.npmjs.org/memwatch-next/-/memwatch-next-0.3.0.tgz", "integrity": "sha1-IREFD5qQbgqi1ypOwPAInHhyb48=", "requires": { - "bindings": "1.2.1", - "nan": "2.7.0" + "bindings": "^1.2.1", + "nan": "^2.3.2" } }, "merge-descriptors": { @@ -5519,9 +6337,9 @@ "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", "requires": { "debug": "2.6.9", - "methods": "1.1.2", - "parseurl": "1.3.2", - "vary": "1.1.2" + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" } }, "methods": { @@ -5535,19 +6353,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "millisecond": { @@ -5560,259 +6378,784 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "~1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + } + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "moment-timezone": { + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", + "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "murmur-hash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmur-hash-js/-/murmur-hash-js-1.0.0.tgz", + "integrity": "sha1-UEEEkmnJZjPIZjhpYLL0KJ515bA=" + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + } + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "nice-simple-logger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nice-simple-logger/-/nice-simple-logger-1.0.1.tgz", + "integrity": "sha1-D55khSe+e+PkmrdvqMjAmK+VG/Y=", "requires": { - "brace-expansion": "1.1.8" + "lodash": "^4.3.0" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "no-kafka": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/no-kafka/-/no-kafka-3.4.3.tgz", + "integrity": "sha512-hYnkg1OWVdaxORdzVvdQ4ueWYpf7IICObPzd24BBiDyVG5219VkUnRxSH9wZmisFb6NpgABzlSIL1pIZaCKmXg==", "requires": { - "minimist": "0.0.8" + "@types/bluebird": "3.5.0", + "@types/lodash": "^4.14.55", + "bin-protocol": "^3.1.1", + "bluebird": "^3.3.3", + "buffer-crc32": "^0.2.5", + "hashring": "^3.2.0", + "lodash": "=4.17.11", + "murmur-hash-js": "^1.0.0", + "nice-simple-logger": "^1.0.1", + "wrr-pool": "^1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + } } }, - "mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", - "dev": true, - "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", - "mkdirp": "0.5.1", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" + "nodemon": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.1.tgz", + "integrity": "sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg==", + "dev": true, + "requires": { + "chokidar": "^2.1.5", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.6", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" }, "dependencies": { - "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "0.7.1" + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "escape-string-regexp": { + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimatch": "0.3.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", - "dev": true - } - } - }, - "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" - }, - "moment-timezone": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.14.tgz", - "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", - "requires": { - "moment": "2.22.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "murmur-hash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmur-hash-js/-/murmur-hash-js-1.0.0.tgz", - "integrity": "sha1-UEEEkmnJZjPIZjhpYLL0KJ515bA=" - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "ncp": "2.0.0", - "rimraf": "2.4.5" - } - }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" - }, - "natives": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", - "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-simple-logger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nice-simple-logger/-/nice-simple-logger-1.0.1.tgz", - "integrity": "sha1-D55khSe+e+PkmrdvqMjAmK+VG/Y=", - "requires": { - "lodash": "4.17.4" - } - }, - "no-kafka": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/no-kafka/-/no-kafka-3.2.10.tgz", - "integrity": "sha1-0sq8QwZbSS24wVyiOK6V8WgIGvU=", - "requires": { - "@types/bluebird": "3.5.0", - "@types/lodash": "4.14.116", - "bin-protocol": "3.0.4", - "bluebird": "3.5.1", - "buffer-crc32": "0.2.13", - "hashring": "3.2.0", - "lodash": "4.17.5", - "murmur-hash-js": "1.0.0", - "nice-simple-logger": "1.0.1", - "wrr-pool": "1.1.3" - }, - "dependencies": { - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "nodemon": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", - "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", - "dev": true, - "requires": { - "chokidar": "1.7.0", - "debug": "2.6.9", - "es6-promise": "3.3.1", - "ignore-by-default": "1.0.1", - "lodash.defaults": "3.1.2", - "minimatch": "3.0.4", - "ps-tree": "1.1.0", - "touch": "3.1.0", - "undefsafe": "0.0.3", - "update-notifier": "2.3.0" - } - }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "1" } }, "normalize-package-data": { @@ -5821,10 +7164,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5833,7 +7176,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -5842,7 +7185,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -5861,16 +7204,55 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "array-each": "1.0.1", - "array-slice": "1.0.0", - "for-own": "1.0.0", - "isobject": "3.0.1" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "for-own": { @@ -5879,7 +7261,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "isobject": { @@ -5896,8 +7278,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -5906,7 +7288,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -5935,7 +7317,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -5950,8 +7332,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { @@ -5968,12 +7350,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "orchestrator": { @@ -5982,9 +7364,9 @@ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", "dev": true, "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.0" + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" } }, "ordered-read-streams": { @@ -6004,9 +7386,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -6021,9 +7403,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" } }, "p-finally": { @@ -6044,7 +7426,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "package-json": { @@ -6053,10 +7435,10 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.4.1" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "packet-reader": { @@ -6070,9 +7452,9 @@ "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", "dev": true, "requires": { - "is-absolute": "0.2.6", - "map-cache": "0.2.2", - "path-root": "0.1.1" + "is-absolute": "^0.2.3", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, "parse-glob": { @@ -6081,10 +7463,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -6093,7 +7475,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -6107,13 +7489,25 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -6145,7 +7539,7 @@ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "path-root-regex": "0.1.2" + "path-root-regex": "^0.1.0" } }, "path-root-regex": { @@ -6165,16 +7559,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "2.3.8" + "pify": "^2.0.0" } }, "performance-now": { @@ -6192,9 +7577,9 @@ "js-string-escape": "1.0.1", "packet-reader": "0.2.0", "pg-connection-string": "0.1.3", - "pg-types": "1.12.1", + "pg-types": "1.*", "pgpass": "0.0.3", - "semver": "4.3.6" + "semver": "^4.1.0" }, "dependencies": { "semver": { @@ -6214,7 +7599,7 @@ "resolved": "https://registry.npmjs.org/pg-native/-/pg-native-1.10.1.tgz", "integrity": "sha1-lOYcy7hafzQ2suUmMVx1gRB/5Aw=", "requires": { - "libpq": "1.8.8", + "libpq": "^1.7.0", "pg-types": "1.6.0", "readable-stream": "1.0.31" }, @@ -6229,10 +7614,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz", "integrity": "sha1-jyUC4LyeOw2huUUgqrtOJgPsr64=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } } } @@ -6242,10 +7627,10 @@ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.12.1.tgz", "integrity": "sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I=", "requires": { - "postgres-array": "1.0.2", - "postgres-bytea": "1.0.0", - "postgres-date": "1.0.3", - "postgres-interval": "1.1.1" + "postgres-array": "~1.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.0", + "postgres-interval": "^1.1.0" } }, "pgpass": { @@ -6253,7 +7638,7 @@ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-0.0.3.tgz", "integrity": "sha1-EuZ+NDsxicLzEgbrycwL7//PkUA=", "requires": { - "split": "0.3.3" + "split": "~0.3" } }, "pify": { @@ -6274,7 +7659,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -6283,7 +7668,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pluralize": { @@ -6292,6 +7677,12 @@ "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "postgres-array": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.2.tgz", @@ -6312,7 +7703,7 @@ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.1.tgz", "integrity": "sha512-OkuCi9t/3CZmeQreutGgx/OVNv9MKHGIT5jH8KldQ4NLYXkvmT9nDVxEuCENlNwhlGPE374oA/xMqn05G49pHA==", "requires": { - "xtend": "4.0.1" + "xtend": "^4.0.0" } }, "precond": { @@ -6366,9 +7757,14 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, + "promise-polyfill": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", + "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -6385,28 +7781,25 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.5.2" } }, - "ps-tree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", - "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", - "dev": true, - "requires": { - "event-stream": "3.3.4" - } - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" + }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true }, "punycode": { "version": "1.3.2", @@ -6423,47 +7816,6 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -6481,15 +7833,15 @@ } }, "rc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", - "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -6506,9 +7858,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -6517,8 +7869,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { "find-up": { @@ -6527,7 +7879,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -6537,10 +7889,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "readdirp": { @@ -6548,32 +7900,35 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, + "optional": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" }, "dependencies": { "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "dev": true, + "optional": true }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, + "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -6581,8 +7936,9 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -6593,8 +7949,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", "mute-stream": "0.0.5" } }, @@ -6614,7 +7970,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.5.0" + "resolve": "^1.1.6" } }, "reconnect-core": { @@ -6622,7 +7978,7 @@ "resolved": "https://registry.npmjs.org/reconnect-core/-/reconnect-core-1.3.0.tgz", "integrity": "sha1-+65SkZp4d9hE4yRtAaLyZwHIM8g=", "requires": { - "backoff": "2.5.0" + "backoff": "~2.5.0" } }, "redefine": { @@ -6649,9 +8005,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" }, "dependencies": { "babel-runtime": { @@ -6660,8 +8016,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } } } @@ -6672,7 +8028,17 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -6681,19 +8047,19 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { - "rc": "1.2.2", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -6702,7 +8068,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.2" + "rc": "^1.0.1" } }, "regjsgen": { @@ -6717,7 +8083,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -6757,7 +8123,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { @@ -6771,34 +8137,34 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.7", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.1.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.21", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "dependencies": { "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "extend": { @@ -6811,22 +8177,22 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.7", - "mime-types": "2.1.21" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "requires": { - "mime-db": "1.37.0" + "mime-db": "1.40.0" } }, "qs": { @@ -6835,9 +8201,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" } } }, @@ -6859,8 +8225,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve": { @@ -6869,7 +8235,7 @@ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-dir": { @@ -6878,8 +8244,8 @@ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", "dev": true, "requires": { - "expand-tilde": "1.2.2", - "global-modules": "0.2.3" + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" } }, "resolve-from": { @@ -6888,33 +8254,35 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "retry-as-promised": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-2.3.2.tgz", "integrity": "sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c=", "requires": { - "bluebird": "3.5.1", - "debug": "2.6.9" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" + "bluebird": "^3.4.6", + "debug": "^2.6.9" } }, "rimraf": { @@ -6922,7 +8290,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "requires": { - "glob": "6.0.4" + "glob": "^6.0.1" } }, "run-async": { @@ -6931,7 +8299,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.3.0" } }, "rx-lite": { @@ -6951,6 +8319,15 @@ "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", "optional": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -6983,7 +8360,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "5.4.1" + "semver": "^5.0.3" } }, "send": { @@ -6992,18 +8369,18 @@ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "requires": { "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.2", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" }, "dependencies": { "statuses": { @@ -7014,33 +8391,26 @@ } }, "sequelize": { - "version": "3.30.4", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-3.30.4.tgz", - "integrity": "sha1-vaLfHjGFSwmeQUmhEen8Clyh0aQ=", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-3.35.1.tgz", + "integrity": "sha512-NhUmk4U+fS33/XW8CZsu1fSk8iSseJWF8fKuSa+kDIAK+lmA254QBbDAJiFvdH0P1ZSxyIS1zXl8FqVK5JDq9g==", "requires": { - "bluebird": "3.5.1", - "depd": "1.1.1", - "dottie": "1.1.1", + "bluebird": "^3.3.4", + "depd": "^1.1.0", + "dottie": "^1.0.0", "generic-pool": "2.4.2", - "inflection": "1.12.0", - "lodash": "4.12.0", - "moment": "2.22.2", - "moment-timezone": "0.5.14", - "retry-as-promised": "2.3.2", - "semver": "5.4.1", - "shimmer": "1.1.0", - "terraformer-wkt-parser": "1.1.2", - "toposort-class": "1.0.1", - "uuid": "3.3.2", - "validator": "5.7.0", - "wkx": "0.2.0" - }, - "dependencies": { - "lodash": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", - "integrity": "sha1-K9bcRqBA9Z5obJcu0h2T3FkFMlg=" - } + "inflection": "^1.6.0", + "lodash": "^4.17.10", + "moment": "^2.13.0", + "moment-timezone": "^0.5.4", + "retry-as-promised": "^2.0.0", + "semver": "^5.0.1", + "shimmer": "1.1.0", + "terraformer-wkt-parser": "^1.1.0", + "toposort-class": "^1.0.1", + "uuid": "^3.0.0", + "validator": "^5.2.0", + "wkx": "0.2.0" } }, "sequelize-cli": { @@ -7049,18 +8419,18 @@ "integrity": "sha1-QwTM5g5JkWlgP4ON7bq0IcmEnnQ=", "dev": true, "requires": { - "bluebird": "3.5.1", - "cli-color": "1.2.0", - "findup-sync": "1.0.0", - "fs-extra": "4.0.2", - "gulp": "3.9.1", - "gulp-help": "1.6.1", - "js-beautify": "1.7.4", - "lodash": "4.17.4", - "moment": "2.22.2", - "resolve": "1.5.0", - "umzug": "1.12.0", - "yargs": "8.0.2" + "bluebird": "^3.5.0", + "cli-color": "~1.2.0", + "findup-sync": "^1.0.0", + "fs-extra": "^4.0.1", + "gulp": "^3.9.1", + "gulp-help": "~1.6.1", + "js-beautify": "^1.6.11", + "lodash": "^4.17.4", + "moment": "^2.17.1", + "resolve": "^1.3.3", + "umzug": "^1.12.0", + "yargs": "^8.0.1" }, "dependencies": { "ansi-regex": { @@ -7081,9 +8451,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -7092,9 +8462,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -7105,8 +8475,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -7121,7 +8491,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -7132,19 +8502,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } } } @@ -7160,9 +8530,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.1" } }, @@ -7176,7 +8546,31 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true + "dev": true, + "optional": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, "setprototypeof": { "version": "1.0.3", @@ -7189,7 +8583,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -7204,9 +8598,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.0.4", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, "dependencies": { "glob": { @@ -7215,12 +8609,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -7256,7 +8650,7 @@ "formatio": "1.1.1", "lolex": "1.3.2", "samsam": "1.1.2", - "util": "0.10.3" + "util": ">=0.10.3 <1" } }, "sinon-chai": { @@ -7277,7 +8671,7 @@ "integrity": "sha1-h4+h1E0I7rDyb7IBjvhinrGjq5Q=", "dev": true, "requires": { - "nan": "2.7.0" + "nan": ">=2.5.1" } }, "slice-ansi": { @@ -7286,21 +8680,148 @@ "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "sparkles": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", @@ -7313,7 +8834,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -7333,7 +8854,16 @@ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "requires": { - "through": "2.3.8" + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -7343,19 +8873,40 @@ "dev": true }, "sshpk": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", - "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } } }, "statuses": { @@ -7363,15 +8914,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "0.1.1" - } - }, "stream-consume": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", @@ -7383,9 +8925,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -7398,7 +8940,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -7424,16 +8966,16 @@ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.0.tgz", "integrity": "sha512-71XGWgtn70TNwgmgYa69dPOYg55aU9FCahjUNY03rOrKvaTCaU3b9MeZmqonmf9Od96SCxr3vGfEAnhM7dtxCw==", "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.3.3" + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.1.1", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.0.5" }, "dependencies": { "debug": { @@ -7454,13 +8996,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -7468,7 +9010,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -7484,8 +9026,8 @@ "integrity": "sha1-oFgIHXiPFRXUcA11Aogea3WeRM0=", "dev": true, "requires": { - "methods": "1.1.2", - "superagent": "2.3.0" + "methods": "1.x", + "superagent": "^2.0.0" }, "dependencies": { "form-data": { @@ -7494,9 +9036,9 @@ "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", "dev": true, "requires": { - "async": "1.5.2", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "async": "^1.5.2", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.10" } }, "isarray": { @@ -7511,13 +9053,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -7526,7 +9068,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "superagent": { @@ -7535,16 +9077,16 @@ "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", "dev": true, "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1", + "component-emitter": "^1.2.0", + "cookiejar": "^2.0.6", + "debug": "^2.2.0", + "extend": "^3.0.0", "form-data": "1.0.0-rc4", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.3.3" + "formidable": "^1.0.17", + "methods": "^1.1.1", + "mime": "^1.3.4", + "qs": "^6.1.0", + "readable-stream": "^2.0.5" } } } @@ -7560,12 +9102,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", "slice-ansi": "0.0.4", - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -7586,8 +9128,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -7596,23 +9138,24 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, "tc-core-library-js": { "version": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab", - "requires": { - "auth0-js": "9.8.2", - "axios": "0.12.0", - "bunyan": "1.8.12", - "jsonwebtoken": "8.3.0", - "jwks-rsa": "1.3.0", - "le_node": "1.8.0", - "lodash": "4.17.11", - "millisecond": "0.1.2", - "request": "2.88.0" + "from": "github:appirio-tech/tc-core-library-js#v2.6", + "requires": { + "auth0-js": "^9.4.2", + "axios": "^0.12.0", + "bunyan": "^1.8.12", + "jsonwebtoken": "^8.3.0", + "jwks-rsa": "^1.3.0", + "le_node": "^1.3.1", + "lodash": "^4.17.10", + "millisecond": "^0.1.2", + "request": "^2.88.0" }, "dependencies": { "axios": { @@ -7628,14 +9171,14 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz", "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=", "requires": { - "debug": "2.6.9", - "stream-consume": "0.1.0" + "debug": "^2.2.0", + "stream-consume": "^0.1.0" } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" } } }, @@ -7645,23 +9188,24 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "terraformer": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.8.tgz", - "integrity": "sha1-UeCtiXRvzyFh3G9lqnDkI3fItZM=", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.9.tgz", + "integrity": "sha512-YlmQ1fsMWTkKGDGibCRWgmLzrpDRUr63Q025LJ/taYQ6j1Yb8q9McKF7NBi6ACAyUXO6F/bl9w6v4MY307y5Ag==", "requires": { - "@types/geojson": "1.0.6" + "@types/geojson": "^1.0.0" } }, "terraformer-wkt-parser": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.2.tgz", - "integrity": "sha1-M2oMj8gglKWv+DKI9prt7NNpvww=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz", + "integrity": "sha512-QU3iA54St5lF8Za1jg1oj4NYc8sn5tCZ08aNSWDeGzrsaV48eZk1iAVWasxhNspYBoCqdHuoot1pUTUrE1AJ4w==", "requires": { - "terraformer": "1.0.8" + "@types/geojson": "^1.0.0", + "terraformer": "~1.0.5" } }, "text-table": { @@ -7681,8 +9225,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" }, "dependencies": { "isarray": { @@ -7697,13 +9241,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -7712,7 +9256,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -7723,7 +9267,7 @@ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "time-stamp": { @@ -7744,8 +9288,8 @@ "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", "dev": true, "requires": { - "es5-ext": "0.10.35", - "next-tick": "1.0.0" + "es5-ext": "~0.10.14", + "next-tick": "1" } }, "to-fast-properties": { @@ -7760,12 +9304,54 @@ "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, "topo": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "toposort-class": { @@ -7779,7 +9365,7 @@ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { - "nopt": "1.0.10" + "nopt": "~1.0.10" }, "dependencies": { "nopt": { @@ -7788,7 +9374,7 @@ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "1" } } } @@ -7798,8 +9384,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "1.1.31", - "punycode": "1.4.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" }, "dependencies": { "punycode": { @@ -7831,7 +9417,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -7845,7 +9431,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -7860,7 +9446,7 @@ "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.17" + "mime-types": "~2.1.15" } }, "typedarray": { @@ -7869,36 +9455,17 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, "umzug": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/umzug/-/umzug-1.12.0.tgz", "integrity": "sha1-p5yR8oYu7jEwxsNH8rkK1opm6Lg=", "dev": true, "requires": { - "bluebird": "3.5.1", - "lodash": "4.17.4", - "moment": "2.22.2", - "redefine": "0.2.1", - "resolve": "1.5.0" + "bluebird": "^3.4.1", + "lodash": "^4.17.0", + "moment": "^2.16.0", + "redefine": "^0.2.0", + "resolve": "^1.0.0" } }, "unc-path-regex": { @@ -7908,10 +9475,30 @@ "dev": true }, "undefsafe": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", - "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "unfetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.1.0.tgz", + "integrity": "sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } }, "unique-stream": { "version": "1.0.0", @@ -7925,7 +9512,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universalify": { @@ -7939,62 +9526,121 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", "dev": true }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, "update-notifier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", - "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", - "dev": true, - "requires": { - "boxen": "1.2.2", - "chalk": "2.3.0", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.0" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^3.0.0" } } } @@ -8004,7 +9650,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -8014,6 +9660,12 @@ } } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -8024,9 +9676,9 @@ } }, "url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" }, "url-parse-lax": { "version": "1.0.0", @@ -8034,7 +9686,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "urlencode": { @@ -8042,9 +9694,15 @@ "resolved": "https://registry.npmjs.org/urlencode/-/urlencode-1.1.0.tgz", "integrity": "sha1-HyuibwE8hfATP3o61v8nMK33y7c=", "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.11" } }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", @@ -8089,7 +9747,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "1.1.1" + "user-home": "^1.1.1" } }, "validate-npm-package-license": { @@ -8098,8 +9756,8 @@ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "validator": { @@ -8117,9 +9775,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "very-fast-args": { @@ -8133,8 +9791,8 @@ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" }, "dependencies": { @@ -8152,14 +9810,14 @@ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "dev": true, "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" }, "dependencies": { "clone": { @@ -8174,7 +9832,7 @@ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", "dev": true, "requires": { - "natives": "1.1.0" + "natives": "^1.1.0" } }, "readable-stream": { @@ -8183,10 +9841,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "strip-bom": { @@ -8195,8 +9853,8 @@ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", "dev": true, "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" } }, "through2": { @@ -8205,8 +9863,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, "vinyl": { @@ -8215,8 +9873,8 @@ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" } } } @@ -8227,7 +9885,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -8237,25 +9895,51 @@ "dev": true }, "widest-line": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "winchan": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.1.tgz", - "integrity": "sha512-QrG9q+ObfmZBxScv0HSCqFm/owcgyR5Sgpiy1NlCZPpFXhbsmNHhTiLWoogItdBUi0fnU7Io/5ABEqRta5/6Dw==" - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.2.tgz", + "integrity": "sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ==" }, "wkx": { "version": "0.2.0", @@ -8274,8 +9958,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -8289,26 +9973,26 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "wrr-pool": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wrr-pool/-/wrr-pool-1.1.3.tgz", - "integrity": "sha1-/a0i8uofMDY//l14HPeUl6d/8H4=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/wrr-pool/-/wrr-pool-1.1.4.tgz", + "integrity": "sha512-+lEdj42HlYqmzhvkZrx6xEymj0wzPBxqr7U1Xh9IWikMzOge03JSQT9YzTGq54SkOh/noViq32UejADZVzrgAg==", "requires": { - "lodash": "4.17.4" + "lodash": "^4.17.11" } }, "xdg-basedir": { @@ -8322,8 +10006,8 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", "requires": { - "sax": "1.2.1", - "xmlbuilder": "4.2.1" + "sax": ">=0.6.0", + "xmlbuilder": "^4.1.0" } }, "xmlbuilder": { @@ -8331,7 +10015,7 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", "requires": { - "lodash": "4.17.4" + "lodash": "^4.0.0" } }, "xtend": { @@ -8350,26 +10034,13 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - }, "yargs-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { diff --git a/postman.json b/postman.json index 17ee5a26..8b0b0a18 100644 --- a/postman.json +++ b/postman.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "efae2a9b-b869-4965-b889-3278870b29ea", + "_postman_id": "63434b2d-3d11-4c2d-8200-8ca342c8c18e", "name": "tc-project-service", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -6991,6 +6991,838 @@ "response": [] } ] + }, + { + "name": "Project Setting", + "item": [ + { + "name": "Create project setting - double", + "event": [ + { + "listen": "test", + "script": { + "id": "7350de08-5111-44f8-8a4c-3d0c48bcd8d4", + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + " pm.environment.set(\"settingId\", pm.response.json().result.content.id);", + "})" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting - percentage", + "event": [ + { + "listen": "test", + "script": { + "id": "bf3aa19f-517c-4103-9250-82d7847e7477", + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_fee\",\r\n \"value\": \"18.88\",\r\n \"valueType\": \"percentage\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \"topcoderRoles\": [\"Connect Copilot\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting - for project = 2", + "event": [ + { + "listen": "test", + "script": { + "id": "7350de08-5111-44f8-8a4c-3d0c48bcd8d4", + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"2222\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/2/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting - another estimation type", + "event": [ + { + "listen": "test", + "script": { + "id": "7350de08-5111-44f8-8a4c-3d0c48bcd8d4", + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_reference_program\",\r\n \"value\": \"17800\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\", \"copilot\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting with non estimation type", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_non_estimation\",\r\n \"value\": \"8765\",\r\n \"valueType\": \"string\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t \"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting - duplicate key", + "event": [ + { + "listen": "test", + "script": { + "id": "7350de08-5111-44f8-8a4c-3d0c48bcd8d4", + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting with invalid valueType", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"int1\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting with invalid percentage value", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_community\",\r\n \"value\": \"200\",\r\n \"valueType\": \"percentage\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting with missing readPermission", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"int\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting with empty body", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Create project setting - not permitted", + "event": [ + { + "listen": "test", + "script": { + "id": "7350de08-5111-44f8-8a4c-3d0c48bcd8d4", + "exec": [ + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-member-40051331}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "List project setting", + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "List project setting(filter)", + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "url": { + "raw": "{{api-url}}/v4/projects/1/settings?includeAllProjectSettingsForInternalUsage=true", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ], + "query": [ + { + "key": "includeAllProjectSettingsForInternalUsage", + "value": "true" + } + ] + } + }, + "response": [] + }, + { + "name": "List project setting - 403", + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-copilot-40051332}}" + } + ], + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "List project setting - manager", + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-manager-40051334}}" + } + ], + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Update project setting - change to different estimation type", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_community\",\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"Connect Manager\"]\r\n\t }\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings/{{settingId}}", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings", + "{{settingId}}" + ] + } + }, + "response": [] + }, + { + "name": "Update project setting - change double to percentage", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"value\": \"35.60\",\r\n \"valueType\": \"percentage\"\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings/{{settingId}}", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings", + "{{settingId}}" + ] + } + }, + "response": [] + }, + { + "name": "Update project setting - change to non-estimation type", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_non_estimated\"\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings/{{settingId}}", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings", + "{{settingId}}" + ] + } + }, + "response": [] + }, + { + "name": "Update project setting - non-existent project", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"value\": \"30\",\r\n \"valueType\": \"percentage\"\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/9999/settings/{{settingId}}", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "9999", + "settings", + "{{settingId}}" + ] + } + }, + "response": [] + }, + { + "name": "Update project setting - non-existent project setting", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"value\": \"30\",\r\n \"valueType\": \"percentage\"\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings/9999", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings", + "9999" + ] + } + }, + "response": [] + }, + { + "name": "Update project setting - change readPermission", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-admin-40051333}}" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_community\",\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"Connect Manager\"]\r\n\t }\r\n }\r\n}" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings/{{settingId}}", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings", + "{{settingId}}" + ] + } + }, + "response": [] + }, + { + "name": "List project setting - manager - after update", + "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-manager-40051334}}" + } + ], + "url": { + "raw": "{{api-url}}/v4/projects/1/settings", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Delete project setting", + "request": { + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "{{api-url}}/v4/projects/1/settings/{{settingId}}", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "settings", + "{{settingId}}" + ] + } + }, + "response": [] + } + ] } ] -} \ No newline at end of file +} diff --git a/src/constants.js b/src/constants.js index eaffc3b9..f93a1b1c 100644 --- a/src/constants.js +++ b/src/constants.js @@ -191,3 +191,10 @@ export const ESTIMATION_TYPE = { TOPCODER_SERVICE: 'topcoder_service', REFERENCE_PROGRAM: 'reference_program', }; + +export const VALUE_TYPE = { + INT: 'int', + DOUBLE: 'double', + STRING: 'string', + PERCENTAGE: 'percentage', +}; diff --git a/src/models/projectEstimationItem.js b/src/models/projectEstimationItem.js new file mode 100644 index 00000000..73c4ce74 --- /dev/null +++ b/src/models/projectEstimationItem.js @@ -0,0 +1,41 @@ +/* eslint-disable valid-jsdoc */ + +import _ from 'lodash'; +import { ESTIMATION_TYPE } from '../constants'; + +module.exports = function defineProjectHistory(sequelize, DataTypes) { + const ProjectEstimationItem = sequelize.define( + 'ProjectEstimationItem', + { + id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true }, + projectEstimationId: { type: DataTypes.BIGINT, allowNull: false }, // ProjectEstimation id + price: { type: DataTypes.DOUBLE, allowNull: false }, + type: { + type: DataTypes.STRING, + allowNull: false, + validate: { + isIn: [_.values(ESTIMATION_TYPE)], + }, + }, + markupUsedReference: { type: DataTypes.STRING, allowNull: false }, + markupUsedReferenceId: { type: DataTypes.BIGINT, allowNull: false }, // ProjectSetting id + metadata: { type: DataTypes.JSON, allowNull: false, defaultValue: {} }, + deletedAt: { type: DataTypes.DATE, allowNull: true }, + createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + updatedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + deletedBy: DataTypes.BIGINT, + createdBy: { type: DataTypes.INTEGER, allowNull: false }, + updatedBy: { type: DataTypes.INTEGER, allowNull: false }, + }, + { + tableName: 'project_estimation_items', + paranoid: true, + timestamps: true, + updatedAt: 'updatedAt', + createdAt: 'createdAt', + indexes: [], + }, + ); + + return ProjectEstimationItem; +}; diff --git a/src/models/projectSetting.js b/src/models/projectSetting.js new file mode 100644 index 00000000..cb233050 --- /dev/null +++ b/src/models/projectSetting.js @@ -0,0 +1,104 @@ +/* eslint-disable valid-jsdoc */ + +import _ from 'lodash'; +import { VALUE_TYPE } from '../constants'; +import util from '../util'; + +const populateSetting = (settings, options) => { + if (Array.isArray(settings)) { + const promises = []; + _.each(settings, (setting) => { + promises.push(util.hasPermissionForProject(setting.readPermission, options.reqUser, options.projectId) + .then((r) => { + if (!r) { + _.remove(settings, { + id: setting.id, + }); + } + })); + }); + + return Promise.all(promises); + } + + return util.hasPermissionForProject(settings.readPermission, options.reqUser, options.projectId) + .then((r) => { + if (!r) { + _.map(settings, (s) => { + if (Object.prototype.hasOwnProperty.call(settings, s)) { + delete settings[s]; // eslint-disable-line no-param-reassign + } + }); + } + }); +}; + + +module.exports = (sequelize, DataTypes) => { + const ProjectSetting = sequelize.define( + 'ProjectSetting', + { + id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true }, + key: { type: DataTypes.STRING(255) }, + value: { type: DataTypes.STRING(255) }, + valueType: { + type: DataTypes.STRING, + validate: { + isIn: [_.values(VALUE_TYPE)], + }, + }, + projectId: { type: DataTypes.BIGINT, allowNull: false }, // Project id + metadata: { type: DataTypes.JSON, allowNull: false, defaultValue: {} }, + readPermission: { type: DataTypes.JSON, allowNull: false, defaultValue: {} }, + writePermission: { type: DataTypes.JSON, allowNull: false, defaultValue: {} }, + deletedAt: { type: DataTypes.DATE, allowNull: true }, + createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + updatedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, + deletedBy: DataTypes.BIGINT, + createdBy: { type: DataTypes.INTEGER, allowNull: false }, + updatedBy: { type: DataTypes.INTEGER, allowNull: false }, + }, + { + tableName: 'project_settings', + paranoid: true, + timestamps: true, + updatedAt: 'updatedAt', + createdAt: 'createdAt', + indexes: [ + { + unique: true, + fields: ['key', 'projectId'], + }, + ], + hooks: { + beforeFind: (options) => { + _.assign(options, { projectId: options.where.projectId }); + if (options.includeAllProjectSettingsForInternalUsage) { + return { where: options.where, attributes: options.attributes }; + } + + if (!options.reqUser) { + throw new Error('reqUser not found'); + } + // Check permissions + return { + reqUser: options.reqUser, + where: options.where, + attributes: options.attributes, + }; + }, + + afterFind: (settings, options) => { + if (!settings) return Promise.resolve(); + if (options.reqUser) { + return populateSetting(settings, options); + } + return settings; + }, + + }, + }, + ); + + return ProjectSetting; +}; diff --git a/src/permissions/index.js b/src/permissions/index.js index 5acab2be..7c1f2a5c 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -8,8 +8,9 @@ const projectMemberDelete = require('./projectMember.delete'); const projectAdmin = require('./admin.ops'); const projectAttachmentUpdate = require('./project.updateAttachment'); const projectAttachmentDownload = require('./project.downloadAttachment'); -// const connectManagerOrAdmin = require('./connectManagerOrAdmin.ops'); +const connectManagerOrAdmin = require('./connectManagerOrAdmin.ops'); const copilotAndAbove = require('./copilotAndAbove'); +const projectSettings = require('./projectSetting'); module.exports = () => { Authorizer.setDeniedStatusCode(403); @@ -98,4 +99,9 @@ module.exports = () => { Authorizer.setPolicy('planConfig.edit', projectAdmin); Authorizer.setPolicy('planConfig.delete', projectAdmin); Authorizer.setPolicy('planConfig.view', true); // anyone can view price config + + Authorizer.setPolicy('projectSetting.create', connectManagerOrAdmin); + Authorizer.setPolicy('projectSetting.edit', projectSettings); + Authorizer.setPolicy('projectSetting.delete', connectManagerOrAdmin); + Authorizer.setPolicy('projectSetting.view', projectView); }; diff --git a/src/permissions/projectSetting.js b/src/permissions/projectSetting.js new file mode 100644 index 00000000..99b9f911 --- /dev/null +++ b/src/permissions/projectSetting.js @@ -0,0 +1,47 @@ + +import _ from 'lodash'; +import util from '../util'; +import models from '../models'; + +/** + * Allow/Deny based on projectSetting writePermission + * @param {Object} req the request + * @return {Promise} Returns a promise + */ +module.exports = req => new Promise((resolve, reject) => { + const projectId = _.parseInt(req.params.projectId); + const id = _.parseInt(req.params.id); + + return models.Project.findOne({ + where: { + id: projectId, + }, + }) + .then((project) => { + if (!project) { + return resolve(true); + } + + return models.ProjectSetting.findOne({ + includeAllProjectSettingsForInternalUsage: true, + where: { + projectId, + id, + }, + }); + }) + .then((setting) => { + if (!setting) { + return resolve(true); + } + + return util.hasPermissionForProject(setting.writePermission, req.authUser, projectId); + }) + .then((hasAccess) => { + if (!hasAccess) { + const errorMessage = 'You do not have permissions to perform this action'; + return reject(new Error(errorMessage)); + } + return resolve(true); + }); +}); diff --git a/src/routes/index.js b/src/routes/index.js index c6f711ef..911ecb34 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -271,6 +271,14 @@ router.route('/v4/projects/metadata/planConfig/:key/versions/:version(\\d+)') .patch(require('./planConfig/version/update')) .delete(require('./planConfig/version/delete')); +router.route('/v4/projects/:projectId(\\d+)/settings/:id(\\d+)') + .patch(require('./projectSettings/update')) + .delete(require('./projectSettings/delete')); + +router.route('/v4/projects/:projectId(\\d+)/settings') + .get(require('./projectSettings/list')) + .post(require('./projectSettings/create')); + // register error handler router.use((err, req, res, next) => { // eslint-disable-line no-unused-vars // DO NOT REMOVE next arg.. even though eslint diff --git a/src/routes/projectSettings/create.js b/src/routes/projectSettings/create.js new file mode 100644 index 00000000..393c8879 --- /dev/null +++ b/src/routes/projectSettings/create.js @@ -0,0 +1,115 @@ +/** + * API to add a project setting + */ +import validate from 'express-validation'; +import _ from 'lodash'; +import Joi from 'joi'; +import { middleware as tcMiddleware } from 'tc-core-library-js'; +import util from '../../util'; +import models from '../../models'; +import { VALUE_TYPE, ESTIMATION_TYPE } from '../../constants'; + +const permissions = tcMiddleware.permissions; + +const schema = { + params: { + projectId: Joi.number().integer().positive().required(), + }, + body: { + param: Joi.object().keys({ + key: Joi.string().max(255).required(), + value: Joi.string().max(255).required(), + valueType: Joi.string().valid(_.values(VALUE_TYPE)).required(), + projectId: Joi.any().strip(), + metadata: Joi.object().optional(), + readPermission: Joi.object().required(), + writePermission: Joi.object().required(), + createdAt: Joi.any().strip(), + updatedAt: Joi.any().strip(), + deletedAt: Joi.any().strip(), + createdBy: Joi.any().strip(), + updatedBy: Joi.any().strip(), + deletedBy: Joi.any().strip(), + }).required(), + }, +}; + +module.exports = [ + validate(schema), + permissions('projectSetting.create'), + // eslint-disable-next-line consistent-return + (req, res, next) => { + let setting = null; + const projectId = req.params.projectId; + const entity = _.assign(req.body.param, { + createdBy: req.authUser.userId, + updatedBy: req.authUser.userId, + }); + + if (_.includes(ESTIMATION_TYPE, entity.key.split('markup_')[1]) + && entity.valueType === VALUE_TYPE.PERCENTAGE + && (entity.value <= 0 || entity.value > 100)) { + const apiErr = new Error(`Estimation value as a ${entity.valueType} should be between 1 and 100`); + apiErr.status = 422; + return next(apiErr); + } + + // Check if project exists + models.sequelize.transaction(() => + models.Project.findOne({ where: { id: projectId } }) + .then((project) => { + if (!project) { + const apiErr = new Error(`Project not found for id ${projectId}`); + apiErr.status = 404; + return Promise.reject(apiErr); + } + + // Find project setting + return models.ProjectSetting.findOne({ + reqUser: req.authUser, + where: { + projectId, + key: req.body.param.key, + }, + paranoid: false, + }); + }) + .then((projectSetting) => { + if (projectSetting) { + const apiErr = new Error(`Project Setting already exists for project id ${projectId}` + + `and key ${req.body.param.key}`); + apiErr.status = 422; + return Promise.reject(apiErr); + } + + if (projectSetting && projectSetting.noAccess) { + const apiErr = new Error('You do not have permissions to perform this action'); + apiErr.status = 403; + return Promise.reject(apiErr); + } + + const body = req.body.param; + body.projectId = projectId; + // Create + return models.ProjectSetting.create(entity); + }), + ) + .then((createdEntity) => { + setting = createdEntity; + // Calculate for valid estimation type + if (_.includes(_.values(ESTIMATION_TYPE), createdEntity.key.split('markup_')[1])) { + return util.calculateProjectEstimationItems(req, projectId); + } + + return Promise.resolve(); + }) + .then(() => { + req.log.debug('new project setting created (id# %d, key: %s)', + setting.id, setting.key); + // Omit deletedAt, deletedBy + res.status(201).json(util.wrapResponse( + req.id, _.omit(setting.toJSON(), 'deletedAt', 'deletedBy'), 1, 201)); + }) + .catch(next); + }, +]; diff --git a/src/routes/projectSettings/create.spec.js b/src/routes/projectSettings/create.spec.js new file mode 100644 index 00000000..7d0fb497 --- /dev/null +++ b/src/routes/projectSettings/create.spec.js @@ -0,0 +1,376 @@ +/** + * Tests for create.js + */ +import _ from 'lodash'; +import chai from 'chai'; +import request from 'supertest'; + +import server from '../../app'; +import testUtil from '../../tests/util'; +import models from '../../models'; +import { VALUE_TYPE } from '../../constants'; + +const should = chai.should(); + +const expectAfterCreate = (id, projectId, estimation, len, deletedLen, err, next) => { + if (err) throw err; + setTimeout(() => + models.ProjectSetting.findOne({ + includeAllProjectSettingsForInternalUsage: true, + where: { + id, + projectId, + }, + }) + .then((res) => { + if (!res) { + throw new Error('Should found the entity'); + } else { + models.ProjectEstimationItem.findAll({ + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + deletedAt: { $ne: null }, + }, + paranoid: false, + }).then((items) => { + // deleted project estimation items + items.should.have.lengthOf(deletedLen); + + _.each(items, (item) => { + should.exist(item.deletedBy); + should.exist(item.deletedAt); + }); + + return models.ProjectEstimationItem.findAll({ + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + paranoid: true, + }); + }).then((entities) => { + entities.should.have.lengthOf(len); + if (len) { + entities[0].projectEstimationId.should.be.eql(estimation.id); + if (estimation.valueType === VALUE_TYPE.PERCENTAGE) { + entities[0].price.should.be.eql((estimation.price * estimation.value) / 100); + } else { + entities[0].price.should.be.eql(Number(estimation.value)); + } + entities[0].type.should.be.eql(estimation.key.split('markup_')[1]); + entities[0].markupUsedReference.should.be.eql('projectSetting'); + entities[0].markupUsedReferenceId.should.be.eql(id); + should.exist(entities[0].updatedAt); + should.not.exist(entities[0].deletedBy); + should.not.exist(entities[0].deletedAt); + } + + next(); + }); + } + }), 500); +}; + + +describe('CREATE Project Setting', () => { + let projectId; + let estimationId; + + const body = { + param: { + key: 'markup_topcoder_service', + value: '3500', + valueType: 'double', + readPermission: { + projectRoles: ['customer'], + topcoderRoles: ['administrator'], + }, + writePermission: { + allowRule: { topcoderRoles: ['administrator'] }, + denyRule: { projectRoles: ['copilot'] }, + }, + createdBy: 1, + updatedBy: 1, + }, + }; + + const estimation = { + buildingBlockKey: 'BLOCK_KEY', + conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || CA_NEEDED)', + price: 5000, + quantity: 10, + minTime: 35, + maxTime: 35, + metadata: { + deliverable: 'dev-qa', + }, + createdBy: 1, + updatedBy: 1, + }; + + beforeEach((done) => { + testUtil.clearDb() + .then(() => { + // Create projects + models.Project.create({ + type: 'generic', + billingAccountId: 1, + name: 'test1', + description: 'test project1', + status: 'draft', + details: {}, + createdBy: 1, + updatedBy: 1, + lastActivityAt: 1, + lastActivityUserId: '1', + }) + .then((project) => { + projectId = project.id; + + models.ProjectEstimation.create(_.assign(estimation, { projectId })) + .then((e) => { + estimationId = e.id; + done(); + }); + }); + }); + }); + + after(testUtil.clearDb); + + describe('POST /projects/{projectId}/settings', () => { + it('should return 403 if user is not authenticated', (done) => { + request(server) + .post(`/v4/projects/${projectId}/settings`) + .send(body) + .expect(403, done); + }); + + it('should return 403 for member', (done) => { + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.member}`, + }) + .send(body) + .expect(403, done); + }); + + it('should return 403 for copilot', (done) => { + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.copilot}`, + }) + .send(body) + .expect(403, done); + }); + + it('should return 404 for non-existed project', (done) => { + request(server) + .post('/v4/projects/9999/settings') + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(body) + .expect(404, done); + }); + + it('should return 422 for missing key', (done) => { + const invalidBody = _.cloneDeep(body); + delete invalidBody.param.key; + + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(invalidBody) + .expect('Content-Type', /json/) + .expect(422, done); + }); + + it('should return 422 for missing value', (done) => { + const invalidBody = _.cloneDeep(body); + delete invalidBody.param.value; + + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(invalidBody) + .expect('Content-Type', /json/) + .expect(422, done); + }); + + it('should return 422 for missing valueType', (done) => { + const invalidBody = _.cloneDeep(body); + delete invalidBody.param.valueType; + + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(invalidBody) + .expect('Content-Type', /json/) + .expect(422, done); + }); + + it('should return 422 for negative value when valueType = percentage', (done) => { + const invalidBody = _.cloneDeep(body); + invalidBody.param.value = '-10'; + invalidBody.param.valueType = VALUE_TYPE.PERCENTAGE; + + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(invalidBody) + .expect('Content-Type', /json/) + .expect(422, done); + }); + + it('should return 422 for value greater than 100 when valueType = percentage', (done) => { + const invalidBody = _.cloneDeep(body); + invalidBody.param.value = '150'; + invalidBody.param.valueType = VALUE_TYPE.PERCENTAGE; + + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(invalidBody) + .expect('Content-Type', /json/) + .expect(422, done); + }); + + it('should return 422, for admin, when create key with existing key', (done) => { + const existing = _.cloneDeep(body); + existing.param.projectId = projectId; + + models.ProjectSetting.create(existing.param).then(() => { + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(body) + .expect(422, done); + }); + }); + + it('should return 201 for manager with non-estimation type, not calculating project estimation items', + (done) => { + const createBody = _.cloneDeep(body); + createBody.param.key = 'markup_no_estimation'; + + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.manager}`, + }) + .send(createBody) + .expect('Content-Type', /json/) + .expect(201) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.key.should.be.eql(createBody.param.key); + resJson.value.should.be.eql(createBody.param.value); + resJson.valueType.should.be.eql(createBody.param.valueType); + resJson.projectId.should.be.eql(projectId); + resJson.createdBy.should.be.eql(40051334); + should.exist(resJson.createdAt); + resJson.updatedBy.should.be.eql(40051334); + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterCreate(resJson.id, projectId, null, 0, 0, err, done); + }); + }); + + it('should return 201 for manager, calculating project estimation items', (done) => { + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.manager}`, + }) + .send(body) + .expect('Content-Type', /json/) + .expect(201) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.key.should.be.eql(body.param.key); + resJson.value.should.be.eql(body.param.value); + resJson.valueType.should.be.eql(body.param.valueType); + resJson.projectId.should.be.eql(projectId); + resJson.createdBy.should.be.eql(40051334); + should.exist(resJson.createdAt); + resJson.updatedBy.should.be.eql(40051334); + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterCreate(resJson.id, projectId, _.assign(estimation, { + id: estimationId, + value: body.param.value, + valueType: body.param.valueType, + key: body.param.key, + }), 1, 0, err, done); + }); + }); + + it('should return 201 for admin', (done) => { + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(body) + .expect('Content-Type', /json/) + .expect(201) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.key.should.be.eql(body.param.key); + resJson.value.should.be.eql(body.param.value); + resJson.valueType.should.be.eql(body.param.valueType); + resJson.projectId.should.be.eql(projectId); + resJson.createdBy.should.be.eql(40051333); + should.exist(resJson.createdAt); + resJson.updatedBy.should.be.eql(40051333); + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + done(); + }); + }); + + it('should return 201 for connect admin', (done) => { + request(server) + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.connectAdmin}`, + }) + .send(body) + .expect('Content-Type', /json/) + .expect(201) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.key.should.be.eql(body.param.key); + resJson.value.should.be.eql(body.param.value); + resJson.valueType.should.be.eql(body.param.valueType); + resJson.projectId.should.be.eql(projectId); + resJson.createdBy.should.be.eql(40051336); + resJson.updatedBy.should.be.eql(40051336); + should.exist(resJson.createdAt); + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + done(); + }); + }); + }); +}); diff --git a/src/routes/projectSettings/delete.js b/src/routes/projectSettings/delete.js new file mode 100644 index 00000000..ee2cb6c7 --- /dev/null +++ b/src/routes/projectSettings/delete.js @@ -0,0 +1,83 @@ +/** + * API to delete a project setting + */ +import validate from 'express-validation'; +import _ from 'lodash'; +import Joi from 'joi'; +import { middleware as tcMiddleware } from 'tc-core-library-js'; +import util from '../../util'; +import models from '../../models'; +import { ESTIMATION_TYPE } from '../../constants'; + +const permissions = tcMiddleware.permissions; + +const schema = { + params: { + projectId: Joi.number().integer().positive().required(), + id: Joi.number().integer().positive().required(), + }, +}; + +module.exports = [ + validate(schema), + permissions('projectSetting.delete'), + (req, res, next) => { + const projectId = req.params.projectId; + const id = req.params.id; + let deletedEntity = null; + + models.sequelize.transaction(() => + models.ProjectSetting.findOne({ + reqUser: req.authUser, + where: { + id, + projectId, + }, + }) + .then((entity) => { + // Not found + if (!entity) { + const apiErr = new Error(`Project setting not found for id ${id} and project id ${projectId}`); + apiErr.status = 404; + return Promise.reject(apiErr); + } + + deletedEntity = entity; + // Update the deletedBy, then delete + return entity.update({ deletedBy: req.authUser.userId }); + }) + .then(entity => entity.destroy()) + .then(() => models.ProjectEstimationItem.update({ deletedBy: req.authUser.userId }, { + where: { + type: deletedEntity.key.split('markup_')[1], + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + })) + .then(() => models.ProjectEstimationItem.findAll({ + where: { + type: deletedEntity.key.split('markup_')[1], + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + })) + // Delete all Project Estimation Items for the project + .then(items => + _.each((items), item => item.destroy()), + ), + ) + .then(() => { + // Calculate for valid estimation type + if (_.includes(_.values(ESTIMATION_TYPE), deletedEntity.key.split('markup_')[1])) { + req.log.debug(`Recalculate price breakdown for project id ${projectId}`); + return util.calculateProjectEstimationItems(req, projectId); + } + + return Promise.resolve(); + }) + .then(() => { + res.status(204).end(); + }) + .catch(next); + }, +]; diff --git a/src/routes/projectSettings/delete.spec.js b/src/routes/projectSettings/delete.spec.js new file mode 100644 index 00000000..5117bb24 --- /dev/null +++ b/src/routes/projectSettings/delete.spec.js @@ -0,0 +1,291 @@ +/** + * Tests for delete.js + */ +import _ from 'lodash'; +import chai from 'chai'; +import request from 'supertest'; + +import server from '../../app'; +import testUtil from '../../tests/util'; +import models from '../../models'; + +const should = chai.should(); + +const expectAfterDelete = (id, projectId, len, deletedLen, err, next) => { + if (err) throw err; + setTimeout(() => + models.ProjectSetting.findOne({ + includeAllProjectSettingsForInternalUsage: true, + where: { + id, + projectId, + }, + paranoid: false, + }) + .then((res) => { + if (!res) { + throw new Error('Should found the entity'); + } else { + should.exist(res.deletedBy); + should.exist(res.deletedAt); + + models.ProjectEstimationItem.findAll({ + where: { + markupUsedReference: 'projectSetting', + deletedAt: { $ne: null }, + }, + paranoid: false, + }).then((items) => { + // deleted project estimation items + items.should.have.lengthOf(deletedLen); + _.each(items, (item) => { + should.exist(item.deletedBy); + should.exist(item.deletedAt); + }); + + return models.ProjectEstimationItem.findAll({ + where: { + markupUsedReference: 'projectSetting', + }, + paranoid: true, + }); + }).then((items) => { + // all non-deleted project estimation item count + items.should.have.lengthOf(len); + next(); + }); + } + }), 500); +}; + +describe('DELETE Project Setting', () => { + let projectId; + let estimationId; + let id; + let id2; + + const estimation = { + buildingBlockKey: 'BLOCK_KEY', + conditions: '( HAS_DEV_DELIVERABLE && SCREENS_COUNT_SMALL && CA_NEEDED)', + price: 6500.50, + quantity: 10, + minTime: 35, + maxTime: 35, + metadata: { + deliverable: 'dev-qa', + }, + createdBy: 1, + updatedBy: 1, + }; + + beforeEach((done) => { + testUtil.clearDb() + .then(() => { + // Create projects + models.Project.create({ + type: 'generic', + billingAccountId: 1, + name: 'test1', + description: 'test project1', + status: 'draft', + details: {}, + createdBy: 1, + updatedBy: 1, + lastActivityAt: 1, + lastActivityUserId: '1', + }) + .then((project) => { + projectId = project.id; + + models.ProjectSetting.bulkCreate([{ + projectId, + key: 'markup_topcoder_service', + value: '5599.96', + valueType: 'double', + readPermission: { + projectRoles: ['customer'], + topcoderRoles: ['administrator'], + }, + writePermission: { + allowRule: { + projectRoles: ['customer', 'copilot'], + topcoderRoles: ['administrator'], + }, + denyRule: { + projectRoles: ['copilot'], + }, + }, + createdBy: 1, + updatedBy: 1, + }, { + projectId, + key: 'markup_no_estimation', + value: '40', + valueType: 'percentage', + readPermission: { + topcoderRoles: ['administrator'], + }, + writePermission: { + allowRule: { topcoderRoles: ['administrator'] }, + denyRule: { projectRoles: ['copilot'] }, + }, + createdBy: 1, + updatedBy: 1, + }], { returning: true }) + .then((settings) => { + id = settings[0].id; + id2 = settings[1].id; + models.ProjectEstimation.create(_.assign(estimation, { projectId })) + .then((e) => { + estimationId = e.id; + done(); + + /* models.ProjectEstimationItem.create({ + projectEstimationId: estimationId, + price: 5599.96, + type: 'topcoder_service', + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + createdBy: 1, + updatedBy: 1, + }) + .then(() => done()); */ + }); + }); + }); + }); + }); + + after(testUtil.clearDb); + + describe('DELETE /projects/{projectId}/settings/{id}', () => { + it('should return 403 if user is not authenticated', (done) => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id}`) + .expect(403, done); + }); + + it('should return 403 for member', (done) => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.member}`, + }) + .expect(403, done); + }); + + it('should return 403 for copilot', (done) => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.copilot}`, + }) + .expect(403, done); + }); + + it('should return 404 for non-existed project', (done) => { + request(server) + .delete(`/v4/projects/9999/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(404, done); + }); + + it('should return 404 for non-existed project setting', (done) => { + request(server) + .delete(`/v4/projects/${projectId}/settings/1234`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(404, done); + }); + + it('should return 404 for deleted project setting', (done) => { + models.ProjectSetting.destroy({ where: { id } }) + .then(() => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(404, done); + }); + }); + + it('should return 204, for admin, if project setting was successfully removed', (done) => { + models.ProjectEstimationItem.create({ + projectEstimationId: estimationId, + price: 1200, + type: 'topcoder_service', + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + createdBy: 1, + updatedBy: 1, + }) + .then(() => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(204) + .end(err => expectAfterDelete(id, projectId, 0, 1, err, done)); + }); + }); + + it('should return 204, for admin, if project setting with non-estimation type was successfully removed', + (done) => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id2}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(204) + .end(err => expectAfterDelete(id2, projectId, 0, 0, err, done)); + }); + + it('should return 204, for admin, another project setting exists if the project setting was successfully removed', + (done) => { + models.ProjectSetting.create({ + projectId, + key: 'markup_fee', + value: '25', + valueType: 'percentage', + readPermission: { + projectRoles: ['customer'], + topcoderRoles: ['administrator'], + }, + writePermission: { + allowRule: { + projectRoles: ['customer', 'copilot'], + topcoderRoles: ['administrator'], + }, + denyRule: { + projectRoles: ['copilot'], + }, + }, + createdBy: 1, + updatedBy: 1, + }).then((anotherSetting) => { + models.ProjectEstimationItem.create({ + projectEstimationId: estimationId, + price: 1200, + type: 'fee', + markupUsedReference: 'projectSetting', + markupUsedReferenceId: anotherSetting.id, + createdBy: 1, + updatedBy: 1, + }).then(() => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(204) + .end(err => expectAfterDelete(id, projectId, 1, 1, err, done)); + }); + }); + }); + }); +}); diff --git a/src/routes/projectSettings/list.js b/src/routes/projectSettings/list.js new file mode 100644 index 00000000..d9a073fe --- /dev/null +++ b/src/routes/projectSettings/list.js @@ -0,0 +1,58 @@ +/** + * API to list project setting + */ +import _ from 'lodash'; +import validate from 'express-validation'; +import Joi from 'joi'; +import { middleware as tcMiddleware } from 'tc-core-library-js'; +import models from '../../models'; +import util from '../../util'; + +const permissions = tcMiddleware.permissions; + +const schema = { + query: { + includeAllProjectSettingsForInternalUsage: Joi.boolean().optional(), + }, +}; + +module.exports = [ + validate(schema), + permissions('projectSetting.view'), + (req, res, next) => { + const projectId = req.params.projectId; + const options = { + where: { + projectId, + }, + attributes: { exclude: ['deletedAt', 'deletedBy'] }, + raw: true, + }; + // when user query with includeAllProjectSettingsForInternalUsage, + // return result with all ProjectSettings records to make calculations + if (req.query.includeAllProjectSettingsForInternalUsage) { + options.includeAllProjectSettingsForInternalUsage = req.query.includeAllProjectSettingsForInternalUsage; + } else { + options.reqUser = req.authUser; + } + + models.Project.count({ + where: { + id: projectId, + }, + }) + .then((countProject) => { + if (countProject === 0) { + const apiErr = new Error(`active project not found for project id ${projectId}`); + apiErr.status = 404; + throw apiErr; + } + + return models.ProjectSetting.findAll(options); + }) + .then((result) => { + res.json(util.wrapResponse(req.id, _.filter(result, r => r))); + }) + .catch(next); + }, +]; diff --git a/src/routes/projectSettings/list.spec.js b/src/routes/projectSettings/list.spec.js new file mode 100644 index 00000000..0ea1a14f --- /dev/null +++ b/src/routes/projectSettings/list.spec.js @@ -0,0 +1,243 @@ +/** + * Tests for list.js + */ +import _ from 'lodash'; +import request from 'supertest'; +import chai from 'chai'; +import server from '../../app'; +import models from '../../models'; +import testUtil from '../../tests/util'; + +const should = chai.should(); + +describe('LIST Project Settings', () => { + let projectId; + + const memberUser = { + handle: testUtil.getDecodedToken(testUtil.jwts.member).handle, + userId: testUtil.getDecodedToken(testUtil.jwts.member).userId, + firstName: 'fname', + lastName: 'lName', + email: 'some@abc.com', + }; + const copilotUser = { + handle: testUtil.getDecodedToken(testUtil.jwts.copilot).handle, + userId: testUtil.getDecodedToken(testUtil.jwts.copilot).userId, + firstName: 'fname', + lastName: 'lName', + email: 'some@abc.com', + }; + + const settings = [{ + key: 'markup_topcoder_service', + value: '3500', + valueType: 'double', + readPermission: { + allowRule: { + projectRoles: ['customer', 'copilot'], + topcoderRoles: ['administrator'], + }, + denyRule: { + projectRoles: ['copilot'], + topcoderRoles: ['Connect Admin'], + }, + }, + writePermission: { + allowRule: { topcoderRoles: ['administrator'] }, + denyRule: { projectRoles: ['copilot'] }, + }, + createdBy: 1, + updatedBy: 1, + }, { + key: 'markup_fee', + value: '15', + valueType: 'percentage', + readPermission: { + topcoderRoles: ['administrator'], + }, + writePermission: { + allowRule: { topcoderRoles: ['administrator'] }, + denyRule: { projectRoles: ['copilot'] }, + }, + createdBy: 1, + updatedBy: 1, + }]; + + beforeEach((done) => { + testUtil.clearDb() + .then(() => { + // Create projects + models.Project.create({ + type: 'generic', + billingAccountId: 1, + name: 'test1', + description: 'test project1', + status: 'draft', + details: {}, + createdBy: 1, + updatedBy: 1, + lastActivityAt: 1, + lastActivityUserId: '1', + }) + .then((project) => { + projectId = project.id; + // create members + models.ProjectMember.bulkCreate([{ + id: 1, + userId: copilotUser.userId, + projectId, + role: 'copilot', + isPrimary: false, + createdBy: 1, + updatedBy: 1, + }, { + id: 2, + userId: memberUser.userId, + projectId, + role: 'customer', + isPrimary: true, + createdBy: 1, + updatedBy: 1, + }]) + .then(() => { + models.ProjectSetting.bulkCreate(_.map(settings, s => _.assign(s, { projectId }))).then(() => done()); + }); + }); + }); + }); + + after((done) => { + testUtil.clearDb(done); + }); + + describe('GET /projects/{projectId}/settings', () => { + it('should return 403 if user is not authenticated', (done) => { + request(server) + .get(`/v4/projects/${projectId}/settings`) + .expect(403, done); + }); + + it('should return 403 when user have no permission (non team member)', (done) => { + request(server) + .get(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.member2}`, + }) + .expect(403, done); + }); + + it('should return 404 for deleted project', (done) => { + models.Project.destroy({ where: { id: projectId } }) + .then(() => { + request(server) + .get(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(404, done); + }); + }); + + it('should return 404 for non-existed project', (done) => { + request(server) + .get('/v4/projects/99999/settings') + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(404, done); + }); + + it('should return 0 setting when copilot has readPermission for both denyRule and allowRule', (done) => { + request(server) + .get(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.copilot}`, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + resJson.should.have.lengthOf(0); + done(); + } + }); + }); + + it('should return 0 setting when connect admin has readPermission for denyRule', (done) => { + request(server) + .get(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.connectAdmin}`, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + resJson.should.have.lengthOf(0); + done(); + } + }); + }); + + it('should return 1 setting when user have readPermission (customer)', (done) => { + request(server) + .get(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.member}`, + }) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + resJson.should.have.lengthOf(1); + const setting = settings[0]; + resJson[0].key.should.be.eql(setting.key); + resJson[0].value.should.be.eql(setting.value); + resJson[0].valueType.should.be.eql(setting.valueType); + resJson[0].projectId.should.be.eql(projectId); + resJson[0].readPermission.should.be.eql(setting.readPermission); + resJson[0].writePermission.should.be.eql(setting.writePermission); + done(); + } + }); + }); + + it('should return 2 settings when user have readPermission (administrator)', (done) => { + request(server) + .get(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + if (err) { + done(err); + } else { + const resJson = res.body.result.content; + should.exist(resJson); + resJson.should.have.lengthOf(2); + const setting = settings[0]; + resJson[0].key.should.be.eql(setting.key); + resJson[0].value.should.be.eql(setting.value); + resJson[0].valueType.should.be.eql(setting.valueType); + resJson[0].projectId.should.be.eql(projectId); + resJson[0].readPermission.should.be.eql(setting.readPermission); + resJson[0].writePermission.should.be.eql(setting.writePermission); + done(); + } + }); + }); + }); +}); diff --git a/src/routes/projectSettings/update.js b/src/routes/projectSettings/update.js new file mode 100644 index 00000000..ed62f153 --- /dev/null +++ b/src/routes/projectSettings/update.js @@ -0,0 +1,128 @@ +/** + * API to update a project setting + */ +import validate from 'express-validation'; +import _ from 'lodash'; +import Joi from 'joi'; +import { middleware as tcMiddleware } from 'tc-core-library-js'; +import util from '../../util'; +import models from '../../models'; +import { VALUE_TYPE, ESTIMATION_TYPE } from '../../constants'; + +const permissions = tcMiddleware.permissions; + +const schema = { + params: { + projectId: Joi.number().integer().positive().required(), + id: Joi.number().integer().positive().required(), + }, + body: { + param: Joi.object().keys({ + key: Joi.string().max(255), + value: Joi.string().max(255), + valueType: Joi.string().valid(_.values(VALUE_TYPE)), + projectId: Joi.any().strip(), + metadata: Joi.object(), + readPermission: Joi.object(), + writePermission: Joi.object(), + createdAt: Joi.any().strip(), + updatedAt: Joi.any().strip(), + deletedAt: Joi.any().strip(), + createdBy: Joi.any().strip(), + updatedBy: Joi.any().strip(), + deletedBy: Joi.any().strip(), + }).required(), + }, +}; + +module.exports = [ + validate(schema), + permissions('projectSetting.edit'), + (req, res, next) => { + let updatedSetting = null; + let existingSetting = null; + let oldKey = null; + const projectId = req.params.projectId; + const id = req.params.id; + const entityToUpdate = _.assign(req.body.param, { + updatedBy: req.authUser.userId, + }); + + return models.ProjectSetting.findOne({ + reqUser: req.authUser, + where: { + id, + projectId, + }, + }) + .then((existing) => { + // Not found + if (!existing) { + const apiErr = new Error(`Project setting not found for id ${id} and project id ${projectId}`); + apiErr.status = 404; + return Promise.reject(apiErr); + } + + existingSetting = existing; + if (entityToUpdate.key) { + return models.ProjectSetting.findOne({ + includeAllProjectSettingsForInternalUsage: true, + where: { + projectId, + key: entityToUpdate.key, + id: { $ne: id }, + }, + }) + .then((entity) => { + // found + if (entity) { + const apiErr = new Error(`Another Project setting already exists for key ${entityToUpdate.key}` + + `and project id ${projectId}`); + apiErr.status = 422; + return Promise.reject(apiErr); + } + + return Promise.resolve(); + }); + } + + return Promise.resolve(); + }) + .then(() => { + oldKey = existingSetting.key; + return existingSetting.update(entityToUpdate); + }) + .then((updated) => { + updatedSetting = updated; + // Updated from valid to invalid estimation type + if (!_.includes(_.values(ESTIMATION_TYPE), updatedSetting.key.split('markup_')[1]) + && _.includes(_.values(ESTIMATION_TYPE), oldKey.split('markup_')[1])) { + req.log.debug('Delete all existing project estimation records'); + return models.ProjectEstimationItem.update({ deletedBy: req.authUser.userId }, { + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + }).then(() => models.ProjectEstimationItem.destroy({ + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + })); + } + + return Promise.resolve(); + }) + .then(() => { + if (_.includes(_.values(ESTIMATION_TYPE), updatedSetting.key.split('markup_')[1])) { + req.log.debug(`Recalculate price breakdown for project id ${projectId}`); + return util.calculateProjectEstimationItems(req, projectId); + } + return Promise.resolve(); + }) + .then(() => { + res.json(util.wrapResponse(req.id, updatedSetting)); + }) + .catch(next); + }, +]; diff --git a/src/routes/projectSettings/update.spec.js b/src/routes/projectSettings/update.spec.js new file mode 100644 index 00000000..63199d74 --- /dev/null +++ b/src/routes/projectSettings/update.spec.js @@ -0,0 +1,566 @@ +/** + * Tests for update.js + */ +import _ from 'lodash'; +import chai from 'chai'; +import request from 'supertest'; + +import server from '../../app'; +import testUtil from '../../tests/util'; +import models from '../../models'; +import { VALUE_TYPE } from '../../constants'; + +const should = chai.should(); + +const expectAfterUpdate = (id, projectId, estimation, len, deletedLen, err, next) => { + if (err) throw err; + setTimeout(() => + models.ProjectSetting.findOne({ + includeAllProjectSettingsForInternalUsage: true, + where: { + id, + projectId, + }, + }) + .then((res) => { + if (!res) { + throw new Error('Should found the entity'); + } else { + models.ProjectEstimationItem.findAll({ + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + deletedAt: { $ne: null }, + }, + paranoid: false, + }).then((items) => { + // deleted project estimation items + items.should.have.lengthOf(deletedLen); + + _.each(items, (item) => { + should.exist(item.deletedBy); + should.exist(item.deletedAt); + }); + + return models.ProjectEstimationItem.findAll({ + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + paranoid: true, + }); + }).then((entities) => { + entities.should.have.lengthOf(len); + if (len) { + entities[0].projectEstimationId.should.be.eql(estimation.id); + if (estimation.valueType === VALUE_TYPE.PERCENTAGE) { + entities[0].price.should.be.eql((estimation.price * estimation.value) / 100); + } else { + entities[0].price.should.be.eql(Number(estimation.value)); + } + entities[0].type.should.be.eql(estimation.key.split('markup_')[1]); + entities[0].markupUsedReference.should.be.eql('projectSetting'); + entities[0].markupUsedReferenceId.should.be.eql(id); + should.exist(entities[0].updatedAt); + should.not.exist(entities[0].deletedBy); + should.not.exist(entities[0].deletedAt); + } + + next(); + }); + } + }), 500); +}; + +describe('UPDATE Project Setting', () => { + let projectId; + let estimationId; + let id; + + const memberUser = { + handle: testUtil.getDecodedToken(testUtil.jwts.member).handle, + userId: testUtil.getDecodedToken(testUtil.jwts.member).userId, + firstName: 'fname', + lastName: 'lName', + email: 'some@abc.com', + }; + const copilotUser = { + handle: testUtil.getDecodedToken(testUtil.jwts.copilot).handle, + userId: testUtil.getDecodedToken(testUtil.jwts.copilot).userId, + firstName: 'fname', + lastName: 'lName', + email: 'some@abc.com', + }; + + const body = { + param: { + key: 'markup_topcoder_service', + value: '5599.96', + valueType: 'double', + readPermission: { + projectRoles: ['customer'], + topcoderRoles: ['administrator'], + }, + writePermission: { + allowRule: { + projectRoles: ['customer', 'copilot'], + topcoderRoles: ['administrator', 'Connect Admin'], + }, + denyRule: { + projectRoles: ['copilot'], + topcoderRoles: ['Connect Admin'], + }, + }, + createdBy: 1, + updatedBy: 1, + }, + }; + + const estimation = { + buildingBlockKey: 'BLOCK_KEY', + conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || CA_NEEDED)', + price: 6500.50, + quantity: 10, + minTime: 35, + maxTime: 35, + metadata: { + deliverable: 'dev-qa', + }, + createdBy: 1, + updatedBy: 1, + }; + + beforeEach((done) => { + testUtil.clearDb() + .then(() => { + // Create projects + models.Project.create({ + type: 'generic', + billingAccountId: 1, + name: 'test1', + description: 'test project1', + status: 'draft', + details: {}, + createdBy: 1, + updatedBy: 1, + lastActivityAt: 1, + lastActivityUserId: '1', + }) + .then((project) => { + projectId = project.id; + + models.ProjectMember.bulkCreate([{ + id: 1, + userId: copilotUser.userId, + projectId, + role: 'copilot', + isPrimary: false, + createdBy: 1, + updatedBy: 1, + }, { + id: 2, + userId: memberUser.userId, + projectId, + role: 'customer', + isPrimary: true, + createdBy: 1, + updatedBy: 1, + }]) + .then(() => { + models.ProjectSetting.create(_.assign(body.param, { projectId })) + .then((s) => { + id = s.id; + + models.ProjectEstimation.create(_.assign(estimation, { projectId })) + .then((e) => { + estimationId = e.id; + done(); + /* models.ProjectEstimationItem.create({ + projectEstimationId: estimationId, + price: body.param.value, + type: body.param.key.split('markup_')[1], + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + createdBy: 1, + updatedBy: 1, + }) + .then(() => done()); */ + }); + }); + }); + }); + }); + }); + + after(testUtil.clearDb); + + describe('PATCH /projects/{projectId}/settings/{id}', () => { + it('should return 403 if user is not authenticated', (done) => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .send(body) + .expect(403, done); + }); + + it('should return 403 when user have no permission (non team member)', (done) => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.member2}`, + }) + .send(body) + .expect(403, done); + }); + + it('should return 403 when copilot is in both denyRule and allowRule', (done) => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.copilot}`, + }) + .send(body) + .expect(403, done); + }); + + it('should return 403 when connect admin is in both denyRule and allowRule', (done) => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.connectAdmin}`, + }) + .send(body) + .expect(403, done); + }); + + it('should return 404 for non-existed project', (done) => { + request(server) + .patch(`/v4/projects/9999/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(body) + .expect(404, done); + }); + + it('should return 404 for non-existed project setting', (done) => { + request(server) + .patch(`/v4/projects/${projectId}/settings/1234`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(body) + .expect(404, done); + }); + + it('should return 404 for deleted project setting', (done) => { + models.ProjectSetting.destroy({ where: { id } }) + .then(() => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(body) + .expect(404, done); + }); + }); + + it('should return 422, for member, when update key with existing key', (done) => { + const existing = _.cloneDeep(body); + existing.param.key = 'markup_existing'; + existing.param.projectId = projectId; + + models.ProjectSetting.create(existing.param).then(() => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send({ + param: { + key: existing.param.key, + }, + }) + .expect(422, done); + }); + }); + + it('should return 200, for admin, when update key with non-estimation type', (done) => { + const noEstimationBody = _.cloneDeep(body); + noEstimationBody.param.key = 'markup_no_estimation'; + noEstimationBody.param.value = '3560'; + + models.ProjectEstimationItem.destroy({ + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + }).then(() => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send({ + param: { + key: noEstimationBody.param.key, + value: noEstimationBody.param.value, + }, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.key.should.be.eql(noEstimationBody.param.key); + resJson.value.should.be.eql(noEstimationBody.param.value); + resJson.valueType.should.be.eql(noEstimationBody.param.valueType); + resJson.projectId.should.be.eql(projectId); + should.exist(resJson.createdAt); + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterUpdate(id, projectId, _.assign(estimation, { + id: estimationId, + value: noEstimationBody.param.value, + valueType: noEstimationBody.param.valueType, + key: noEstimationBody.param.key, + }), 0, 0, err, done); + }); + }); + }); + + it('should return 200, for admin, update with non-estimation type with existing project estimation item record', + (done) => { + const noEstimationBody = _.cloneDeep(body); + noEstimationBody.param.key = 'markup_no_estimation'; + noEstimationBody.param.value = '1400'; + + models.ProjectEstimationItem.create({ + projectEstimationId: estimationId, + price: 1200, + type: 'topcoder_service', + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + createdBy: 1, + updatedBy: 1, + }).then(() => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send({ + param: { + key: noEstimationBody.param.key, + value: noEstimationBody.param.value, + }, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.key.should.be.eql(noEstimationBody.param.key); + resJson.value.should.be.eql(noEstimationBody.param.value); + resJson.valueType.should.be.eql(noEstimationBody.param.valueType); + resJson.projectId.should.be.eql(projectId); + should.exist(resJson.createdAt); + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterUpdate(id, projectId, _.assign(estimation, { + id: estimationId, + value: noEstimationBody.param.value, + valueType: noEstimationBody.param.valueType, + key: noEstimationBody.param.key, + }), 0, 1, err, done); + // resolve(resJson); + }); + }); + }); + + it('should return 200, for member with permission (team member), value updated but no project estimation present', + (done) => { + const notPresent = _.cloneDeep(body); + notPresent.param.value = '4500'; + + models.ProjectEstimation.destroy({ + where: { + id: estimationId, + }, + }).then(() => { + models.ProjectEstimationItem.destroy({ + where: { + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + }, + }).then(() => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.member}`, + }) + .send({ + param: { + value: notPresent.param.value, + }, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.id.should.be.eql(id); + resJson.key.should.be.eql(notPresent.param.key); + resJson.value.should.be.eql(notPresent.param.value); + resJson.valueType.should.be.eql(notPresent.param.valueType); + resJson.projectId.should.be.eql(notPresent.param.projectId); + resJson.createdBy.should.be.eql(notPresent.param.createdBy); + resJson.createdBy.should.be.eql(notPresent.param.createdBy); + resJson.updatedBy.should.be.eql(40051331); + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterUpdate(id, projectId, _.assign(estimation, { + id: estimationId, + value: notPresent.param.value, + valueType: notPresent.param.valueType, + key: notPresent.param.key, + }), 0, 0, err, done); + }); + }); + }); + }); + + it('should return 200 for admin when update key with different estimation type', (done) => { + body.param.key = 'markup_fee'; + + models.ProjectEstimationItem.create({ + projectEstimationId: estimationId, + price: 1200, + type: 'topcoder_service', + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + createdBy: 1, + updatedBy: 1, + }).then(() => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.member}`, + }) + .send({ + param: { + key: body.param.key, + }, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.id.should.be.eql(id); + resJson.key.should.be.eql(body.param.key); + resJson.value.should.be.eql(body.param.value); + resJson.valueType.should.be.eql(body.param.valueType); + resJson.projectId.should.be.eql(body.param.projectId); + resJson.createdBy.should.be.eql(body.param.createdBy); + resJson.createdBy.should.be.eql(body.param.createdBy); + resJson.updatedBy.should.be.eql(40051331); // admin + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterUpdate(id, projectId, _.assign(estimation, { + id: estimationId, + value: body.param.value, + valueType: body.param.valueType, + key: body.param.key, + }), 1, 1, err, done); + }); + }); + }); + + it('should return 200 for admin when value updated, calculating project estimation items', (done) => { + body.param.value = '4500'; + + models.ProjectEstimationItem.create({ + projectEstimationId: estimationId, + price: 1200, + type: 'topcoder_service', + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, + createdBy: 1, + updatedBy: 1, + }).then(() => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send({ + param: { + value: body.param.value, + }, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.id.should.be.eql(id); + resJson.key.should.be.eql(body.param.key); + resJson.value.should.be.eql(body.param.value); + resJson.valueType.should.be.eql(body.param.valueType); + resJson.projectId.should.be.eql(body.param.projectId); + resJson.createdBy.should.be.eql(body.param.createdBy); + resJson.createdBy.should.be.eql(body.param.createdBy); + resJson.updatedBy.should.be.eql(40051333); // admin + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterUpdate(id, projectId, _.assign(estimation, { + id: estimationId, + value: body.param.value, + valueType: body.param.valueType, + key: body.param.key, + }), 1, 1, err, done); + }); + }); + }); + + it('should return 200, for admin, update valueType from double to percentage', + (done) => { + body.param.value = '10.76'; + body.param.valueType = VALUE_TYPE.PERCENTAGE; + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send({ + param: { + value: body.param.value, + valueType: VALUE_TYPE.PERCENTAGE, + }, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + const resJson = res.body.result.content; + resJson.id.should.be.eql(id); + resJson.key.should.be.eql(body.param.key); + resJson.value.should.be.eql(body.param.value); + resJson.valueType.should.be.eql(VALUE_TYPE.PERCENTAGE); + resJson.projectId.should.be.eql(body.param.projectId); + resJson.createdBy.should.be.eql(body.param.createdBy); + resJson.createdBy.should.be.eql(body.param.createdBy); + resJson.updatedBy.should.be.eql(40051333); // admin + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterUpdate(id, projectId, _.assign(estimation, { + id: estimationId, + value: body.param.value, + valueType: body.param.valueType, + key: body.param.key, + }), 1, 0, err, done); + }); + }); + }); +}); diff --git a/src/util.js b/src/util.js index b14117f8..02e7d738 100644 --- a/src/util.js +++ b/src/util.js @@ -18,7 +18,7 @@ import elasticsearch from 'elasticsearch'; import Promise from 'bluebird'; // import AWS from 'aws-sdk'; -import { ADMIN_ROLES, TOKEN_SCOPES, EVENT, PROJECT_MEMBER_ROLE } from './constants'; +import { ADMIN_ROLES, TOKEN_SCOPES, EVENT, PROJECT_MEMBER_ROLE, VALUE_TYPE, ESTIMATION_TYPE } from './constants'; const exec = require('child_process').exec; const models = require('./models').default; @@ -80,6 +80,94 @@ _.assignIn(util, { }); return valid; }, + /** + * Calculate project estimation item price + * @param {object} valueType value type can be int, string, double, percentage + * @param {String} value value + * @param {Double} price price + * @return {Double|String} calculated price value + */ + calculateEstimationItemPrice: (valueType, value, price) => { + if (valueType === VALUE_TYPE.PERCENTAGE) { + return (value * price) / 100; + } + return value; + }, + /** + * Calculate project estimation item price + * @param {Object} req the request + * @param {Number} projectId project id + * @return {Array} estimation items + */ + calculateProjectEstimationItems: (req, projectId) => { + let settings = null; + const or = []; + + return models.ProjectSetting.findAll({ + includeAllProjectSettingsForInternalUsage: true, + where: { + $or: _.map(_.values(ESTIMATION_TYPE), type => ({ + key: `markup_${type}`, + projectId, + })), + }, + }) + .then((entities) => { + settings = entities; + _.each(settings, (s) => { + // Check for invalid estimation type + if (!_.includes(_.values(ESTIMATION_TYPE), s.key.split('markup_')[1])) { + req.log.debug('Invalid estimation type'); + return; + } + + or.push({ + markupUsedReferenceId: s.id, + markupUsedReference: 'projectSetting', + }); + }); + return models.ProjectEstimationItem.update({ deletedBy: req.authUser.userId }, { + where: { + $or: or, + }, + }); + }) + .then(() => models.ProjectEstimationItem.findAll({ + where: { + $or: or, + }, + })) + // Delete all Project Estimation Items for the project + .then(items => + _.each((items), item => item.destroy()), + ) + .then(() => models.ProjectEstimation.findAll({ + where: { projectId: req.params.projectId }, + })) + .then((estimations) => { + if (!estimations || estimations.length === 0) { + req.log.debug('No price estimation found, therefore no estimation item is created'); + return Promise.resolve(); + } + const promises = []; + _.each(estimations, (estimation) => { + _.each(settings, (setting) => { + promises.push(models.ProjectEstimationItem.create({ + projectEstimationId: estimation.id, + price: util.calculateEstimationItemPrice(setting.valueType, setting.value, estimation.price), + type: setting.key.split('markup_')[1], + markupUsedReference: 'projectSetting', + markupUsedReferenceId: setting.id, + createdBy: req.authUser.userId, + updatedBy: req.authUser.userId, + })); + }); + }); + + return Promise.all(promises); + }) + .then(projectEstimationItems => projectEstimationItems); + }, /** * Helper funtion to verify if user has specified role * @param {object} req Request object that should contain authUser diff --git a/swagger.yaml b/swagger.yaml index 54d651ec..470ba3cf 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -440,6 +440,8 @@ paths: description: No permission or wrong token schema: $ref: '#/definitions/ErrorModel' + + '/projects/{projectId}/phases': parameters: - $ref: '#/parameters/projectIdParam' @@ -604,6 +606,124 @@ paths: description: If project is not found schema: $ref: '#/definitions/ErrorModel' + + + + '/projects/{projectId}/settings': + parameters: + - $ref: '#/parameters/projectIdParam' + get: + tags: + - setting + operationId: findProjectSettings + security: + - Bearer: [] + description: >- + Retrieve all project settings. Only users with readPermission can get the setting + parameters: + - name: includeAllProjectSettingsForInternalUsage + required: false + description: to return all project settings + in: query + type: string + responses: + '200': + description: A list of project phases + schema: + $ref: '#/definitions/ProjectSettingListResponse' + '403': + description: No permission or wrong token + schema: + $ref: '#/definitions/ErrorModel' + post: + tags: + - setting + operationId: addProjectSetting + security: + - Bearer: [] + description: >- + Create a project setting and create project estimation items based on estimation type. + parameters: + - in: body + name: body + required: true + schema: + type: object + allOf: + - $ref: '#/definitions/ProjectSettingBodyParam' + responses: + '201': + description: Returns the newly created project phase + schema: + $ref: '#/definitions/ProjectPhaseResponse' + '403': + description: No permission or wrong token + schema: + $ref: '#/definitions/ErrorModel' + '422': + description: Invalid input + schema: + $ref: '#/definitions/ErrorModel' + '/projects/{projectId}/settings/{settingId}': + parameters: + - $ref: '#/parameters/projectIdParam' + - $ref: '#/parameters/settingIdParam' + patch: + tags: + - setting + operationId: updateProjectSetting + security: + - Bearer: [] + description: >- + Update a project setting. All user with write permission can edit the setting. + responses: + '200': + description: Successfully updated project setting. + schema: + $ref: '#/definitions/ProjectSettingResponse' + '403': + description: No permission or wrong token + schema: + $ref: '#/definitions/ErrorModel' + '404': + description: Not found + schema: + $ref: '#/definitions/ErrorModel' + '422': + description: Invalid input + schema: + $ref: '#/definitions/ErrorModel' + default: + description: error payload + schema: + $ref: '#/definitions/ErrorModel' + parameters: + - name: body + in: body + required: true + schema: + $ref: '#/definitions/ProjectSettingBodyParam' + delete: + tags: + - setting + description: >- + Remove an existing project setting. All users who are connect managers and admins + access this endpoint. + security: + - Bearer: [] + parameters: + - $ref: '#/parameters/settingIdParam' + responses: + '204': + description: Project setting successfully removed + '403': + description: No permission or wrong token + schema: + $ref: '#/definitions/ErrorModel' + '404': + description: If project is not found + schema: + $ref: '#/definitions/ErrorModel' '/projects/{projectId}/phases/{phaseId}/products/db': parameters: - $ref: '#/parameters/projectIdParam' @@ -2960,6 +3080,14 @@ parameters: type: integer format: int64 minimum: 1 + settingIdParam: + name: settingId + in: path + description: project setting identifier + required: true + type: integer + format: int64 + minimum: 1 productIdParam: name: productId in: path @@ -3580,6 +3708,10 @@ definitions: type: number format: int64 description: project identifier + settingId: + type: number + format: int64 + description: project setting identifier role: type: string description: member role on specified project @@ -4046,6 +4178,37 @@ definitions: type: number format: integer description: the project phase order + ProjectSettingRequest: + title: Project setting request object + type: object + required: + - key + - value + - valueType + - readPermission + - writePermission + - metadata + properties: + key: + type: string + description: the project setting key + value: + type: string + description: the project setting value + valueType: + type: string + format: date + description: the project setting value type + readPermission: + type: string + format: date + description: the project setting read Permission + writePermission: + type: number + description: the project setting write Permission + metadata: + type: number + description: the project setting metadata ProjectPhaseBodyParam: title: Project phase body param type: object @@ -4054,6 +4217,15 @@ definitions: properties: param: $ref: '#/definitions/ProjectPhaseRequest' + ProjectSettingBodyParam: + title: Project setting body param + type: object + required: + - param + properties: + param: + $ref: '#/definitions/ProjectSettingRequest' + ProjectPhase: title: Project phase object allOf: @@ -4088,6 +4260,64 @@ definitions: description: READ-ONLY. User that last updated this object readOnly: true - $ref: '#/definitions/ProjectPhaseRequest' + + ProjectSetting: + title: Project setting object + allOf: + - type: object + required: + - id + - createdAt + - createdBy + - updatedAt + - updatedBy + properties: + id: + type: number + format: int64 + description: the id + createdAt: + type: string + description: Datetime (GMT) when object was created + readOnly: true + createdBy: + type: integer + format: int64 + description: READ-ONLY. User who created this object + readOnly: true + updatedAt: + type: string + description: READ-ONLY. Datetime (GMT) when object was updated + readOnly: true + updatedBy: + type: integer + format: int64 + description: READ-ONLY. User that last updated this object + readOnly: true + - $ref: '#/definitions/ProjectSettingRequest' + + ProjectSettingResponse: + title: Single project setting response object + type: object + properties: + id: + type: string + description: unique id identifying the request + version: + type: string + result: + type: object + properties: + success: + type: boolean + status: + type: string + description: http status code + metadata: + $ref: '#/definitions/ResponseMetadata' + content: + $ref: '#/definitions/ProjectSetting' + ProjectPhaseResponse: title: Single project phase response object type: object @@ -4133,6 +4363,31 @@ definitions: type: array items: $ref: '#/definitions/ProjectPhase' + ProjectSettingListResponse: + title: Project setting list response object + type: object + properties: + id: + type: string + readOnly: true + description: unique id identifying the request + version: + type: string + result: + type: object + properties: + success: + type: boolean + status: + type: string + description: http status code + metadata: + $ref: '#/definitions/ResponseMetadata' + content: + type: array + items: + $ref: '#/definitions/ProjectSetting' + PhaseProductRequest: title: Phase product request object type: object From 1dda1223ca31554ca4857cd03bb722e723b3c229 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Wed, 14 Aug 2019 14:48:55 +0800 Subject: [PATCH 05/16] reset changes in config files --- config/m2m.local.js | 6 +++--- config/mock.local.js | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/config/m2m.local.js b/config/m2m.local.js index e7e52f33..8fb26130 100644 --- a/config/m2m.local.js +++ b/config/m2m.local.js @@ -11,19 +11,19 @@ if (process.env.NODE_ENV === 'test') { logLevel: 'debug', captureLogs: 'false', logentriesToken: '', - rabbitmqURL: 'amqp://0.0.0.0:5672', + rabbitmqURL: 'amqp://dockerhost:5672', fileServiceEndpoint: 'https://api.topcoder-dev.com/v3/files/', directProjectServiceEndpoint: 'https://api.topcoder-dev.com/v3/direct', connectProjectsUrl: 'https://connect.topcoder-dev.com/projects/', memberServiceEndpoint: 'https://api.topcoder-dev.com/v3/members', dbConfig: { - masterUrl: 'postgres://coder:mysecretpassword@0.0.0.0:5432/projectsdb', + masterUrl: 'postgres://coder:mysecretpassword@dockerhost:5432/projectsdb', maxPoolSize: 50, minPoolSize: 4, idleTimeout: 1000, }, elasticsearchConfig: { - host: '0.0.0.0:9200', + host: 'dockerhost:9200', // target elasticsearch 2.3 version apiVersion: '2.3', indexName: 'projects', diff --git a/config/mock.local.js b/config/mock.local.js index dae12807..bec4dd70 100644 --- a/config/mock.local.js +++ b/config/mock.local.js @@ -5,25 +5,25 @@ if (process.env.NODE_ENV === 'test') { config = require('./test.json'); } else { config = { - identityServiceEndpoint: "http://0.0.0.0:3001/", + identityServiceEndpoint: "http://dockerhost:3001/", authSecret: 'secret', authDomain: 'topcoder-dev.com', logLevel: 'debug', captureLogs: 'false', logentriesToken: '', - rabbitmqURL: 'amqp://0.0.0.0:5672', + rabbitmqURL: 'amqp://dockerhost:5672', fileServiceEndpoint: 'https://api.topcoder-dev.com/v3/files/', directProjectServiceEndpoint: 'https://api.topcoder-dev.com/v3/direct', connectProjectsUrl: 'https://connect.topcoder-dev.com/projects/', - memberServiceEndpoint: 'http://0.0.0.0:3001/v3/members', + memberServiceEndpoint: 'http://dockerhost:3001/v3/members', dbConfig: { - masterUrl: 'postgres://coder:mysecretpassword@0.0.0.0:5432/projectsdb', + masterUrl: 'postgres://coder:mysecretpassword@dockerhost:5432/projectsdb', maxPoolSize: 50, minPoolSize: 4, idleTimeout: 1000, }, elasticsearchConfig: { - host: '0.0.0.0:9200', + host: 'dockerhost:9200', // target elasticsearch 2.3 version apiVersion: '2.3', indexName: 'projects', From 2946084d15cdcde1891337d697d8e668555ca322 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Thu, 15 Aug 2019 11:01:10 +0800 Subject: [PATCH 06/16] fixed issues found during review, improved code quality, improved unit tests --- src/models/projectEstimationItem.js | 57 +++ src/routes/projectSettings/create.js | 49 +-- src/routes/projectSettings/create.spec.js | 55 +-- src/routes/projectSettings/delete.js | 71 ++-- src/routes/projectSettings/delete.spec.js | 119 +++--- src/routes/projectSettings/list.js | 8 +- src/routes/projectSettings/update.js | 104 ++---- src/routes/projectSettings/update.spec.js | 428 +++++++--------------- src/util.js | 121 +++--- src/util.spec.js | 39 ++ 10 files changed, 438 insertions(+), 613 deletions(-) create mode 100644 src/util.spec.js diff --git a/src/models/projectEstimationItem.js b/src/models/projectEstimationItem.js index 73c4ce74..1eeabf31 100644 --- a/src/models/projectEstimationItem.js +++ b/src/models/projectEstimationItem.js @@ -34,6 +34,63 @@ module.exports = function defineProjectHistory(sequelize, DataTypes) { updatedAt: 'updatedAt', createdAt: 'createdAt', indexes: [], + classMethods: { + /** + * Find all project estimation items for project + * + * TODO: this method can rewritten without using `models` + * and using JOIN instead for retrieving ProjectEstimationTimes by projectId + * + * @param {Object} models all models + * @param {Number} projectId project id + * @param {Object} [where] additional where request + * @param {Object} [options] options + * + * @returns {Promise} + */ + findAllByProject(models, projectId, options) { + return models.ProjectEstimation.findAll({ + raw: true, + where: { + projectId, + } + }).then((estimations) => { + const optionsCombined = _.assign({}, options); + // update where to always filter by projectEstimationsIds of the project + optionsCombined.where = _.assign({}, optionsCombined.where, { + projectEstimationId: _.map(estimations, 'id'), + }) + + return this.findAll(optionsCombined) + }); + }, + + /** + * Delete all project estimation items for project + * + * TODO: this method can rewritten without using `models` + * and using JOIN instead for retrieving ProjectEstimationTimes by projectId + * + * @param {Object} models all models + * @param {Number} projectId project id + * @param {Object} reqUser user who makes the request + * + * @returns {Promise} + */ + deleteAllForProject(models, projectId, reqUser) { + return this.findAllByProject(models, projectId) + .then((estimationItems) => { + const estimationItemsOptions = { + where: { + id: _.map(estimationItems, 'id'), + } + }; + + return this.update({ deletedBy: reqUser.userId, }, estimationItemsOptions) + .then(() => this.destroy(estimationItemsOptions)); + }); + } + } }, ); diff --git a/src/routes/projectSettings/create.js b/src/routes/projectSettings/create.js index 393c8879..1b24e810 100644 --- a/src/routes/projectSettings/create.js +++ b/src/routes/projectSettings/create.js @@ -7,7 +7,7 @@ import Joi from 'joi'; import { middleware as tcMiddleware } from 'tc-core-library-js'; import util from '../../util'; import models from '../../models'; -import { VALUE_TYPE, ESTIMATION_TYPE } from '../../constants'; +import { VALUE_TYPE } from '../../constants'; const permissions = tcMiddleware.permissions; @@ -24,12 +24,6 @@ const schema = { metadata: Joi.object().optional(), readPermission: Joi.object().required(), writePermission: Joi.object().required(), - createdAt: Joi.any().strip(), - updatedAt: Joi.any().strip(), - deletedAt: Joi.any().strip(), - createdBy: Joi.any().strip(), - updatedBy: Joi.any().strip(), - deletedBy: Joi.any().strip(), }).required(), }, }; @@ -37,23 +31,15 @@ const schema = { module.exports = [ validate(schema), permissions('projectSetting.create'), - // eslint-disable-next-line consistent-return (req, res, next) => { let setting = null; const projectId = req.params.projectId; const entity = _.assign(req.body.param, { createdBy: req.authUser.userId, updatedBy: req.authUser.userId, + projectId, }); - if (_.includes(ESTIMATION_TYPE, entity.key.split('markup_')[1]) - && entity.valueType === VALUE_TYPE.PERCENTAGE - && (entity.value <= 0 || entity.value > 100)) { - const apiErr = new Error(`Estimation value as a ${entity.valueType} should be between 1 and 100`); - apiErr.status = 422; - return next(apiErr); - } - // Check if project exists models.sequelize.transaction(() => models.Project.findOne({ where: { id: projectId } }) @@ -66,7 +52,7 @@ module.exports = [ // Find project setting return models.ProjectSetting.findOne({ - reqUser: req.authUser, + includeAllProjectSettingsForInternalUsage: true, where: { projectId, key: req.body.param.key, @@ -82,27 +68,20 @@ module.exports = [ return Promise.reject(apiErr); } - if (projectSetting && projectSetting.noAccess) { - const apiErr = new Error('You do not have permissions to perform this action'); - apiErr.status = 403; - return Promise.reject(apiErr); - } - - const body = req.body.param; - body.projectId = projectId; // Create return models.ProjectSetting.create(entity); - }), - ) - .then((createdEntity) => { - setting = createdEntity; - // Calculate for valid estimation type - if (_.includes(_.values(ESTIMATION_TYPE), createdEntity.key.split('markup_')[1])) { - return util.calculateProjectEstimationItems(req, projectId); - } + }) + .then(async (createdEntity) => { + setting = createdEntity; + // Calculate for valid estimation type + if (util.isProjectSettingForEstimation(createdEntity.key)) { + req.log.debug(`Recalculate price breakdown for project id ${projectId}`); + return util.calculateProjectEstimationItems(req, projectId); + } - return Promise.resolve(); - }) + return Promise.resolve(); + }), + ) // transaction end .then(() => { req.log.debug('new project setting created (id# %d, key: %s)', setting.id, setting.key); diff --git a/src/routes/projectSettings/create.spec.js b/src/routes/projectSettings/create.spec.js index 7d0fb497..2a75e691 100644 --- a/src/routes/projectSettings/create.spec.js +++ b/src/routes/projectSettings/create.spec.js @@ -14,7 +14,7 @@ const should = chai.should(); const expectAfterCreate = (id, projectId, estimation, len, deletedLen, err, next) => { if (err) throw err; - setTimeout(() => + models.ProjectSetting.findOne({ includeAllProjectSettingsForInternalUsage: true, where: { @@ -26,31 +26,25 @@ const expectAfterCreate = (id, projectId, estimation, len, deletedLen, err, next if (!res) { throw new Error('Should found the entity'); } else { - models.ProjectEstimationItem.findAll({ + // find deleted ProjectEstimationItems for project + models.ProjectEstimationItem.findAllByProject(models, projectId, { where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, deletedAt: { $ne: null }, }, paranoid: false, }).then((items) => { // deleted project estimation items - items.should.have.lengthOf(deletedLen); + items.should.have.lengthOf(deletedLen, 'Number of deleted ProjectEstimationItems doesn\'t match'); _.each(items, (item) => { should.exist(item.deletedBy); should.exist(item.deletedAt); }); - return models.ProjectEstimationItem.findAll({ - where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - }, - paranoid: true, - }); + // find (non-deleted) ProjectEstimationItems for project + return models.ProjectEstimationItem.findAllByProject(models, projectId); }).then((entities) => { - entities.should.have.lengthOf(len); + entities.should.have.lengthOf(len, 'Number of created ProjectEstimationItems doesn\'t match'); if (len) { entities[0].projectEstimationId.should.be.eql(estimation.id); if (estimation.valueType === VALUE_TYPE.PERCENTAGE) { @@ -67,12 +61,11 @@ const expectAfterCreate = (id, projectId, estimation, len, deletedLen, err, next } next(); - }); + }).catch(next); } - }), 500); + }); }; - describe('CREATE Project Setting', () => { let projectId; let estimationId; @@ -90,8 +83,6 @@ describe('CREATE Project Setting', () => { allowRule: { topcoderRoles: ['administrator'] }, denyRule: { projectRoles: ['copilot'] }, }, - createdBy: 1, - updatedBy: 1, }, }; @@ -219,7 +210,7 @@ describe('CREATE Project Setting', () => { .expect(422, done); }); - it('should return 422 for negative value when valueType = percentage', (done) => { + xit('should return 422 for negative value when valueType = percentage', (done) => { const invalidBody = _.cloneDeep(body); invalidBody.param.value = '-10'; invalidBody.param.valueType = VALUE_TYPE.PERCENTAGE; @@ -234,7 +225,7 @@ describe('CREATE Project Setting', () => { .expect(422, done); }); - it('should return 422 for value greater than 100 when valueType = percentage', (done) => { + xit('should return 422 for value greater than 100 when valueType = percentage', (done) => { const invalidBody = _.cloneDeep(body); invalidBody.param.value = '150'; invalidBody.param.valueType = VALUE_TYPE.PERCENTAGE; @@ -252,16 +243,18 @@ describe('CREATE Project Setting', () => { it('should return 422, for admin, when create key with existing key', (done) => { const existing = _.cloneDeep(body); existing.param.projectId = projectId; + existing.param.createdBy = 1; + existing.param.updatedBy = 1; models.ProjectSetting.create(existing.param).then(() => { request(server) - .post(`/v4/projects/${projectId}/settings`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .send(body) - .expect(422, done); - }); + .post(`/v4/projects/${projectId}/settings`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send(body) + .expect(422, done); + }).catch(done); }); it('should return 201 for manager with non-estimation type, not calculating project estimation items', @@ -278,6 +271,8 @@ describe('CREATE Project Setting', () => { .expect('Content-Type', /json/) .expect(201) .end((err, res) => { + if (err) done(err); + const resJson = res.body.result.content; resJson.key.should.be.eql(createBody.param.key); resJson.value.should.be.eql(createBody.param.value); @@ -303,6 +298,8 @@ describe('CREATE Project Setting', () => { .expect('Content-Type', /json/) .expect(201) .end((err, res) => { + if (err) done(err); + const resJson = res.body.result.content; resJson.key.should.be.eql(body.param.key); resJson.value.should.be.eql(body.param.value); @@ -333,6 +330,8 @@ describe('CREATE Project Setting', () => { .expect('Content-Type', /json/) .expect(201) .end((err, res) => { + if (err) done(err); + const resJson = res.body.result.content; resJson.key.should.be.eql(body.param.key); resJson.value.should.be.eql(body.param.value); @@ -358,6 +357,8 @@ describe('CREATE Project Setting', () => { .expect('Content-Type', /json/) .expect(201) .end((err, res) => { + if (err) done(err); + const resJson = res.body.result.content; resJson.key.should.be.eql(body.param.key); resJson.value.should.be.eql(body.param.value); diff --git a/src/routes/projectSettings/delete.js b/src/routes/projectSettings/delete.js index ee2cb6c7..5540ae97 100644 --- a/src/routes/projectSettings/delete.js +++ b/src/routes/projectSettings/delete.js @@ -2,12 +2,10 @@ * API to delete a project setting */ import validate from 'express-validation'; -import _ from 'lodash'; import Joi from 'joi'; import { middleware as tcMiddleware } from 'tc-core-library-js'; import util from '../../util'; import models from '../../models'; -import { ESTIMATION_TYPE } from '../../constants'; const permissions = tcMiddleware.permissions; @@ -34,50 +32,33 @@ module.exports = [ projectId, }, }) - .then((entity) => { - // Not found - if (!entity) { - const apiErr = new Error(`Project setting not found for id ${id} and project id ${projectId}`); - apiErr.status = 404; - return Promise.reject(apiErr); - } + .then((entity) => { + // Not found + if (!entity) { + const apiErr = new Error(`Project setting not found for id ${id} and project id ${projectId}`); + apiErr.status = 404; + return Promise.reject(apiErr); + } - deletedEntity = entity; - // Update the deletedBy, then delete - return entity.update({ deletedBy: req.authUser.userId }); - }) - .then(entity => entity.destroy()) - .then(() => models.ProjectEstimationItem.update({ deletedBy: req.authUser.userId }, { - where: { - type: deletedEntity.key.split('markup_')[1], - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - }, - })) - .then(() => models.ProjectEstimationItem.findAll({ - where: { - type: deletedEntity.key.split('markup_')[1], - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - }, - })) - // Delete all Project Estimation Items for the project - .then(items => - _.each((items), item => item.destroy()), - ), - ) - .then(() => { - // Calculate for valid estimation type - if (_.includes(_.values(ESTIMATION_TYPE), deletedEntity.key.split('markup_')[1])) { - req.log.debug(`Recalculate price breakdown for project id ${projectId}`); - return util.calculateProjectEstimationItems(req, projectId); - } + deletedEntity = entity; + // Update the deletedBy, then delete + return entity.update({ deletedBy: req.authUser.userId }); + }) + .then(entity => entity.destroy()) + .then(() => { + console.log + // Calculate for valid estimation type + if (util.isProjectSettingForEstimation(deletedEntity.key)) { + req.log.debug(`Recalculate price breakdown for project id ${projectId}`); + return util.calculateProjectEstimationItems(req, projectId); + } - return Promise.resolve(); - }) - .then(() => { - res.status(204).end(); - }) - .catch(next); + return Promise.resolve(); + }), + ) // transaction end + .then(() => { + res.status(204).end(); + }) + .catch(next); }, ]; diff --git a/src/routes/projectSettings/delete.spec.js b/src/routes/projectSettings/delete.spec.js index 5117bb24..f60eb4f8 100644 --- a/src/routes/projectSettings/delete.spec.js +++ b/src/routes/projectSettings/delete.spec.js @@ -13,7 +13,7 @@ const should = chai.should(); const expectAfterDelete = (id, projectId, len, deletedLen, err, next) => { if (err) throw err; - setTimeout(() => + models.ProjectSetting.findOne({ includeAllProjectSettingsForInternalUsage: true, where: { @@ -22,40 +22,36 @@ const expectAfterDelete = (id, projectId, len, deletedLen, err, next) => { }, paranoid: false, }) - .then((res) => { - if (!res) { - throw new Error('Should found the entity'); - } else { - should.exist(res.deletedBy); - should.exist(res.deletedAt); - - models.ProjectEstimationItem.findAll({ - where: { - markupUsedReference: 'projectSetting', - deletedAt: { $ne: null }, - }, - paranoid: false, - }).then((items) => { - // deleted project estimation items - items.should.have.lengthOf(deletedLen); - _.each(items, (item) => { - should.exist(item.deletedBy); - should.exist(item.deletedAt); - }); + .then((res) => { + if (!res) { + throw new Error('Should found the entity'); + } else { + should.exist(res.deletedBy); + should.exist(res.deletedAt); - return models.ProjectEstimationItem.findAll({ - where: { - markupUsedReference: 'projectSetting', - }, - paranoid: true, - }); - }).then((items) => { - // all non-deleted project estimation item count - items.should.have.lengthOf(len); - next(); + // find deleted ProjectEstimationItems for project + models.ProjectEstimationItem.findAllByProject(models, projectId, { + where: { + deletedAt: { $ne: null }, + }, + paranoid: false, + }).then((items) => { + // deleted project estimation items + items.should.have.lengthOf(deletedLen, 'Number of deleted ProjectEstimationItems doesn\'t match'); + _.each(items, (item) => { + should.exist(item.deletedBy); + should.exist(item.deletedAt); }); - } - }), 500); + + // find (non-deleted) ProjectEstimationItems for project + return models.ProjectEstimationItem.findAllByProject(models, projectId); + }).then((items) => { + // all non-deleted project estimation item count + items.should.have.lengthOf(len, 'Number of created ProjectEstimationItems doesn\'t match'); + next(); + }).catch(next); + } + }) }; describe('DELETE Project Setting', () => { @@ -139,17 +135,6 @@ describe('DELETE Project Setting', () => { .then((e) => { estimationId = e.id; done(); - - /* models.ProjectEstimationItem.create({ - projectEstimationId: estimationId, - price: 5599.96, - type: 'topcoder_service', - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - createdBy: 1, - updatedBy: 1, - }) - .then(() => done()); */ }); }); }); @@ -210,7 +195,7 @@ describe('DELETE Project Setting', () => { Authorization: `Bearer ${testUtil.jwts.admin}`, }) .expect(404, done); - }); + }).catch(done); }); it('should return 204, for admin, if project setting was successfully removed', (done) => { @@ -223,26 +208,26 @@ describe('DELETE Project Setting', () => { createdBy: 1, updatedBy: 1, }) - .then(() => { - request(server) - .delete(`/v4/projects/${projectId}/settings/${id}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .expect(204) - .end(err => expectAfterDelete(id, projectId, 0, 1, err, done)); - }); + .then(() => { + request(server) + .delete(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(204) + .end(err => expectAfterDelete(id, projectId, 0, 1, err, done)); + }).catch(done); }); it('should return 204, for admin, if project setting with non-estimation type was successfully removed', (done) => { request(server) - .delete(`/v4/projects/${projectId}/settings/${id2}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .expect(204) - .end(err => expectAfterDelete(id2, projectId, 0, 0, err, done)); + .delete(`/v4/projects/${projectId}/settings/${id2}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(204) + .end(err => expectAfterDelete(id2, projectId, 0, 0, err, done)); }); it('should return 204, for admin, another project setting exists if the project setting was successfully removed', @@ -278,14 +263,14 @@ describe('DELETE Project Setting', () => { updatedBy: 1, }).then(() => { request(server) - .delete(`/v4/projects/${projectId}/settings/${id}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .expect(204) - .end(err => expectAfterDelete(id, projectId, 1, 1, err, done)); + .delete(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .expect(204) + .end(err => expectAfterDelete(id, projectId, 1, 1, err, done)); }); - }); + }).catch(done); }); }); }); diff --git a/src/routes/projectSettings/list.js b/src/routes/projectSettings/list.js index d9a073fe..8a79acdb 100644 --- a/src/routes/projectSettings/list.js +++ b/src/routes/projectSettings/list.js @@ -27,14 +27,8 @@ module.exports = [ }, attributes: { exclude: ['deletedAt', 'deletedBy'] }, raw: true, + reqUser: req.authUser, }; - // when user query with includeAllProjectSettingsForInternalUsage, - // return result with all ProjectSettings records to make calculations - if (req.query.includeAllProjectSettingsForInternalUsage) { - options.includeAllProjectSettingsForInternalUsage = req.query.includeAllProjectSettingsForInternalUsage; - } else { - options.reqUser = req.authUser; - } models.Project.count({ where: { diff --git a/src/routes/projectSettings/update.js b/src/routes/projectSettings/update.js index ed62f153..5c077a6c 100644 --- a/src/routes/projectSettings/update.js +++ b/src/routes/projectSettings/update.js @@ -7,7 +7,7 @@ import Joi from 'joi'; import { middleware as tcMiddleware } from 'tc-core-library-js'; import util from '../../util'; import models from '../../models'; -import { VALUE_TYPE, ESTIMATION_TYPE } from '../../constants'; +import { VALUE_TYPE } from '../../constants'; const permissions = tcMiddleware.permissions; @@ -18,19 +18,12 @@ const schema = { }, body: { param: Joi.object().keys({ - key: Joi.string().max(255), value: Joi.string().max(255), valueType: Joi.string().valid(_.values(VALUE_TYPE)), projectId: Joi.any().strip(), metadata: Joi.object(), readPermission: Joi.object(), writePermission: Joi.object(), - createdAt: Joi.any().strip(), - updatedAt: Joi.any().strip(), - deletedAt: Joi.any().strip(), - createdBy: Joi.any().strip(), - updatedBy: Joi.any().strip(), - deletedBy: Joi.any().strip(), }).required(), }, }; @@ -39,90 +32,45 @@ module.exports = [ validate(schema), permissions('projectSetting.edit'), (req, res, next) => { - let updatedSetting = null; - let existingSetting = null; let oldKey = null; + let updatedSetting = null; const projectId = req.params.projectId; const id = req.params.id; const entityToUpdate = _.assign(req.body.param, { updatedBy: req.authUser.userId, }); - return models.ProjectSetting.findOne({ - reqUser: req.authUser, - where: { - id, - projectId, - }, - }) - .then((existing) => { - // Not found - if (!existing) { - const apiErr = new Error(`Project setting not found for id ${id} and project id ${projectId}`); - apiErr.status = 404; - return Promise.reject(apiErr); - } - - existingSetting = existing; - if (entityToUpdate.key) { - return models.ProjectSetting.findOne({ - includeAllProjectSettingsForInternalUsage: true, - where: { - projectId, - key: entityToUpdate.key, - id: { $ne: id }, - }, - }) - .then((entity) => { - // found - if (entity) { - const apiErr = new Error(`Another Project setting already exists for key ${entityToUpdate.key}` + - `and project id ${projectId}`); - apiErr.status = 422; - return Promise.reject(apiErr); - } - - return Promise.resolve(); - }); - } - - return Promise.resolve(); - }) - .then(() => { - oldKey = existingSetting.key; - return existingSetting.update(entityToUpdate); + models.sequelize.transaction(() => + models.ProjectSetting.findOne({ + reqUser: req.authUser, + where: { + id, + projectId, + }, }) - .then((updated) => { - updatedSetting = updated; - // Updated from valid to invalid estimation type - if (!_.includes(_.values(ESTIMATION_TYPE), updatedSetting.key.split('markup_')[1]) - && _.includes(_.values(ESTIMATION_TYPE), oldKey.split('markup_')[1])) { - req.log.debug('Delete all existing project estimation records'); - return models.ProjectEstimationItem.update({ deletedBy: req.authUser.userId }, { - where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - }, - }).then(() => models.ProjectEstimationItem.destroy({ - where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - }, - })); + .then((existing) => { + // Not found + if (!existing) { + const apiErr = new Error(`Project setting not found for id ${id} and project id ${projectId}`); + apiErr.status = 404; + return Promise.reject(apiErr); } - return Promise.resolve(); + oldKey = existing.key; + return existing.update(entityToUpdate); }) - .then(() => { - if (_.includes(_.values(ESTIMATION_TYPE), updatedSetting.key.split('markup_')[1])) { + .then((updated) => { + updatedSetting = updated; + if (util.isProjectSettingForEstimation(updatedSetting.key) || util.isProjectSettingForEstimation(oldKey)) { req.log.debug(`Recalculate price breakdown for project id ${projectId}`); return util.calculateProjectEstimationItems(req, projectId); } return Promise.resolve(); - }) - .then(() => { - res.json(util.wrapResponse(req.id, updatedSetting)); - }) - .catch(next); + }), + ) // transaction end + .then(() => { + res.json(util.wrapResponse(req.id, updatedSetting)); + }) + .catch(next); }, ]; diff --git a/src/routes/projectSettings/update.spec.js b/src/routes/projectSettings/update.spec.js index 63199d74..b6414840 100644 --- a/src/routes/projectSettings/update.spec.js +++ b/src/routes/projectSettings/update.spec.js @@ -14,7 +14,7 @@ const should = chai.should(); const expectAfterUpdate = (id, projectId, estimation, len, deletedLen, err, next) => { if (err) throw err; - setTimeout(() => + models.ProjectSetting.findOne({ includeAllProjectSettingsForInternalUsage: true, where: { @@ -22,54 +22,48 @@ const expectAfterUpdate = (id, projectId, estimation, len, deletedLen, err, next projectId, }, }) - .then((res) => { - if (!res) { - throw new Error('Should found the entity'); - } else { - models.ProjectEstimationItem.findAll({ - where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - deletedAt: { $ne: null }, - }, - paranoid: false, - }).then((items) => { - // deleted project estimation items - items.should.have.lengthOf(deletedLen); - - _.each(items, (item) => { - should.exist(item.deletedBy); - should.exist(item.deletedAt); - }); + .then((res) => { + if (!res) { + throw new Error('Should found the entity'); + } else { + // find deleted ProjectEstimationItems for project + models.ProjectEstimationItem.findAllByProject(models, projectId, { + where: { + deletedAt: { $ne: null }, + }, + paranoid: false, + }).then((items) => { + // deleted project estimation items + items.should.have.lengthOf(deletedLen, 'Number of deleted ProjectEstimationItems doesn\'t match'); + + _.each(items, (item) => { + should.exist(item.deletedBy); + should.exist(item.deletedAt); + }); - return models.ProjectEstimationItem.findAll({ - where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - }, - paranoid: true, - }); - }).then((entities) => { - entities.should.have.lengthOf(len); - if (len) { - entities[0].projectEstimationId.should.be.eql(estimation.id); - if (estimation.valueType === VALUE_TYPE.PERCENTAGE) { - entities[0].price.should.be.eql((estimation.price * estimation.value) / 100); - } else { - entities[0].price.should.be.eql(Number(estimation.value)); - } - entities[0].type.should.be.eql(estimation.key.split('markup_')[1]); - entities[0].markupUsedReference.should.be.eql('projectSetting'); - entities[0].markupUsedReferenceId.should.be.eql(id); - should.exist(entities[0].updatedAt); - should.not.exist(entities[0].deletedBy); - should.not.exist(entities[0].deletedAt); + // find (non-deleted) ProjectEstimationItems for project + return models.ProjectEstimationItem.findAllByProject(models, projectId); + }).then((entities) => { + entities.should.have.lengthOf(len, 'Number of created ProjectEstimationItems doesn\'t match'); + if (len) { + entities[0].projectEstimationId.should.be.eql(estimation.id); + if (estimation.valueType === VALUE_TYPE.PERCENTAGE) { + entities[0].price.should.be.eql((estimation.price * estimation.value) / 100); + } else { + entities[0].price.should.be.eql(Number(estimation.value)); } - - next(); - }); - } - }), 500); + entities[0].type.should.be.eql(estimation.key.split('markup_')[1]); + entities[0].markupUsedReference.should.be.eql('projectSetting'); + entities[0].markupUsedReferenceId.should.be.eql(id); + should.exist(entities[0].updatedAt); + should.not.exist(entities[0].deletedBy); + should.not.exist(entities[0].deletedAt); + } + + next(); + }); + } + }) }; describe('UPDATE Project Setting', () => { @@ -94,7 +88,6 @@ describe('UPDATE Project Setting', () => { const body = { param: { - key: 'markup_topcoder_service', value: '5599.96', valueType: 'double', readPermission: { @@ -111,11 +104,17 @@ describe('UPDATE Project Setting', () => { topcoderRoles: ['Connect Admin'], }, }, - createdBy: 1, - updatedBy: 1, }, }; + // we don't include these params into the body, we cannot update them + // but we use them for creating model directly and for checking returned values + const bodyParamNonMutable = { + key: 'markup_topcoder_service', + createdBy: 1, + updatedBy: 1, + } + const estimation = { buildingBlockKey: 'BLOCK_KEY', conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || CA_NEEDED)', @@ -167,7 +166,9 @@ describe('UPDATE Project Setting', () => { updatedBy: 1, }]) .then(() => { - models.ProjectSetting.create(_.assign(body.param, { projectId })) + models.ProjectSetting.create(_.assign({}, body.param, bodyParamNonMutable, { + projectId, + })) .then((s) => { id = s.id; @@ -175,18 +176,8 @@ describe('UPDATE Project Setting', () => { .then((e) => { estimationId = e.id; done(); - /* models.ProjectEstimationItem.create({ - projectEstimationId: estimationId, - price: body.param.value, - type: body.param.key.split('markup_')[1], - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - createdBy: 1, - updatedBy: 1, - }) - .then(() => done()); */ }); - }); + }).catch(done); }); }); }); @@ -265,216 +256,70 @@ describe('UPDATE Project Setting', () => { }); }); - it('should return 422, for member, when update key with existing key', (done) => { - const existing = _.cloneDeep(body); - existing.param.key = 'markup_existing'; - existing.param.projectId = projectId; - - models.ProjectSetting.create(existing.param).then(() => { - request(server) - .patch(`/v4/projects/${projectId}/settings/${id}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .send({ - param: { - key: existing.param.key, - }, - }) - .expect(422, done); - }); + it('should return 422, when try to update key', (done) => { + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send({ + param: { + key: 'updated_key', + }, + }) + .expect(422, done); }); - it('should return 200, for admin, when update key with non-estimation type', (done) => { - const noEstimationBody = _.cloneDeep(body); - noEstimationBody.param.key = 'markup_no_estimation'; - noEstimationBody.param.value = '3560'; + it('should return 200, for member with permission (team member), value updated but no project estimation present', (done) => { + const notPresent = _.cloneDeep(body); + notPresent.param.value = '4500'; - models.ProjectEstimationItem.destroy({ + models.ProjectEstimation.destroy({ where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, + id: estimationId, }, }).then(() => { - request(server) - .patch(`/v4/projects/${projectId}/settings/${id}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .send({ - param: { - key: noEstimationBody.param.key, - value: noEstimationBody.param.value, - }, - }) - .expect('Content-Type', /json/) - .expect(200) - .end((err, res) => { - const resJson = res.body.result.content; - resJson.key.should.be.eql(noEstimationBody.param.key); - resJson.value.should.be.eql(noEstimationBody.param.value); - resJson.valueType.should.be.eql(noEstimationBody.param.valueType); - resJson.projectId.should.be.eql(projectId); - should.exist(resJson.createdAt); - should.exist(resJson.updatedAt); - should.not.exist(resJson.deletedBy); - should.not.exist(resJson.deletedAt); - expectAfterUpdate(id, projectId, _.assign(estimation, { - id: estimationId, - value: noEstimationBody.param.value, - valueType: noEstimationBody.param.valueType, - key: noEstimationBody.param.key, - }), 0, 0, err, done); - }); - }); - }); - - it('should return 200, for admin, update with non-estimation type with existing project estimation item record', - (done) => { - const noEstimationBody = _.cloneDeep(body); - noEstimationBody.param.key = 'markup_no_estimation'; - noEstimationBody.param.value = '1400'; - - models.ProjectEstimationItem.create({ - projectEstimationId: estimationId, - price: 1200, - type: 'topcoder_service', - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - createdBy: 1, - updatedBy: 1, - }).then(() => { - request(server) - .patch(`/v4/projects/${projectId}/settings/${id}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .send({ - param: { - key: noEstimationBody.param.key, - value: noEstimationBody.param.value, - }, - }) - .expect('Content-Type', /json/) - .expect(200) - .end((err, res) => { - const resJson = res.body.result.content; - resJson.key.should.be.eql(noEstimationBody.param.key); - resJson.value.should.be.eql(noEstimationBody.param.value); - resJson.valueType.should.be.eql(noEstimationBody.param.valueType); - resJson.projectId.should.be.eql(projectId); - should.exist(resJson.createdAt); - should.exist(resJson.updatedAt); - should.not.exist(resJson.deletedBy); - should.not.exist(resJson.deletedAt); - expectAfterUpdate(id, projectId, _.assign(estimation, { - id: estimationId, - value: noEstimationBody.param.value, - valueType: noEstimationBody.param.valueType, - key: noEstimationBody.param.key, - }), 0, 1, err, done); - // resolve(resJson); - }); - }); - }); - - it('should return 200, for member with permission (team member), value updated but no project estimation present', - (done) => { - const notPresent = _.cloneDeep(body); - notPresent.param.value = '4500'; - - models.ProjectEstimation.destroy({ + models.ProjectEstimationItem.destroy({ where: { - id: estimationId, + markupUsedReference: 'projectSetting', + markupUsedReferenceId: id, }, }).then(() => { - models.ProjectEstimationItem.destroy({ - where: { - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - }, - }).then(() => { - request(server) - .patch(`/v4/projects/${projectId}/settings/${id}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.member}`, - }) - .send({ - param: { - value: notPresent.param.value, - }, - }) - .expect('Content-Type', /json/) - .expect(200) - .end((err, res) => { - const resJson = res.body.result.content; - resJson.id.should.be.eql(id); - resJson.key.should.be.eql(notPresent.param.key); - resJson.value.should.be.eql(notPresent.param.value); - resJson.valueType.should.be.eql(notPresent.param.valueType); - resJson.projectId.should.be.eql(notPresent.param.projectId); - resJson.createdBy.should.be.eql(notPresent.param.createdBy); - resJson.createdBy.should.be.eql(notPresent.param.createdBy); - resJson.updatedBy.should.be.eql(40051331); - should.exist(resJson.updatedAt); - should.not.exist(resJson.deletedBy); - should.not.exist(resJson.deletedAt); - expectAfterUpdate(id, projectId, _.assign(estimation, { - id: estimationId, - value: notPresent.param.value, - valueType: notPresent.param.valueType, - key: notPresent.param.key, - }), 0, 0, err, done); - }); - }); - }); - }); - - it('should return 200 for admin when update key with different estimation type', (done) => { - body.param.key = 'markup_fee'; - - models.ProjectEstimationItem.create({ - projectEstimationId: estimationId, - price: 1200, - type: 'topcoder_service', - markupUsedReference: 'projectSetting', - markupUsedReferenceId: id, - createdBy: 1, - updatedBy: 1, - }).then(() => { - request(server) + request(server) .patch(`/v4/projects/${projectId}/settings/${id}`) .set({ Authorization: `Bearer ${testUtil.jwts.member}`, }) .send({ param: { - key: body.param.key, + value: notPresent.param.value, }, }) .expect('Content-Type', /json/) .expect(200) .end((err, res) => { + if (err) done(err); + const resJson = res.body.result.content; resJson.id.should.be.eql(id); - resJson.key.should.be.eql(body.param.key); - resJson.value.should.be.eql(body.param.value); - resJson.valueType.should.be.eql(body.param.valueType); - resJson.projectId.should.be.eql(body.param.projectId); - resJson.createdBy.should.be.eql(body.param.createdBy); - resJson.createdBy.should.be.eql(body.param.createdBy); - resJson.updatedBy.should.be.eql(40051331); // admin + resJson.key.should.be.eql(bodyParamNonMutable.key); + resJson.value.should.be.eql(notPresent.param.value); + resJson.valueType.should.be.eql(notPresent.param.valueType); + resJson.projectId.should.be.eql(projectId); + resJson.createdBy.should.be.eql(bodyParamNonMutable.createdBy); + resJson.updatedBy.should.be.eql(40051331); should.exist(resJson.updatedAt); should.not.exist(resJson.deletedBy); should.not.exist(resJson.deletedAt); expectAfterUpdate(id, projectId, _.assign(estimation, { id: estimationId, - value: body.param.value, - valueType: body.param.valueType, - key: body.param.key, - }), 1, 1, err, done); + value: notPresent.param.value, + valueType: notPresent.param.valueType, + key: bodyParamNonMutable.key, + }), 0, 0, err, done); }); - }); + }); + }).catch(done); }); it('should return 200 for admin when value updated, calculating project estimation items', (done) => { @@ -490,45 +335,6 @@ describe('UPDATE Project Setting', () => { updatedBy: 1, }).then(() => { request(server) - .patch(`/v4/projects/${projectId}/settings/${id}`) - .set({ - Authorization: `Bearer ${testUtil.jwts.admin}`, - }) - .send({ - param: { - value: body.param.value, - }, - }) - .expect('Content-Type', /json/) - .expect(200) - .end((err, res) => { - const resJson = res.body.result.content; - resJson.id.should.be.eql(id); - resJson.key.should.be.eql(body.param.key); - resJson.value.should.be.eql(body.param.value); - resJson.valueType.should.be.eql(body.param.valueType); - resJson.projectId.should.be.eql(body.param.projectId); - resJson.createdBy.should.be.eql(body.param.createdBy); - resJson.createdBy.should.be.eql(body.param.createdBy); - resJson.updatedBy.should.be.eql(40051333); // admin - should.exist(resJson.updatedAt); - should.not.exist(resJson.deletedBy); - should.not.exist(resJson.deletedAt); - expectAfterUpdate(id, projectId, _.assign(estimation, { - id: estimationId, - value: body.param.value, - valueType: body.param.valueType, - key: body.param.key, - }), 1, 1, err, done); - }); - }); - }); - - it('should return 200, for admin, update valueType from double to percentage', - (done) => { - body.param.value = '10.76'; - body.param.valueType = VALUE_TYPE.PERCENTAGE; - request(server) .patch(`/v4/projects/${projectId}/settings/${id}`) .set({ Authorization: `Bearer ${testUtil.jwts.admin}`, @@ -536,20 +342,20 @@ describe('UPDATE Project Setting', () => { .send({ param: { value: body.param.value, - valueType: VALUE_TYPE.PERCENTAGE, }, }) .expect('Content-Type', /json/) .expect(200) .end((err, res) => { + if (err) done(err); + const resJson = res.body.result.content; resJson.id.should.be.eql(id); - resJson.key.should.be.eql(body.param.key); + resJson.key.should.be.eql(bodyParamNonMutable.key); resJson.value.should.be.eql(body.param.value); - resJson.valueType.should.be.eql(VALUE_TYPE.PERCENTAGE); - resJson.projectId.should.be.eql(body.param.projectId); - resJson.createdBy.should.be.eql(body.param.createdBy); - resJson.createdBy.should.be.eql(body.param.createdBy); + resJson.valueType.should.be.eql(body.param.valueType); + resJson.projectId.should.be.eql(projectId); + resJson.createdBy.should.be.eql(bodyParamNonMutable.createdBy); resJson.updatedBy.should.be.eql(40051333); // admin should.exist(resJson.updatedAt); should.not.exist(resJson.deletedBy); @@ -558,9 +364,49 @@ describe('UPDATE Project Setting', () => { id: estimationId, value: body.param.value, valueType: body.param.valueType, - key: body.param.key, - }), 1, 0, err, done); + key: bodyParamNonMutable.key, + }), 1, 1, err, done); }); + }).catch(done); + }); + + it('should return 200, for admin, update valueType from double to percentage', (done) => { + body.param.value = '10.76'; + body.param.valueType = VALUE_TYPE.PERCENTAGE; + request(server) + .patch(`/v4/projects/${projectId}/settings/${id}`) + .set({ + Authorization: `Bearer ${testUtil.jwts.admin}`, + }) + .send({ + param: { + value: body.param.value, + valueType: VALUE_TYPE.PERCENTAGE, + }, + }) + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + if (err) done(err); + + const resJson = res.body.result.content; + resJson.id.should.be.eql(id); + resJson.key.should.be.eql(bodyParamNonMutable.key); + resJson.value.should.be.eql(body.param.value); + resJson.valueType.should.be.eql(VALUE_TYPE.PERCENTAGE); + resJson.projectId.should.be.eql(projectId); + resJson.createdBy.should.be.eql(bodyParamNonMutable.createdBy); + resJson.updatedBy.should.be.eql(40051333); // admin + should.exist(resJson.updatedAt); + should.not.exist(resJson.deletedBy); + should.not.exist(resJson.deletedAt); + expectAfterUpdate(id, projectId, _.assign(estimation, { + id: estimationId, + value: body.param.value, + valueType: body.param.valueType, + key: bodyParamNonMutable.key, + }), 1, 0, err, done); + }); }); }); }); diff --git a/src/util.js b/src/util.js index 02e7d738..90fbd5f6 100644 --- a/src/util.js +++ b/src/util.js @@ -100,73 +100,54 @@ _.assignIn(util, { * @return {Array} estimation items */ calculateProjectEstimationItems: (req, projectId) => { - let settings = null; - const or = []; - - return models.ProjectSetting.findAll({ - includeAllProjectSettingsForInternalUsage: true, - where: { - $or: _.map(_.values(ESTIMATION_TYPE), type => ({ - key: `markup_${type}`, - projectId, - })), - }, - }) - .then((entities) => { - settings = entities; - _.each(settings, (s) => { - // Check for invalid estimation type - if (!_.includes(_.values(ESTIMATION_TYPE), s.key.split('markup_')[1])) { - req.log.debug('Invalid estimation type'); - return; + // delete ALL existent ProjectEstimationItems for the project + return models.ProjectEstimationItem.deleteAllForProject(models, projectId, req.authUser) + + // retrieve ProjectSettings and ProjectEstimations + .then(() => Promise.all([ + models.ProjectSetting.findAll({ + includeAllProjectSettingsForInternalUsage: true, + where: { + projectId, + key: _.map(_.values(ESTIMATION_TYPE), type => `markup_${type}`), + }, + raw: true, + }), + models.ProjectEstimation.findAll({ + where: { projectId: req.params.projectId }, + raw: true, + }) + ])) + + // create ProjectEstimationItems + .then(([settings, estimations]) => { + if (!settings || settings.length === 0) { + req.log.debug('No project settings for prices found, therefore no estimation items are created'); + return []; } - or.push({ - markupUsedReferenceId: s.id, - markupUsedReference: 'projectSetting', - }); - }); - return models.ProjectEstimationItem.update({ deletedBy: req.authUser.userId }, { - where: { - $or: or, - }, - }); - }) - .then(() => models.ProjectEstimationItem.findAll({ - where: { - $or: or, - }, - })) - // Delete all Project Estimation Items for the project - .then(items => - _.each((items), item => item.destroy()), - ) - .then(() => models.ProjectEstimation.findAll({ - where: { projectId: req.params.projectId }, - })) - .then((estimations) => { - if (!estimations || estimations.length === 0) { - req.log.debug('No price estimation found, therefore no estimation item is created'); - return Promise.resolve(); - } - const promises = []; - _.each(estimations, (estimation) => { - _.each(settings, (setting) => { - promises.push(models.ProjectEstimationItem.create({ - projectEstimationId: estimation.id, - price: util.calculateEstimationItemPrice(setting.valueType, setting.value, estimation.price), - type: setting.key.split('markup_')[1], - markupUsedReference: 'projectSetting', - markupUsedReferenceId: setting.id, - createdBy: req.authUser.userId, - updatedBy: req.authUser.userId, - })); + if (!estimations || estimations.length === 0) { + req.log.debug('No price estimations found, therefore no estimation items are created'); + return []; + } + + const estimationItems = []; + _.each(estimations, (estimation) => { + _.each(settings, (setting) => { + estimationItems.push({ + projectEstimationId: estimation.id, + price: util.calculateEstimationItemPrice(setting.valueType, setting.value, estimation.price), + type: setting.key.replace(/^markup_/, ''), + markupUsedReference: 'projectSetting', + markupUsedReferenceId: setting.id, + createdBy: req.authUser.userId, + updatedBy: req.authUser.userId, + }); + }); }); - }); - return Promise.all(promises); - }) - .then(projectEstimationItems => projectEstimationItems); + return models.ProjectEstimationItem.bulkCreate(estimationItems); + }) }, /** * Helper funtion to verify if user has specified role @@ -834,6 +815,20 @@ _.assignIn(util, { util.hasPermission(permission, user, projectMembers), ) ), + + /** + * Checks if the Project Setting represents price estimation setting + * + * @param {String} key project setting key + * + * @returns {Boolean} true it's project setting for price estimation + */ + isProjectSettingForEstimation: (key) => { + const markupMatch = key.match(/^markup_(.+)$/); + const markupKey = markupMatch && markupMatch[1] ? markupMatch[1] : null; + + return markupKey ? _.includes(_.values(ESTIMATION_TYPE), markupKey) : false; + }, }); export default util; diff --git a/src/util.spec.js b/src/util.spec.js new file mode 100644 index 00000000..99722697 --- /dev/null +++ b/src/util.spec.js @@ -0,0 +1,39 @@ +/** + * Tests for util.js + */ +import chai from 'chai'; +import util from './util'; + +chai.should(); + +describe('Util method', () => { + describe('isProjectSettingForEstimation', () => { + it('should return "true" if key is correct: "markup_fee"', () => { + util.isProjectSettingForEstimation('markup_fee').should.equal(true); + }); + + it('should return "false" if key has unknown estimation type: "markup_unknown"', () => { + util.isProjectSettingForEstimation('markup_unknown').should.equal(false); + }); + + it('should return "false" if key doesn\'t have "markup_" prefix: "fee"', () => { + util.isProjectSettingForEstimation('fee').should.equal(false); + }); + + it('should return "false" if key doesn\'t have duplicated prefix "markup_": "markup_markup_fee"', () => { + util.isProjectSettingForEstimation('markup_markup_fee').should.equal(false); + }); + + it('should return "false" if has prefix "markup_" at the end: "feemarkup_"', () => { + util.isProjectSettingForEstimation('feemarkup_').should.equal(false); + }); + + it('should return "false" if has additional text after: "markup_fee_text"', () => { + util.isProjectSettingForEstimation('markup_fee_text').should.equal(false); + }); + + it('should return "false" if has additional text before: "text_markup_fee"', () => { + util.isProjectSettingForEstimation('text_markup_fee').should.equal(false); + }); + }); +}); From 57aae7af494b7af7cb0edd669fab64aaf9b9e9d9 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Thu, 15 Aug 2019 14:07:34 +0800 Subject: [PATCH 07/16] small fixes to postman --- postman.json | 120 +++------------------------- src/models/projectEstimationItem.js | 1 - 2 files changed, 11 insertions(+), 110 deletions(-) diff --git a/postman.json b/postman.json index 19126608..799ab4cd 100644 --- a/postman.json +++ b/postman.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "f1e394b5-5489-4662-9683-359fa4b8ad3e", + "_postman_id": "dc8ba078-8a20-437a-9495-d75f4a7be2a6", "name": "tc-project-service", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -8611,7 +8611,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_fee\",\r\n \"value\": \"18.88\",\r\n \"valueType\": \"percentage\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \"topcoderRoles\": [\"Connect Copilot\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_fee\",\r\n \"value\": \"18.88\",\r\n \"valueType\": \"percentage\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \"topcoderRoles\": [\"Connect Copilot\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings", @@ -8656,7 +8656,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"2222\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"2222\",\r\n \"valueType\": \"double\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/2/settings", @@ -8701,7 +8701,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_reference_program\",\r\n \"value\": \"17800\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\", \"copilot\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_reference_program\",\r\n \"value\": \"17800\",\r\n \"valueType\": \"double\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\", \"copilot\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings", @@ -8734,7 +8734,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_non_estimation\",\r\n \"value\": \"8765\",\r\n \"valueType\": \"string\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t \"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_non_estimation\",\r\n \"value\": \"8765\",\r\n \"valueType\": \"string\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t \"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings", @@ -8779,7 +8779,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"double\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings", @@ -8812,7 +8812,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"int1\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"int1\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings", @@ -8845,7 +8845,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_community\",\r\n \"value\": \"200\",\r\n \"valueType\": \"percentage\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_community\",\r\n \"value\": \"200\",\r\n \"valueType\": \"percentage\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings", @@ -8956,7 +8956,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"double\",\r\n \"projectId\": 1,\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_topcoder_service\",\r\n \"value\": \"1000\",\r\n \"valueType\": \"double\",\r\n\t\"writePermission\": {\r\n\t \t\"allowRule\": {\r\n\t \t\"projectRoles\": [\"account_manager\"],\r\n\t \t\"topcoderRoles\": [\"administrator\", \"Connect Admin\"]\r\n\t },\r\n\t \t\"denyRule\": {\r\n\t \t\"topcoderRoles\": [\"Connect Copilot Manager\"]\r\n\t }\r\n\t },\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"administrator\", \"Connect Admin\", \"Connect Account Manager\"]\r\n\t },\r\n\t\"metadata\": {}\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings", @@ -9002,41 +9002,6 @@ }, "response": [] }, - { - "name": "List project setting(filter)", - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "url": { - "raw": "{{api-url}}/v4/projects/1/settings?includeAllProjectSettingsForInternalUsage=true", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "settings" - ], - "query": [ - { - "key": "includeAllProjectSettingsForInternalUsage", - "value": "true" - } - ] - } - }, - "response": [] - }, { "name": "List project setting - 403", "request": { @@ -9096,7 +9061,7 @@ "response": [] }, { - "name": "Update project setting - change to different estimation type", + "name": "Update project setting - (failed) change key", "request": { "method": "PATCH", "header": [ @@ -9163,40 +9128,6 @@ }, "response": [] }, - { - "name": "Update project setting - change to non-estimation type", - "request": { - "method": "PATCH", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token-admin-40051333}}" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_non_estimated\"\r\n }\r\n}" - }, - "url": { - "raw": "{{api-url}}/v4/projects/1/settings/{{settingId}}", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "settings", - "{{settingId}}" - ] - } - }, - "response": [] - }, { "name": "Update project setting - non-existent project", "request": { @@ -9281,7 +9212,7 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"param\":{\r\n \"key\": \"markup_community\",\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"Connect Manager\"]\r\n\t }\r\n }\r\n}" + "raw": "{\r\n \"param\":{\r\n\t\"readPermission\": {\r\n\t \t\"projectRoles\": [\"manager\"],\r\n\t \"topcoderRoles\": [\"Connect Manager\"]\r\n\t }\r\n }\r\n}" }, "url": { "raw": "{{api-url}}/v4/projects/1/settings/{{settingId}}", @@ -9299,35 +9230,6 @@ }, "response": [] }, - { - "name": "List project setting - manager - after update", - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token-manager-40051334}}" - } - ], - "url": { - "raw": "{{api-url}}/v4/projects/1/settings", - "host": [ - "{{api-url}}" - ], - "path": [ - "v4", - "projects", - "1", - "settings" - ] - } - }, - "response": [] - }, { "name": "Delete project setting", "request": { diff --git a/src/models/projectEstimationItem.js b/src/models/projectEstimationItem.js index 65caf2c2..e725a58c 100644 --- a/src/models/projectEstimationItem.js +++ b/src/models/projectEstimationItem.js @@ -43,7 +43,6 @@ module.exports = function defineProjectHistory(sequelize, DataTypes) { * * @param {Object} models all models * @param {Number} projectId project id - * @param {Object} [where] additional where request * @param {Object} [options] options * * @returns {Promise} From f30367e439cd835a9b69f7c7ea652444c3979c5f Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Thu, 15 Aug 2019 14:18:01 +0800 Subject: [PATCH 08/16] fix swagger --- swagger.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/swagger.yaml b/swagger.yaml index e31e626d..38b48bf4 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -2948,7 +2948,7 @@ paths: tags: - Project Estimation Item security: - - Bearer [] + - Bearer: [] description: get project estimation items parameters: - $ref: '#/parameters/projectIdParam' @@ -2956,7 +2956,8 @@ paths: responses: '200': description: List of project estimation items - $ref: '#/definitions/ProjectEstimationItemListResponse' + schema: + $ref: '#/definitions/ProjectEstimationItemListResponse' '403': description: No permission or wrong token schema: From f1dc7766bc79e1ac63335b2d0a04fc323ac506b3 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Thu, 15 Aug 2019 14:23:47 +0800 Subject: [PATCH 09/16] re-save postman file in versions 2.1 for easier merging --- postman.json | 3422 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 2556 insertions(+), 866 deletions(-) diff --git a/postman.json b/postman.json index 23bb21c4..3a21b136 100644 --- a/postman.json +++ b/postman.json @@ -1,24 +1,19 @@ { - "variables": [], "info": { + "_postman_id": "4d34a1f1-066f-4072-8bd2-a8471e5af03b", "name": "tc-project-service", - "_postman_id": "4cbbb8e2-9b2c-bbc1-69ca-ab37ec7d6329", - "description": "", - "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { "name": "Project Attachments", - "description": "", "item": [ { "name": "bookmarks", - "description": "", "item": [ { "name": " Create project without bookmarks", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -34,14 +29,22 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] }, { "name": " Create project with valid bookmarks", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -57,14 +60,22 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"bookmarks\":[{\n \"title\":\"title1\",\n \"address\":\"address1\"\n },{\n \"title\":\"title2\",\n \"address\":\"address2\"\n }],\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] }, { "name": " Create project with invalid bookmarks", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -80,14 +91,22 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"bookmarks\":[{\n \"title\":\"title1\",\n \"invalid\":3,\n \"address\":\"address1\"\n },{\n \"title\":\"title2\",\n \"address\":\"address2\"\n }],\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] }, { "name": "get project", "request": { - "url": "{{api-url}}/v4/projects/2", "method": "GET", "header": [ { @@ -99,18 +118,23 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2" + ] + } }, "response": [] }, { "name": "Update project with bookmarks", "request": { - "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -126,14 +150,23 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name\",\n \"bookmarks\":[{\n \"title\":\"title1\",\n \"address\":\"address1\"\n },{\n \"title\":\"title2\",\n \"address\":\"address2\"\n }]\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2" + ] + } }, "response": [] }, { "name": "Delete project all bookmarks null", "request": { - "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -149,14 +182,23 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name2\",\n \"bookmarks\":null\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2" + ] + } }, "response": [] }, { "name": "Update project with invalid bookmarks", "request": { - "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -172,14 +214,23 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name2\",\n \"bookmarks\":3\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2" + ] + } }, "response": [] }, { "name": "get projects with admin token", "request": { - "url": "{{api-url}}/v4/projects", "method": "GET", "header": [ { @@ -187,11 +238,16 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] } @@ -201,7 +257,6 @@ { "name": "Upload attachment", "request": { - "url": "{{api-url}}/v4/projects/7/attachments", "method": "POST", "header": [ { @@ -217,6 +272,18 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"title\": \"first attachment submission\",\n\t\t\"filePath\": \"asdjshdasdas/asdsadj/asdasd.png\",\n\t\t\"s3Bucket\": \"topcoder-project-service\",\n\t\t\"contentType\": \"application/png\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7/attachments", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "attachments" + ] + }, "description": "Create an project attachment" }, "response": [] @@ -224,7 +291,6 @@ { "name": "Update attachment", "request": { - "url": "{{api-url}}/v4/projects/7/attachments/2", "method": "PATCH", "header": [ { @@ -240,6 +306,19 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"title\": \"first attachment submission updated\",\n\t\t\"description\": \"updated project attachment\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7/attachments/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "attachments", + "2" + ] + }, "description": "Update project attachment" }, "response": [] @@ -247,7 +326,6 @@ { "name": "Delete attachment", "request": { - "url": "{{api-url}}/v4/projects/7/attachments/2", "method": "DELETE", "header": [ { @@ -263,6 +341,19 @@ "mode": "raw", "raw": "" }, + "url": { + "raw": "{{api-url}}/v4/projects/7/attachments/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "attachments", + "2" + ] + }, "description": "Delete a project attachment" }, "response": [] @@ -271,12 +362,10 @@ }, { "name": "Project With TemplateId issue", - "description": "", "item": [ { "name": "Create project with templateId (not existed)", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -292,14 +381,22 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project with templateId\",\n\t\t\"description\": \"Hello I am a test project with templateId\",\n\t\t\"type\": \"generic\",\n\t\t\"templateId\": 3000\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] }, { "name": "Create project with templateId", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -315,7 +412,16 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"name\": \"test project with templateId\",\n \"description\": \"Hello I am a test project with templateId\",\n \"type\": \"generic\",\n \"templateId\": 3\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] } @@ -323,12 +429,10 @@ }, { "name": "Project Members", - "description": "", "item": [ { "name": "Create project member with no payload", "request": { - "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -344,6 +448,18 @@ "mode": "raw", "raw": "" }, + "url": { + "raw": "{{api-url}}/v4/projects/1/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "members" + ] + }, "description": "Request payload is mandatory while creating project. If no request payload is specified this should result in 422 status code." }, "response": [] @@ -351,7 +467,6 @@ { "name": "Create project copilot with invalid userId", "request": { - "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -367,6 +482,18 @@ "mode": "raw", "raw": "{\n\"param\":{\n\t\"role\": \"copilot\"\n}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "members" + ] + }, "description": "Certain fields are mandatory while creating project. If invalid fields are specified this should result in 422 status code." }, "response": [] @@ -374,7 +501,6 @@ { "name": "Create project copilot with valid values", "request": { - "url": "{{api-url}}/v4/projects/7/members", "method": "POST", "header": [ { @@ -390,6 +516,18 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"userId\": 40051331,\n\t\t\"isPrimary\": true\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "members" + ] + }, "description": "If the request payload is valid, than project member should be created." }, "response": [] @@ -397,7 +535,6 @@ { "name": "Create project member, if user already registered", "request": { - "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -413,6 +550,18 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"userId\": 40051331,\n\t\t\"isPrimary\": true\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "members" + ] + }, "description": "If the request payload is valid and user is already registered with the specified role than this should result in 400." }, "response": [] @@ -420,7 +569,6 @@ { "name": "Create project manager with valid values", "request": { - "url": "{{api-url}}/v4/projects/7/members", "method": "POST", "header": [ { @@ -436,6 +584,18 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"manager\",\n\t\t\"userId\": 40051330,\n\t\t\"isPrimary\": true\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "members" + ] + }, "description": "If the request payload is valid, than project manager should be added. This should sync with the direct project is project is associated with direct project." }, "response": [] @@ -443,7 +603,6 @@ { "name": "Create project customer with valid values", "request": { - "url": "{{api-url}}/v4/projects/7/members", "method": "POST", "header": [ { @@ -459,6 +618,18 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"customer\",\n\t\t\"userId\": 40051332,\n\t\t\"isPrimary\": true\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "members" + ] + }, "description": "If the request payload is valid, than project customer should be added. This should sync with the direct project is project is associated with direct project." }, "response": [] @@ -466,7 +637,6 @@ { "name": "Update project member", "request": { - "url": "{{api-url}}/v4/projects/1/members/1", "method": "PATCH", "header": [ { @@ -482,6 +652,19 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"isPrimary\": true\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1/members/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "members", + "1" + ] + }, "description": "Update a project's member." }, "response": [] @@ -489,7 +672,6 @@ { "name": "Update project member with isPrimary False", "request": { - "url": "{{api-url}}/v4/projects/1/members/1", "method": "PATCH", "header": [ { @@ -505,6 +687,19 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"role\": \"copilot\",\n\t\t\"isPrimary\": false\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1/members/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "members", + "1" + ] + }, "description": "Update a project's member." }, "response": [] @@ -512,7 +707,6 @@ { "name": "wrong role", "request": { - "url": "{{api-url}}/v4/projects/3/members/5", "method": "PATCH", "header": [ { @@ -528,14 +722,25 @@ "mode": "raw", "raw": " {\n \"param\": {\n \"role\": \"wrong\"\n }\n } " }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/3/members/5", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "3", + "members", + "5" + ] + } }, "response": [] }, { "name": "Delete project member", "request": { - "url": "{{api-url}}/v4/projects/3/members/5", "method": "DELETE", "header": [ { @@ -551,6 +756,19 @@ "mode": "raw", "raw": "" }, + "url": { + "raw": "{{api-url}}/v4/projects/3/members/5", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "3", + "members", + "5" + ] + }, "description": "Delete a project's member" }, "response": [] @@ -558,7 +776,6 @@ { "name": "editing project member roles & primary option", "request": { - "url": "{{api-url}}/v4/projects/1/members/2", "method": "PATCH", "header": [ { @@ -574,7 +791,19 @@ "mode": "raw", "raw": " {\n \"param\": {\n \"role\": \"manager\",\n \"isPrimary\": true\n }\n } " }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/members/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "members", + "2" + ] + } }, "response": [] } @@ -582,12 +811,10 @@ }, { "name": "Projects", - "description": "Requests for all things projects.", "item": [ { "name": "Create project without payload", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -603,6 +830,16 @@ "mode": "raw", "raw": "{\n\t\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + }, "description": "Request body is mandatory while creating project. If invalid request body is supplied this should return 422 status code." }, "response": [] @@ -610,7 +847,6 @@ { "name": "Create project without valid name", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -626,6 +862,16 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + }, "description": "Certain fields are mandatory while creating project. If invalid request body is supplied this should return 422 status code." }, "response": [] @@ -633,7 +879,6 @@ { "name": "Create project with valid values", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -649,6 +894,16 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project\",\n\t\t\"description\": \"Hello I am a test project\",\n\t\t\"type\": \"generic\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + }, "description": "Valid request body. Project should be created successfully." }, "response": [] @@ -656,7 +911,6 @@ { "name": "Create project by inactive user", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -672,6 +926,16 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project\",\n\t\t\"description\": \"Hello I am a test project\",\n\t\t\"type\": \"generic\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + }, "description": "Valid request body. Project should be created successfully." }, "response": [] @@ -679,24 +943,31 @@ { "name": "Create project with project estimations", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { "key": "Authorization", - "value": "Bearer {{jwt-token}}", - "description": "" + "value": "Bearer {{jwt-token}}" }, { "key": "Content-Type", - "value": "application/json", - "description": "" + "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project\",\n\t\t\"description\": \"Hello I am a test project\",\n\t\t\"type\": \"generic\",\n\t\t\"estimation\": [{\n\t\t\t\"buildingBlockKey\": \"BLOCK_KEY\",\n\t\t\t \"conditions\": \"( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || ONLY_ONE_OS_DESKTOP || ONLY_ONE_OS_PROGRESSIVE) && SCREENS_COUNT_SMALL && CA_NEEDED)\",\n\t\t\t \"price\": 5000,\n\t\t\t \"quantity\": 10,\n\t\t\t \"minTime\": 35,\n\t\t\t \"maxTime\": 35,\n\t\t\t \"metadata\": {\n\t\t\t \"deliverable\": \"dev-qa\"\n\t\t\t }\n\t\t}]\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + }, "description": "Valid request body. Project should be created successfully with project estimations." }, "response": [] @@ -704,7 +975,6 @@ { "name": "Get project by id", "request": { - "url": "{{api-url}}/v4/projects/7", "method": "GET", "header": [ { @@ -712,9 +982,16 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" + "url": { + "raw": "{{api-url}}/v4/projects/7", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7" + ] }, "description": "Get a project by id. project members and attachments should also be returned." }, @@ -723,6 +1000,13 @@ { "name": "Get project by id and request specific fields", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects/1?fields=id,name,description,members.id,members.projectId", "host": [ @@ -738,19 +1022,7 @@ "key": "fields", "value": "id,name,description,members.id,members.projectId" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "Get a project by id. project members and attachments should also be returned. Only those fields which are specified should be returned." }, @@ -759,7 +1031,6 @@ { "name": "List projects DB", "request": { - "url": "{{api-url}}/v4/projects/db", "method": "GET", "header": [ { @@ -767,9 +1038,16 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" + "url": { + "raw": "{{api-url}}/v4/projects/db", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "db" + ] }, "description": "List all the project with no filter. Default sort and limits are applied." }, @@ -778,6 +1056,13 @@ { "name": "List projects DB with limit and offset", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects/db?limit=1&offset=1", "host": [ @@ -797,19 +1082,7 @@ "key": "offset", "value": "1" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with no filter. Limit of 1 and offset of 1 is applied" }, @@ -818,9 +1091,16 @@ { "name": "List projects DB with filters applied", "request": { - "url": { - "raw": "{{api-url}}/v4/projects/db?filter=type%3Dgeneric", - "host": [ + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], + "url": { + "raw": "{{api-url}}/v4/projects/db?filter=type%3Dgeneric", + "host": [ "{{api-url}}" ], "path": [ @@ -833,19 +1113,7 @@ "key": "filter", "value": "type%3Dgeneric" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with filters applied. The filter string should be url encoded. Default limit and offset is applicable" }, @@ -854,6 +1122,13 @@ { "name": "List projects DB with sort applied", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects/db?sort=type%20desc", "host": [ @@ -869,19 +1144,7 @@ "key": "sort", "value": "type%20desc" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with custom sort and no filter. Default sort and limits are applied. The sort string has to be url encoded. Sort is of type `key asc|desc`" }, @@ -890,6 +1153,13 @@ { "name": "List projects DB and return specific fields", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects/db?fields=id,name,description", "host": [ @@ -905,19 +1175,7 @@ "key": "fields", "value": "id,name,description" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with no filter. Default sort and limits are applied. The fields to return is specified as comma separated list. Only those fields should be returned." }, @@ -926,7 +1184,6 @@ { "name": "List projects DB with copilot token", "request": { - "url": "{{api-url}}/v4/projects/db", "method": "GET", "header": [ { @@ -934,18 +1191,23 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/db", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "db" + ] + } }, "response": [] }, { "name": "List projects", "request": { - "url": "{{api-url}}/v4/projects", "method": "GET", "header": [ { @@ -953,9 +1215,15 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] }, "description": "List all the project with no filter. Default sort and limits are applied." }, @@ -964,6 +1232,13 @@ { "name": "List projects with limit and offset", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects?limit=1&offset=1", "host": [ @@ -982,19 +1257,7 @@ "key": "offset", "value": "1" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with no filter. Limit of 1 and offset of 1 is applied" }, @@ -1003,6 +1266,13 @@ { "name": "List projects with filters applied", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects?filter=type%3Dgeneric", "host": [ @@ -1017,19 +1287,7 @@ "key": "filter", "value": "type%3Dgeneric" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with filters applied. The filter string should be url encoded. Default limit and offset is applicable" }, @@ -1038,6 +1296,13 @@ { "name": "List projects with sort applied", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects?sort=type%20desc", "host": [ @@ -1052,19 +1317,7 @@ "key": "sort", "value": "type%20desc" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with custom sort and no filter. Default sort and limits are applied. The sort string has to be url encoded. Sort is of type `key asc|desc`" }, @@ -1073,6 +1326,13 @@ { "name": "List projects and return specific fields", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + } + ], "url": { "raw": "{{api-url}}/v4/projects?fields=id,name,description", "host": [ @@ -1087,19 +1347,7 @@ "key": "fields", "value": "id,name,description" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" + ] }, "description": "List all the project with no filter. Default sort and limits are applied. The fields to return is specified as comma separated list. Only those fields should be returned." }, @@ -1108,7 +1356,6 @@ { "name": "List projects with copilot token", "request": { - "url": "{{api-url}}/v4/projects", "method": "GET", "header": [ { @@ -1116,18 +1363,22 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] }, { "name": "DELETE project by id", "request": { - "url": "{{api-url}}/v4/projects/3", "method": "DELETE", "header": [ { @@ -1139,6 +1390,17 @@ "mode": "raw", "raw": "" }, + "url": { + "raw": "{{api-url}}/v4/projects/3", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "3" + ] + }, "description": "Delete a project by id" }, "response": [] @@ -1146,7 +1408,6 @@ { "name": "Update project", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1162,6 +1423,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"name\": \"project name updated\"\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + }, "description": "Update the project name. Name should be updated successfully." }, "response": [] @@ -1169,7 +1441,6 @@ { "name": "Update project 403", "request": { - "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -1185,6 +1456,17 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"project name updated\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2" + ] + }, "description": "Update the project name. If user don't have permission to the project than it should return 403." }, "response": [] @@ -1192,7 +1474,6 @@ { "name": "Update project 404", "request": { - "url": "{{api-url}}/v4/projects/10", "method": "PATCH", "header": [ { @@ -1208,6 +1489,17 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"project name updated\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/10", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "10" + ] + }, "description": "Update the project name. If project is not found than this result in 404 status code." }, "response": [] @@ -1215,7 +1507,6 @@ { "name": "Update project status to in review", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1231,6 +1522,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"in_review\"\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + }, "description": "Update the project status." }, "response": [] @@ -1238,7 +1540,6 @@ { "name": "Update project status to reviewed", "request": { - "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1254,6 +1555,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"reviewed\"\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7" + ] + }, "description": "Update the project status." }, "response": [] @@ -1261,7 +1573,6 @@ { "name": "Update project status to paused", "request": { - "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1277,6 +1588,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"paused\"\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7" + ] + }, "description": "Update the project status." }, "response": [] @@ -1284,7 +1606,6 @@ { "name": "Update project status to cancelled with cancelReason", "request": { - "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1300,6 +1621,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"cancelled\",\n \"cancelReason\": \"price/cost\"\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7" + ] + }, "description": "Update the project status. While cancelling the project `cancelReason` is mandatory." }, "response": [] @@ -1307,7 +1639,6 @@ { "name": "Update project status to cancelled", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1323,6 +1654,17 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"status\": \"cancelled\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + }, "description": "Update the project status. While cancelling the project `cancelReason` is mandatory. If no `cancelReason` is supplied this should result in 422 status code." }, "response": [] @@ -1330,7 +1672,6 @@ { "name": "Update project status to completed", "request": { - "url": "{{api-url}}/v4/projects/7", "method": "PATCH", "header": [ { @@ -1346,6 +1687,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"status\": \"completed\"\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/7", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7" + ] + }, "description": "Update the project status." }, "response": [] @@ -1353,7 +1705,6 @@ { "name": "Move project out of cancel state.", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1369,14 +1720,24 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"status\": \"active\"\n\t}\n}" }, - "description": "Move a project out of cancel state. Only admin and manager is allowed to do so." - }, + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + }, + "description": "Move a project out of cancel state. Only admin and manager is allowed to do so." + }, "response": [] }, { "name": "Move project out of cancel state 403", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1392,6 +1753,17 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"status\": \"active\"\n\t}\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + }, "description": "Move a project out of cancel state. Only admin and manager is allowed to do so." }, "response": [] @@ -1399,7 +1771,6 @@ { "name": "Update project details", "request": { - "url": "{{api-url}}/v4/projects/8", "method": "PATCH", "header": [ { @@ -1415,6 +1786,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"details\": {\n \"summary\": \"project name updated\"\n }\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/8", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "8" + ] + }, "description": "Update the project details. This should fire specification modified event" }, "response": [] @@ -1422,7 +1804,6 @@ { "name": "Update project bookmarks", "request": { - "url": "{{api-url}}/v4/projects/8", "method": "PATCH", "header": [ { @@ -1438,6 +1819,17 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"bookmarks\": [\n {\n \"title\": \"test\",\n \"address\": \"http://topcoder.com\"\n }\n \n ]\n }\n}" }, + "url": { + "raw": "{{api-url}}/v4/projects/8", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "8" + ] + }, "description": "Update the project bookmarks. This should fire project link created event" }, "response": [] @@ -1445,7 +1837,6 @@ { "name": "launch a project by topcoder managers ", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1461,14 +1852,23 @@ "mode": "raw", "raw": "{\n \n \"param\":{\n \"name\": \"updatedProject name\",\n \"status\": \"active\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + } }, "response": [] }, { "name": "launch a project by member", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1484,14 +1884,23 @@ "mode": "raw", "raw": "{\n \n \"param\":{\n \"name\": \"updatedProject name\",\n \"status\": \"active\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + } }, "response": [] }, { "name": "launch a project by copilot", "request": { - "url": "{{api-url}}/v4/projects/1", "method": "PATCH", "header": [ { @@ -1507,20 +1916,29 @@ "mode": "raw", "raw": "{\n \n \"param\":{\n \"name\": \"updatedProject name\",\n \"status\": \"active\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1" + ] + } }, "response": [] } - ] + ], + "description": "Requests for all things projects." }, { "name": "EventHandling and Integration with Direct Project API", - "description": "", "item": [ { "name": "mock direct projects", "request": { - "url": "https://api.topcoder-dev.com/v3/direct/projects", "method": "GET", "header": [ { @@ -1532,18 +1950,26 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "https://api.topcoder-dev.com/v3/direct/projects", + "protocol": "https", + "host": [ + "api", + "topcoder-dev", + "com" + ], + "path": [ + "v3", + "direct", + "projects" + ] + } }, "response": [] }, { "name": " Create direct project when a new project is successfully created", "request": { - "url": "{{api-url}}/v4/projects", "method": "POST", "header": [ { @@ -1559,14 +1985,22 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"type\": \"generic\",\n \"description\": \"test project\",\n \"details\": {},\n \"billingAccountId\": 123,\n \"name\": \"test project1\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects" + ] + } }, "response": [] }, { "name": "Response error from direct project service", "request": { - "url": "{{api-url}}/v4/projects/1/members", "method": "POST", "header": [ { @@ -1582,14 +2016,24 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"userId\": 2, \n \"role\": \"copilot\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "members" + ] + } }, "response": [] }, { "name": " Add co-pilot when a co-pilot is added to a project", "request": { - "url": "{{api-url}}/v4/projects/2/members", "method": "POST", "header": [ { @@ -1605,14 +2049,24 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"userId\": 2, \n \"role\": \"copilot\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2/members", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2", + "members" + ] + } }, "response": [] }, { "name": "remove copilot from direct project when editing project member role", "request": { - "url": "{{api-url}}/v4/projects/2/members/4", "method": "PATCH", "header": [ { @@ -1628,14 +2082,25 @@ "mode": "raw", "raw": " {\n \"param\": {\n \"role\": \"customer\",\n \"isPrimary\": true\n }\n } " }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2/members/4", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2", + "members", + "4" + ] + } }, "response": [] }, { "name": " Sync billing account id with direct", "request": { - "url": "{{api-url}}/v4/projects/2", "method": "PATCH", "header": [ { @@ -1651,14 +2116,23 @@ "mode": "raw", "raw": "{\n \"param\": {\n \"billingAccountId\": 9999, \n \"name\": \"new project name\"\n }\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2" + ] + } }, "response": [] }, { "name": "Delete co-pilot when a co-pilot is removed from a project", "request": { - "url": "{{api-url}}/v4/projects/2/members/4", "method": "DELETE", "header": [ { @@ -1674,7 +2148,19 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/2/members/4", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "2", + "members", + "4" + ] + } }, "response": [] } @@ -1682,12 +2168,10 @@ }, { "name": "Project Phase", - "description": "", "item": [ { "name": "Create Phase", "request": { - "url": "{{api-url}}/v4/projects/1/phases", "method": "POST", "header": [ { @@ -1703,14 +2187,24 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase\",\n\t\t\"status\": \"active\",\n\t\t\"startDate\": \"2018-05-15T00:00:00\",\n\t\t\"endDate\": \"2018-05-16T00:00:00\",\n\t\t\"budget\": 20,\n\t\t\"details\": {\n\t\t\t\"aDetails\": \"a details\"\n\t\t}\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases" + ] + } }, "response": [] }, { "name": "Create Phase with order", "request": { - "url": "{{api-url}}/v4/projects/1/phases", "method": "POST", "header": [ { @@ -1726,14 +2220,24 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase\",\n\t\t\"status\": \"active\",\n\t\t\"startDate\": \"2018-05-15T00:00:00\",\n\t\t\"endDate\": \"2018-05-16T00:00:00\",\n\t\t\"budget\": 20,\n\t\t\"details\": {\n\t\t\t\"aDetails\": \"a details\"\n\t\t},\n\t\t\"order\": 1\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases" + ] + } }, "response": [] }, { "name": "Create Phase with productTemplateId", "request": { - "url": "{{api-url}}/v4/projects/1/phases", "method": "POST", "header": [ { @@ -1749,14 +2253,24 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase\",\n\t\t\"status\": \"active\",\n\t\t\"startDate\": \"2018-05-15T00:00:00\",\n\t\t\"endDate\": \"2018-05-16T00:00:00\",\n\t\t\"budget\": 20,\n\t\t\"details\": {\n\t\t\t\"aDetails\": \"a details\"\n\t\t},\n\t\t\"order\": 1,\n\t\t\"productTemplateId\": 1\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases" + ] + } }, "response": [] }, { "name": "List Phase DB", "request": { - "url": "{{api-url}}/v4/projects/1/phases/db", "method": "GET", "header": [ { @@ -1768,17 +2282,36 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/db", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "db" + ] + } }, "response": [] }, { "name": "List Phase DB with fields", "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt-token}}" + }, + { + "key": "Content-Type", + "value": "application/json" + } + ], "url": { "raw": "{{api-url}}/v4/projects/1/phases/db?fields=status,name,budget", "host": [ @@ -1796,9 +2329,14 @@ "key": "fields", "value": "status,name,budget" } - ], - "variable": [] - }, + ] + } + }, + "response": [] + }, + { + "name": "List Phase DB with sort", + "request": { "method": "GET", "header": [ { @@ -1810,17 +2348,6 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "List Phase DB with sort", - "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases/db?sort=status desc", "host": [ @@ -1838,9 +2365,14 @@ "key": "sort", "value": "status desc" } - ], - "variable": [] - }, + ] + } + }, + "response": [] + }, + { + "name": "List Phase DB with sort by order", + "request": { "method": "GET", "header": [ { @@ -1852,17 +2384,6 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "List Phase DB with sort by order", - "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases/db?sort=order desc", "host": [ @@ -1880,9 +2401,14 @@ "key": "sort", "value": "order desc" } - ], - "variable": [] - }, + ] + } + }, + "response": [] + }, + { + "name": "List Phase", + "request": { "method": "GET", "header": [ { @@ -1894,18 +2420,24 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases" + ] + } }, "response": [] }, { - "name": "List Phase", + "name": "List Phase with fields", "request": { - "url": "{{api-url}}/v4/projects/1/phases", "method": "GET", "header": [ { @@ -1917,17 +2449,6 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "List Phase with fields", - "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases?fields=status,name,budget", "host": [ @@ -1944,11 +2465,16 @@ "key": "fields", "value": "status,name,budget" } - ], - "variable": [] - }, - "method": "GET", - "header": [ + ] + } + }, + "response": [] + }, + { + "name": "List Phase with sort", + "request": { + "method": "GET", + "header": [ { "key": "Authorization", "value": "Bearer {{jwt-token}}" @@ -1958,17 +2484,6 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "List Phase with sort", - "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases?sort=status desc", "host": [ @@ -1985,9 +2500,14 @@ "key": "sort", "value": "status desc" } - ], - "variable": [] - }, + ] + } + }, + "response": [] + }, + { + "name": "List Phase with sort by order", + "request": { "method": "GET", "header": [ { @@ -1999,17 +2519,6 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "List Phase with sort by order", - "request": { "url": { "raw": "{{api-url}}/v4/projects/1/phases?sort=order desc", "host": [ @@ -2026,32 +2535,14 @@ "key": "sort", "value": "order desc" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - }, - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + ] + } }, "response": [] }, { "name": "Get Phase", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1", "method": "GET", "header": [ { @@ -2063,18 +2554,25 @@ "value": "application/json" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1" + ] + } }, "response": [] }, { "name": "Update Phase", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1", "method": "PATCH", "header": [ { @@ -2090,14 +2588,25 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase xxx\",\n\t\t\"status\": \"inactive\",\n\t\t\"startDate\": \"2018-05-14T00:00:00\",\n\t\t\"endDate\": \"2018-05-15T00:00:00\",\n\t\t\"budget\": 30,\n\t\t\"progress\": 15,\n\t\t\"details\": {\n\t\t\t\"message\": \"phase details\"\n\t\t}\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1" + ] + } }, "response": [] }, { "name": "Update Phase with order", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1", "method": "PATCH", "header": [ { @@ -2113,14 +2622,25 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test project phase xxx\",\n\t\t\"status\": \"inactive\",\n\t\t\"startDate\": \"2018-05-14T00:00:00\",\n\t\t\"endDate\": \"2018-05-15T00:00:00\",\n\t\t\"budget\": 30,\n\t\t\"progress\": 15,\n\t\t\"details\": {\n\t\t\t\"message\": \"phase details\"\n\t\t},\n\t\t\"order\": 1\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1" + ] + } }, "response": [] }, { "name": "Delete Phase", "request": { - "url": "{{api-url}}/v4/projects/1/phases/3", "method": "DELETE", "header": [ { @@ -2136,7 +2656,19 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/3", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "3" + ] + } }, "response": [] } @@ -2144,12 +2676,10 @@ }, { "name": "Phase Products", - "description": "", "item": [ { "name": "Create Phase Product", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1/products", "method": "POST", "header": [ { @@ -2165,14 +2695,26 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test phase product\",\n\t\t\"type\": \"type 1\",\n\t\t\"estimatedPrice\": 10\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1/products", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1", + "products" + ] + } }, "response": [] }, { "name": "List Phase DB Products", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1/products/db", "method": "GET", "header": [ { @@ -2180,18 +2722,27 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1/products/db", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1", + "products", + "db" + ] + } }, "response": [] }, { "name": "List Phase Products", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1/products", "method": "GET", "header": [ { @@ -2199,18 +2750,26 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1/products", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1", + "products" + ] + } }, "response": [] }, { "name": "Get Phase Product", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1/products/1", "method": "GET", "header": [ { @@ -2218,18 +2777,27 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1/products/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1", + "products", + "1" + ] + } }, "response": [] }, { "name": "Update Phase Product", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1/products/1", "method": "PATCH", "header": [ { @@ -2245,14 +2813,27 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"name\": \"test phase product xxx\",\n\t\t\"type\": \"type 2\",\n\t\t\"templateId\": 10,\n\t\t\"estimatedPrice\": 1.234567,\n\t\t\"actualPrice\": 2.34567,\n\t\t\"details\": {\n\t\t\t\"message\": \"this is a JSON type. You can use any json\"\n\t\t}\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1/products/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1", + "products", + "1" + ] + } }, "response": [] }, { "name": "Delete Phase Product", "request": { - "url": "{{api-url}}/v4/projects/1/phases/1/products/1", "method": "DELETE", "header": [ { @@ -2264,7 +2845,21 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/phases/1/products/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "phases", + "1", + "products", + "1" + ] + } }, "response": [] } @@ -2272,12 +2867,10 @@ }, { "name": "Project Templates", - "description": "", "item": [ { "name": "Create project template", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2293,14 +2886,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"scope\":{\r\n \"scope1\":\"scope 1\"\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\"\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates" + ] + } }, "response": [] }, { "name": "Create project template with form, priceConfig, planConfig", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2316,14 +2919,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates" + ] + } }, "response": [] }, { "name": "Create project template with only form key", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2339,14 +2952,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"dev\"\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates" + ] + } }, "response": [] }, { "name": "Create project template with wrong form key", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2362,14 +2985,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"wrong-key\"\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates" + ] + } }, "response": [] }, { "name": "Create project template with wrong model version", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "POST", "header": [ { @@ -2385,14 +3018,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"question\": \"question 1\",\r\n \"info\": \"info 1\",\r\n \"aliases\": [\"key-1\", \"key_1\"],\r\n \"form\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1123\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1123\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"dev\",\r\n \t\"version\": 1123\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates" + ] + } }, "response": [] }, { "name": "List project templates", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates", "method": "GET", "header": [ { @@ -2404,18 +3047,24 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates" + ] + } }, "response": [] }, { "name": "Get project template", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "GET", "header": [ { @@ -2427,21 +3076,28 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Upgrade a project template with from, priceConfig, planConfig", - "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/2/upgrade", - "method": "POST", - "header": [ - { + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Upgrade a project template with from, priceConfig, planConfig", + "request": { + "method": "POST", + "header": [ + { "key": "Content-Type", "value": "application/json" }, @@ -2454,14 +3110,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 2\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"qa\",\t\r\n \t \"version\": 2\t\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/2/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "2", + "upgrade" + ] + } }, "response": [] }, { "name": "Upgrade a project template with wrong model version", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1/upgrade", "method": "POST", "header": [ { @@ -2477,14 +3145,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1234\r\n },\r\n \"priceConfig\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1234\r\n },\r\n \"planConfig\": {\r\n \t\"key\": \"dev\",\t\r\n \t \"version\": 1234\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "1", + "upgrade" + ] + } }, "response": [] }, { "name": "Upgrade a project template without define form, priceConfig, planConfig", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/3/upgrade", "method": "POST", "header": [ { @@ -2500,14 +3180,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{ \r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/3/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "3", + "upgrade" + ] + } }, "response": [] }, { "name": "Update project template", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "PATCH", "header": [ { @@ -2523,14 +3215,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"scope\":{\r\n \"scope1\":\"scope 1\",\r\n \"scope2\": [\"a\"]\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\",\r\n \"phase2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "1" + ] + } }, "response": [] }, { "name": "Update project template with define form, priceConfig, planConfig", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "PATCH", "header": [ { @@ -2546,14 +3249,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n \"form\": {\r\n \"key\": \"dev\",\r\n \"version\": 1\r\n },\r\n \"priceConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1\r\n },\r\n \"planConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "1" + ] + } }, "response": [] }, { "name": "Update project template with wrong form, priceConfig, planConfig", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/1", "method": "PATCH", "header": [ { @@ -2569,14 +3283,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"app\",\r\n\t\"form\": {\r\n \"key\": \"dev\",\r\n \"version\": 1123\r\n },\r\n \"priceConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1123\r\n },\r\n \"planConfig\": {\r\n \"key\": \"dev\",\r\n \"version\": 1123\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "1" + ] + } }, "response": [] }, { "name": "Delete project template", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTemplates/2", "method": "DELETE", "header": [ { @@ -2592,7 +3317,19 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"new category\",\r\n \"scope\":{\r\n \"scope1\":\"scope 1\",\r\n \"scope2\": [\"a\"]\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\",\r\n \"phase2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTemplates/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTemplates", + "2" + ] + } }, "response": [] } @@ -2600,12 +3337,10 @@ }, { "name": "Product Templates", - "description": "", "item": [ { "name": "Create product template", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -2621,14 +3356,24 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"template\": {\r\n \"template1\": {\r\n \"name\": \"template 1\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 1\"\r\n },\r\n \"others\": [\"others 11\", \"others 12\"]\r\n },\r\n \"template2\": {\r\n \"name\": \"template 2\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 2\"\r\n },\r\n \"others\": [\"others 21\", \"others 22\"]\r\n }\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates" + ] + } }, "response": [] }, { "name": "Create product template with form", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -2644,14 +3389,24 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"form\": {\r\n\t\t\"key\": \"dev\",\r\n\t\t\"version\": 1\r\n\t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates" + ] + } }, "response": [] }, { "name": "Create product template with wrong form key", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -2667,14 +3422,24 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"form\": {\r\n\t\t\"key\": \"wrong-key\"\r\n\t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates" + ] + } }, "response": [] }, { "name": "Create product template with wrong model version", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "POST", "header": [ { @@ -2690,14 +3455,24 @@ "mode": "raw", "raw": "{\r\n \"param\": {\r\n \"name\": \"name 1\",\r\n \"productKey\": \"productKey 1\",\r\n \"category\": \"key1\",\r\n \"icon\": \"http://example.com/icon1.ico\",\r\n \"brief\": \"brief 1\",\r\n \"details\": \"details 1\",\r\n \"aliases\": [\"product key 1\", \"product_key_1\"],\r\n \"form\": {\r\n\t\t\"key\": \"dev\",\r\n\t\t\"version\": 1123\r\n\t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates" + ] + } }, "response": [] }, { "name": "List product templates", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates", "method": "GET", "header": [ { @@ -2709,18 +3484,24 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates" + ] + } }, "response": [] }, { "name": "Get product template", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates/3", "method": "GET", "header": [ { @@ -2732,18 +3513,25 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates/3", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates", + "3" + ] + } }, "response": [] }, { "name": "Update product template", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates/1", "method": "PATCH", "header": [ { @@ -2759,14 +3547,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"productKey\":\"new productKey\",\r\n \"category\":\"key1\",\r\n \"icon\":\"http://example.com/icon-new.ico\",\r\n \"brief\": \"new brief\",\r\n \"details\": \"new details\",\r\n \"aliases\":{\r\n \"alias1\":\"scope 1\",\r\n \"alias2\": [\"a\"]\r\n },\r\n \"template\":{\r\n \"template1\":\"template 1\",\r\n \"template2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates", + "1" + ] + } }, "response": [] }, { "name": "Delete product template", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates/1", "method": "DELETE", "header": [ { @@ -2782,14 +3581,25 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates", + "1" + ] + } }, "response": [] }, { "name": "Upgrade a product template with form", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates/2/upgrade", "method": "POST", "header": [ { @@ -2807,14 +3617,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t\"version\": 2\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates/2/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates", + "2", + "upgrade" + ] + } }, "response": [] }, { "name": "Upgrade a product template with wrong model version", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates/1/upgrade", "method": "POST", "header": [ { @@ -2832,14 +3654,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"form\": {\r\n \t\"key\": \"dev\",\t\r\n \t\"version\": 1234\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates/1/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates", + "1", + "upgrade" + ] + } }, "response": [] }, { "name": "Upgrade a product template without define form", "request": { - "url": "{{api-url}}/v4/projects/metadata/productTemplates/3/upgrade", "method": "POST", "header": [ { @@ -2857,7 +3691,20 @@ "mode": "raw", "raw": "{\r\n \"param\":{ \r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productTemplates/3/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productTemplates", + "3", + "upgrade" + ] + } }, "response": [] } @@ -2865,12 +3712,10 @@ }, { "name": "Project Type", - "description": "", "item": [ { "name": "Create project type", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTypes", "method": "POST", "header": [ { @@ -2886,14 +3731,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"key\": \"new key\",\r\n \"displayName\": \"new displayName\",\r\n \"icon\": \"http://example.com/icon4.ico\",\r\n \t\"question\": \"question 4\",\r\n \t\"info\": \"info 4\",\r\n \t\"aliases\": [\"key-41\", \"key_42\"],\r\n \t\"metadata\": {}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTypes", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTypes" + ] + } }, "response": [] }, { "name": "List project types", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTypes", "method": "GET", "header": [ { @@ -2905,18 +3760,24 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTypes", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTypes" + ] + } }, "response": [] }, { "name": "Get project type", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTypes/generic", "method": "GET", "header": [ { @@ -2928,18 +3789,25 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTypes/generic", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTypes", + "generic" + ] + } }, "response": [] }, { "name": "Update project type", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", "method": "PATCH", "header": [ { @@ -2955,14 +3823,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"displayName\": \"Chatbot-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTypes", + "chatbot" + ] + } }, "response": [] }, { "name": "Delete project type", "request": { - "url": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", "method": "DELETE", "header": [ { @@ -2978,7 +3857,19 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/projectTypes/chatbot", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "projectTypes", + "chatbot" + ] + } }, "response": [] } @@ -2986,12 +3877,10 @@ }, { "name": "Product Category", - "description": "", "item": [ { "name": "Create product category", "request": { - "url": "{{api-url}}/v4/projects/metadata/productCategories", "method": "POST", "header": [ { @@ -3007,15 +3896,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"key\": \"generic\",\r\n \"displayName\": \"new displayName\",\r\n \"icon\": \"icon\",\r\n \"question\": \"question\",\r\n \"info\": \"info\",\r\n \"aliases\": [\"key-1\", \"key-2\"]\r\n }\r\n}" }, - "description": "" - }, - "response": [] - }, - { - "name": "List product categories", - "request": { - "url": "{{api-url}}/v4/projects/metadata/productCategories", - "method": "GET", + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productCategories", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productCategories" + ] + } + }, + "response": [] + }, + { + "name": "List product categories", + "request": { + "method": "GET", "header": [ { "key": "Content-Type", @@ -3026,18 +3925,24 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productCategories", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productCategories" + ] + } }, "response": [] }, { "name": "Get product category", "request": { - "url": "{{api-url}}/v4/projects/metadata/productCategories/generic", "method": "GET", "header": [ { @@ -3049,18 +3954,25 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productCategories/generic", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productCategories", + "generic" + ] + } }, "response": [] }, { "name": "Update product category", "request": { - "url": "{{api-url}}/v4/projects/metadata/productCategories/generic", "method": "PATCH", "header": [ { @@ -3076,14 +3988,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"displayName\": \"Chatbot-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productCategories/generic", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productCategories", + "generic" + ] + } }, "response": [] }, { "name": "Delete product category", "request": { - "url": "{{api-url}}/v4/projects/metadata/productCategories/generic", "method": "DELETE", "header": [ { @@ -3099,7 +4022,19 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"key\":\"new key\",\r\n \"category\":\"new category\",\r\n \"scope\":{\r\n \"scope1\":\"scope 1\",\r\n \"scope2\": [\"a\"]\r\n },\r\n \"phases\":{\r\n \"phase1\":\"phase 1\",\r\n \"phase2\": {\r\n \t\"another\": \"another\"\r\n }\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/productCategories/generic", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "productCategories", + "generic" + ] + } }, "response": [] } @@ -3107,12 +4042,10 @@ }, { "name": "Project upgrade", - "description": "Request to migrate projects.", "item": [ { "name": "Migrate project", "request": { - "url": "{{api-url}}/v4/projects/6/upgrade", "method": "POST", "header": [ { @@ -3128,14 +4061,24 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/6/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "6", + "upgrade" + ] + } }, "response": [] }, { "name": "Migrate project (completed)", "request": { - "url": "{{api-url}}/v4/projects/7/upgrade", "method": "POST", "header": [ { @@ -3151,14 +4094,24 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/7/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "upgrade" + ] + } }, "response": [] }, { "name": "Migrate project with phase name", "request": { - "url": "{{api-url}}/v4/projects/6/upgrade", "method": "POST", "header": [ { @@ -3174,14 +4127,24 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3,\n\t\t\"phaseName\": \"Custom phase name\"\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/6/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "6", + "upgrade" + ] + } }, "response": [] }, { "name": "Migrate project with phase name (completed)", "request": { - "url": "{{api-url}}/v4/projects/7/upgrade", "method": "POST", "header": [ { @@ -3197,20 +4160,30 @@ "mode": "raw", "raw": "{\n\t\"param\": {\n\t\t\"targetVersion\": \"v3\",\n\t\t\"defaultProductTemplateId\": 3,\n\t\t\"phaseName\": \"Custom phase name\"\n\t}\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/7/upgrade", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "7", + "upgrade" + ] + } }, "response": [] } - ] + ], + "description": "Request to migrate projects." }, { "name": "Timeline", - "description": "", "item": [ { "name": "Create timeline", "request": { - "url": "{{api-url}}/v4/timelines", "method": "POST", "header": [ { @@ -3226,14 +4199,22 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"description\":\"new description\",\r\n \"startDate\":\"2018-05-29T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-30T00:00:00.000Z\",\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines" + ] + } }, "response": [] }, { "name": "Create timeline with templateId", "request": { - "url": "{{api-url}}/v4/timelines", "method": "POST", "header": [ { @@ -3249,14 +4230,22 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\":\"new name\",\r\n \"description\":\"new description\",\r\n \"startDate\":\"2018-05-29T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-30T00:00:00.000Z\",\r\n \"reference\": \"project\",\r\n \"referenceId\": 1,\r\n \"templateId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines" + ] + } }, "response": [] }, { "name": "Create timeline with invalid data", "request": { - "url": "{{api-url}}/v4/timelines", "method": "POST", "header": [ { @@ -3272,13 +4261,33 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"startDate\":\"2018-05-29T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-28T00:00:00.000Z\",\r\n \"reference\": \"invalid\",\r\n \"referenceId\": 0\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines" + ] + } }, "response": [] }, { "name": "List timelines (filter by reference and referenceId)", "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-copilot-40051332}}" + } + ], "url": { "raw": "{{api-url}}/v4/timelines?filter=reference%3Dphase%26referenceId%3D1", "host": [ @@ -3293,32 +4302,14 @@ "key": "filter", "value": "reference%3Dphase%26referenceId%3D1" } - ], - "variable": [] - }, - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token-copilot-40051332}}" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + ] + } }, "response": [] }, { "name": "Get timeline", "request": { - "url": "{{api-url}}/v4/timelines/1", "method": "GET", "header": [ { @@ -3330,18 +4321,23 @@ "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1" + ] + } }, "response": [] }, { "name": "Update timeline", "request": { - "url": "{{api-url}}/v4/timelines/1", "method": "PATCH", "header": [ { @@ -3357,14 +4353,23 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"timeline 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"startDate\": \"2018-05-01T00:00:00.000Z\",\r\n \"endDate\": null,\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1" + ] + } }, "response": [] }, { "name": "Update timeline (startDate)", "request": { - "url": "{{api-url}}/v4/timelines/1", "method": "PATCH", "header": [ { @@ -3380,14 +4385,23 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"timeline 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"startDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"endDate\": null,\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1" + ] + } }, "response": [] }, { "name": "Update timeline (endDate)", "request": { - "url": "{{api-url}}/v4/timelines/1", "method": "PATCH", "header": [ { @@ -3403,14 +4417,23 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"timeline 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"startDate\": \"2018-05-04T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"reference\": \"project\",\r\n \"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1" + ] + } }, "response": [] }, { "name": "Delete timeline", "request": { - "url": "{{api-url}}/v4/timelines/4", "method": "DELETE", "header": [ { @@ -3426,7 +4449,17 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/4", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "4" + ] + } }, "response": [] } @@ -3434,12 +4467,10 @@ }, { "name": "Milestone", - "description": "", "item": [ { "name": "Create milestone", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones", "method": "POST", "header": [ { @@ -3455,14 +4486,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 3\",\r\n \"description\": \"description 3\",\r\n \"duration\": 4,\r\n \"startDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"completionDate\": \"2018-05-08T00:00:00.000Z\",\r\n \"status\": \"open\",\r\n \"type\": \"type3\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 2,\r\n 3,\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 3\",\r\n \"activeText\": \"activeText 3\",\r\n \"completedText\": \"completedText 3\",\r\n \"blockedText\": \"blockedText 3\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones" + ] + } }, "response": [] }, { "name": "Create milestone with invalid data", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones", "method": "POST", "header": [ { @@ -3478,14 +4519,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"startDate\": \"2018-05-05T00:00:00.000Z\",\r\n \"endDate\": \"2018-05-04T00:00:00.000Z\",\r\n \"completionDate\": \"2018-05-04T00:00:00.000Z\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones" + ] + } }, "response": [] }, { "name": "List milestones", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones", "method": "GET", "header": [ { @@ -3497,17 +4548,35 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones" + ] + } }, "response": [] }, { "name": "List milestones (sort)", "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-copilot-40051332}}" + } + ], "url": { "raw": "{{api-url}}/v4/timelines/1/milestones?sort=order desc", "host": [ @@ -3524,9 +4593,14 @@ "key": "sort", "value": "order desc" } - ], - "variable": [] - }, + ] + } + }, + "response": [] + }, + { + "name": "Get milestone", + "request": { "method": "GET", "header": [ { @@ -3535,44 +4609,28 @@ }, { "key": "Authorization", - "value": "Bearer {{jwt-token-copilot-40051332}}" + "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Get milestone", - "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Update milestone", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -3588,14 +4646,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-09-28T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Update milestone - paused", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -3611,14 +4680,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"status\": \"paused\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"statusComment\": \"milestone paused\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Update milestone - resume", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -3634,14 +4714,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"status\": \"resume\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"statusComment\": \"milestone resume\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (active)", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/2", "method": "PATCH", "header": [ { @@ -3657,14 +4748,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 2-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-10-28T00:00:00.000Z\",\r\n \"status\": \"active\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "2" + ] + } }, "response": [] }, { "name": "Update milestone (completed)", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/2", "method": "PATCH", "header": [ { @@ -3680,14 +4782,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 2-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-10-28T00:00:00.000Z\",\r\n \"status\": \"completed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "2" + ] + } }, "response": [] }, { "name": "Update milestone (order 1 => 2)", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -3703,14 +4816,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 2,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (order 2 => 1)", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -3726,14 +4850,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (order 1 => 3)", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -3749,14 +4884,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 3,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (order 3 => 1)", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/1", "method": "PATCH", "header": [ { @@ -3772,14 +4918,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestone 1-updated\",\r\n \"description\": \"description-updated\",\r\n \"duration\": 3,\r\n \"completionDate\": \"2018-05-07T00:00:00.000Z\",\r\n \"status\": \"closed\",\r\n \"type\": \"type2\",\r\n \"details\": {\r\n \"detail1\": {\r\n \"subDetail1C\": 3\r\n },\r\n \"detail2\": [\r\n 4\r\n ]\r\n },\r\n \"order\": 1,\r\n \"plannedText\": \"plannedText 1-updated\",\r\n \"activeText\": \"activeText 1-updated\",\r\n \"completedText\": \"completedText 1-updated\",\r\n \"blockedText\": \"blockedText 1-updated\"\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "1" + ] + } }, "response": [] }, { "name": "Delete milestone", "request": { - "url": "{{api-url}}/v4/timelines/1/milestones/2", "method": "DELETE", "header": [ { @@ -3795,7 +4952,19 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/1/milestones/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "1", + "milestones", + "2" + ] + } }, "response": [] } @@ -3803,12 +4972,10 @@ }, { "name": "Milestone Template", - "description": "", "item": [ { "name": "Create milestone template", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "POST", "header": [ { @@ -3824,14 +4991,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 3\",\r\n \"description\": \"description 3\",\r\n \"duration\": 33,\r\n \"type\": \"type3\",\r\n \"order\": 1,\r\n \"activeText\": \"activeText 1\",\r\n \"completedText\": \"completedText 1\",\r\n \"blockedText\": \"blockedText 1\",\r\n \"plannedText\": \"planned Text 1\",\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1,\r\n\t\"metadata\": {}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates" + ] + } }, "response": [] }, { "name": "Create milestone template with invalid referenceId", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "POST", "header": [ { @@ -3847,14 +5024,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 3\",\r\n \"description\": \"description 3\",\r\n \"duration\": 33,\r\n \"type\": \"type3\",\r\n \"order\": 1,\r\n \"activeText\": \"activeText 1\",\r\n \"completedText\": \"completedText 1\",\r\n \"blockedText\": \"blockedText 1\",\r\n \"plannedText\": \"planned Text 1\",\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1000,\r\n\t\"metadata\": {}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates" + ] + } }, "response": [] }, { "name": "Create milestone template with invalid data", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "POST", "header": [ { @@ -3870,14 +5057,24 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates" + ] + } }, "response": [] }, { "name": "Clone milestone template", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", "method": "POST", "header": [ { @@ -3893,14 +5090,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"sourceReference\": \"productTemplate\",\r\n \"sourceReferenceId\": 1,\r\n \"reference\": \"productTemplate\",\r\n \"referenceId\": 2\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "clone" + ] + } }, "response": [] }, { "name": "Clone milestone template with invalid referenceId", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", "method": "POST", "header": [ { @@ -3916,14 +5124,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"sourceReference\": \"productTemplate\",\r\n \"sourceReferenceId\": 1,\r\n \"reference\": \"productTemplate\",\r\n \"referenceId\": 2000\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "clone" + ] + } }, "response": [] }, { "name": "Clone milestone template with invalid sourceReferenceId", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", "method": "POST", "header": [ { @@ -3939,14 +5158,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"sourceReference\": \"productTemplate\",\r\n \"sourceReferenceId\": 1000,\r\n \"reference\": \"productTemplate\",\r\n \"referenceId\": 2\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/clone", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "clone" + ] + } }, "response": [] }, { "name": "List milestone templates", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", "method": "GET", "header": [ { @@ -3958,17 +5188,35 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates" + ] + } }, "response": [] }, { "name": "List milestone templates (filter)", "request": { + "method": "GET", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt-token-copilot-40051332}}" + } + ], "url": { "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates?filter=reference%3DproductTemplate%26referenceId%3D1", "host": [ @@ -3985,9 +5233,14 @@ "key": "filter", "value": "reference%3DproductTemplate%26referenceId%3D1" } - ], - "variable": [] - }, + ] + } + }, + "response": [] + }, + { + "name": "List milestone templates (sort)", + "request": { "method": "GET", "header": [ { @@ -3999,17 +5252,6 @@ "value": "Bearer {{jwt-token-copilot-40051332}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "List milestone templates (sort)", - "request": { "url": { "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates?filter=reference%3DproductTemplate%26referenceId%3D1&sort=order desc", "host": [ @@ -4030,9 +5272,14 @@ "key": "sort", "value": "order desc" } - ], - "variable": [] - }, + ] + } + }, + "response": [] + }, + { + "name": "Get milestone template", + "request": { "method": "GET", "header": [ { @@ -4041,45 +5288,29 @@ }, { "key": "Authorization", - "value": "Bearer {{jwt-token-copilot-40051332}}" + "value": "Bearer {{jwt-token}}" } ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "1" + ] + } }, "response": [] }, { - "name": "Get milestone template", + "name": "Update milestone", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "Bearer {{jwt-token}}" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" - }, - "response": [] - }, - { - "name": "Update milestone", - "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", - "method": "PATCH", + "method": "PATCH", "header": [ { "key": "Content-Type", @@ -4094,14 +5325,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\t\"name\": \"milestoneTemplate 1-updated\",\r\n\t\"description\": \"description 1-updated\",\r\n\t\"duration\": 34,\r\n\t\"type\": \"type1-updated\",\r\n\t\"order\": 1,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (order 1 => 2)", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -4117,14 +5359,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 1-updated\",\r\n \"description\": \"description 1-updated\",\r\n \"duration\": 34,\r\n \"type\": \"type1-updated\",\r\n \"order\": 2,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (order 2 => 1)", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -4140,14 +5393,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\t\"name\": \"milestoneTemplate 1-updated\",\r\n\t\"description\": \"description 1-updated\",\r\n\t\"duration\": 34,\r\n\t\"type\": \"type1-updated\",\r\n\t\"order\": 1,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (order 1 => 3)", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -4163,14 +5427,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 1-updated\",\r\n \"description\": \"description 1-updated\",\r\n \"duration\": 34,\r\n \"type\": \"type1-updated\",\r\n \"order\": 3,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "1" + ] + } }, "response": [] }, { "name": "Update milestone (order 3 => 1)", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -4186,14 +5461,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \"name\": \"milestoneTemplate 1-updated\",\r\n \"description\": \"description 1-updated\",\r\n \"duration\": 34,\r\n \"type\": \"type1-updated\",\r\n \"order\": 1,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "1" + ] + } }, "response": [] }, { "name": "Update milestone with metadata", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", "method": "PATCH", "header": [ { @@ -4209,14 +5495,25 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n\t\"name\": \"milestoneTemplate 5-updated\",\r\n\t\"description\": \"description 5-updated\",\r\n\t\"duration\": 34,\r\n\t\"type\": \"type5-updated\",\r\n\t\"order\": 5,\r\n\t\"reference\": \"productTemplate\",\r\n\t\"referenceId\": 1,\r\n\t\"metadata\": {\r\n \"metadata1\": {\r\n \"name\": \"metadata 1 - update\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 1 - update\",\r\n \"newDetails\": \"new\"\r\n },\r\n \"others\": [\"others new\"]\r\n },\r\n \"metadata3\": {\r\n \"name\": \"metadata 3\",\r\n \"details\": {\r\n \"anyDetails\": \"any details 3\"\r\n },\r\n \"others\": [\"others 31\", \"others 32\"]\r\n }\r\n }\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "1" + ] + } }, "response": [] }, { "name": "Delete milestone", "request": { - "url": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/2", "method": "DELETE", "header": [ { @@ -4232,7 +5529,19 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/timelines/metadata/milestoneTemplates/2", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "timelines", + "metadata", + "milestoneTemplates", + "2" + ] + } }, "response": [] } @@ -4240,28 +5549,36 @@ }, { "name": "Metadata", - "description": "", "item": [ { "name": "Get all metadata", "request": { - "url": "{{api-url}}/v4/projects/metadata", "method": "GET", "header": [ { "key": "Authorization", - "value": "Bearer {{jwt-token-admin-40051333}}", - "description": "" + "value": "Bearer {{jwt-token-admin-40051333}}" } ], - "body": {}, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata" + ] + } }, "response": [] }, { "name": "Get all metadata with includeAllVersion", "request": { + "method": "GET", + "header": [], "url": { "raw": "{{api-url}}/v4/projects/metadata?includeAllReferred=true", "host": [ @@ -4277,16 +5594,8 @@ "key": "includeAllReferred", "value": "true" } - ], - "variable": [] - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + ] + } }, "response": [] } @@ -4294,54 +5603,76 @@ }, { "name": "Form Version", - "description": "", "item": [ { "name": "List forms", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions" + ] + } }, "response": [] }, { "name": "Get a particular version", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions", + "1" + ] + } }, "response": [] }, { "name": "Get latest version", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev" + ] + } }, "response": [] }, { "name": "Create form", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions", "method": "POST", "header": [ { @@ -4355,14 +5686,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions" + ] + } }, "response": [] }, { "name": "Update form", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", "method": "PATCH", "header": [ { @@ -4376,14 +5719,27 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test111\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions", + "1" + ] + } }, "response": [] }, { "name": "Delete form", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", "method": "DELETE", "header": [ { @@ -4397,7 +5753,21 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions", + "1" + ] + } }, "response": [] } @@ -4405,40 +5775,59 @@ }, { "name": "Form Revision", - "description": "", "item": [ { "name": "List all revision for version", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Get a particular revision", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions", + "1", + "revisions", + "1" + ] + } }, "response": [] }, { "name": "Create form", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", "method": "POST", "header": [ { @@ -4452,14 +5841,28 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Create for no exist key", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/no-exist-2222key36/versions/1/revisions", "method": "POST", "header": [ { @@ -4473,14 +5876,28 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/no-exist-2222key36/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "no-exist-2222key36", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Delete revision", "request": { - "url": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", "method": "DELETE", "header": [ { @@ -4494,7 +5911,23 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/form/dev/versions/1/revisions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "form", + "dev", + "versions", + "1", + "revisions", + "1" + ] + } }, "response": [] } @@ -4502,54 +5935,76 @@ }, { "name": "Price Config Version", - "description": "", "item": [ { "name": "List price configs", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions" + ] + } }, "response": [] }, { "name": "Get a particular version", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions", + "1" + ] + } }, "response": [] }, { "name": "Get latest version", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev" + ] + } }, "response": [] }, { "name": "Create priceConfig", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", "method": "POST", "header": [ { @@ -4563,14 +6018,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions" + ] + } }, "response": [] }, { "name": "Update priceConfig", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", "method": "PATCH", "header": [ { @@ -4584,14 +6051,27 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test111\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions", + "1" + ] + } }, "response": [] }, { "name": "Delete priceConfig", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", "method": "DELETE", "header": [ { @@ -4605,7 +6085,21 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions", + "1" + ] + } }, "response": [] } @@ -4613,40 +6107,59 @@ }, { "name": "Price Config Revision", - "description": "", "item": [ { "name": "List all revision for version", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/3/revisions", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/3/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions", + "3", + "revisions" + ] + } }, "response": [] }, { "name": "Get a particular revision", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions", + "1", + "revisions", + "1" + ] + } }, "response": [] }, { "name": "Create price config", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions", "method": "POST", "header": [ { @@ -4660,14 +6173,28 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Create for no exist key", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/no-exist-key/versions/1/revisions", "method": "POST", "header": [ { @@ -4681,14 +6208,28 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/no-exist-key/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "no-exist-key", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Delete revision", "request": { - "url": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", "method": "DELETE", "header": [ { @@ -4702,7 +6243,23 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/priceConfig/dev/versions/1/revisions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "priceConfig", + "dev", + "versions", + "1", + "revisions", + "1" + ] + } }, "response": [] } @@ -4710,54 +6267,76 @@ }, { "name": "Plan Config Version", - "description": "", "item": [ { "name": "List plan configs", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions" + ] + } }, "response": [] }, { "name": "Get a particular version", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/3", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/3", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions", + "3" + ] + } }, "response": [] }, { "name": "Get latest version", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev" + ] + } }, "response": [] }, { "name": "Create plan config", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", "method": "POST", "header": [ { @@ -4771,14 +6350,26 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions" + ] + } }, "response": [] }, { "name": "Update plan config", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", "method": "PATCH", "header": [ { @@ -4792,14 +6383,27 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test111\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions", + "1" + ] + } }, "response": [] }, { "name": "Delete plan config", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", "method": "DELETE", "header": [ { @@ -4813,7 +6417,21 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions", + "1" + ] + } }, "response": [] } @@ -4821,40 +6439,59 @@ }, { "name": "Plan Config Revision", - "description": "", "item": [ { "name": "List all revision for version", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Get a particular revision", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", "method": "GET", "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions", + "1", + "revisions", + "1" + ] + } }, "response": [] }, { "name": "Create plan config", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", "method": "POST", "header": [ { @@ -4868,14 +6505,28 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Create for no exist key", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/no-exist-key/versions/1/revisions", "method": "POST", "header": [ { @@ -4889,14 +6540,28 @@ "mode": "raw", "raw": "{\r\n \"param\":{\r\n \t\"config\": {\r\n \t\t\"hello\": \"test\"\r\n \t}\r\n }\r\n}" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/no-exist-key/versions/1/revisions", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "no-exist-key", + "versions", + "1", + "revisions" + ] + } }, "response": [] }, { "name": "Delete revision", "request": { - "url": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", "method": "DELETE", "header": [ { @@ -4910,7 +6575,23 @@ "mode": "raw", "raw": "" }, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/metadata/planConfig/dev/versions/1/revisions/1", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "metadata", + "planConfig", + "dev", + "versions", + "1", + "revisions", + "1" + ] + } }, "response": [] } @@ -4918,22 +6599,31 @@ }, { "name": "Project Estimation Item", - "description": "", "item": [ { "name": "List Project estimation items", "request": { - "url": "{{api-url}}/v4/projects/1/estimations/1/items", "method": "GET", "header": [ { "key": "Authorization", - "value": "Bearer {{jwt-token-admin-40051333}}", - "description": "" + "value": "Bearer {{jwt-token-admin-40051333}}" } ], - "body": {}, - "description": "" + "url": { + "raw": "{{api-url}}/v4/projects/1/estimations/1/items", + "host": [ + "{{api-url}}" + ], + "path": [ + "v4", + "projects", + "1", + "estimations", + "1", + "items" + ] + } }, "response": [] } From eda13da013beb478bee3ac0eb84a5fed2aad0565 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Thu, 15 Aug 2019 16:03:45 +0800 Subject: [PATCH 10/16] make logic of filtering Project Estimation Items more general. Cleaned out code and added warning comments. --- src/constants.js | 10 ----- src/models/projectEstimationItem.js | 62 +++++++++++++++++++++-------- src/permissions/index.js | 2 +- src/util.js | 2 +- 4 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/constants.js b/src/constants.js index 0b22dc79..cb026766 100644 --- a/src/constants.js +++ b/src/constants.js @@ -238,13 +238,3 @@ export const VALUE_TYPE = { STRING: 'string', PERCENTAGE: 'percentage', }; - -export const ADMIN_ESTIMATION_ITEM_TYPES = [ - ESTIMATION_TYPE.FEE, - ESTIMATION_TYPE.COMMUNITY, - ESTIMATION_TYPE.TOPCODER_SERVICE, -]; - -export const COPILOT_ESTIMATION_ITEM_TYPES = [ - ESTIMATION_TYPE.COMMUNITY, -]; diff --git a/src/models/projectEstimationItem.js b/src/models/projectEstimationItem.js index 21013905..8f9261ce 100644 --- a/src/models/projectEstimationItem.js +++ b/src/models/projectEstimationItem.js @@ -1,13 +1,42 @@ +/** + * Project Estimation Item model + * + * WARNING: This model contains sensitive data! + * + * - To return data from this model to the user always use methods `find`/`findAll` + * and provide to them `options.reqUser` and `options.members` to check what + * types of Project Estimation Items user which makes the request can get. + * - For internal usage you can use `options.includeAllProjectEstimatinoItemsForInternalUsage` + * which would force `find`/`findAll` to return all the records without checking permissions. + * Use the data returned in such way ONLY FOR INTERNAL usage. It means such data can be used + * to make some calculations inside Project Service but it should be never returned to the user as it is. + */ import _ from 'lodash'; import util from '../util'; import { ESTIMATION_TYPE, MANAGER_ROLES, PROJECT_MEMBER_ROLE, - ADMIN_ESTIMATION_ITEM_TYPES, - COPILOT_ESTIMATION_ITEM_TYPES, } from '../constants'; +/* + This config defines which Project Estimation Item `types` users can get + based on their permissions + */ +const permissionsConfigs = [ + // Topcoder managers can get all types of Project Estimation Items + { + permission: { topcoderRoles: MANAGER_ROLES }, + types: _.values(ESTIMATION_TYPE), + }, + + // Project Copilots can get only 'community' type of Project Estimation Items + { + permission: { projectRoles: PROJECT_MEMBER_ROLE.COPILOT }, + types: [ESTIMATION_TYPE.COMMUNITY], + }, +]; + module.exports = function defineProjectHistory(sequelize, DataTypes) { const ProjectEstimationItem = sequelize.define( 'ProjectEstimationItem', @@ -41,29 +70,28 @@ module.exports = function defineProjectHistory(sequelize, DataTypes) { indexes: [], hooks: { beforeFind: (options, callback) => { + // ONLY FOR INTERNAL USAGE: don't use this option to return the data by API if (options.includeAllProjectEstimatinoItemsForInternalUsage) { callback(null); } - /* eslint-disable no-param-reassign */ if (!options.reqUser || !options.members) { callback(new Error( 'You must provide auth user and project members to get project estimation items')); - } else if (util.hasPermission({ topcoderRoles: MANAGER_ROLES }, options.reqUser, options.members)) { - // do nothing. admins can see every field. - options.where.type = ADMIN_ESTIMATION_ITEM_TYPES; - callback(null); - } else if (util.hasPermission( - { projectRoles: PROJECT_MEMBER_ROLE.COPILOT }, - options.reqUser, - options.members)) { - options.where.type = COPILOT_ESTIMATION_ITEM_TYPES; - callback(null); - } else { - options.where.type = { $eq: null }; - callback(null); } - /* eslint-enable no-param-reassign */ + + // find all project estimation item types which are allowed to be returned to the user + let allowedTypes = []; + permissionsConfigs.forEach((permissionsConfig) => { + if (util.hasPermission(permissionsConfig.permission, options.reqUser, options.members)) { + allowedTypes = _.concat(allowedTypes, permissionsConfig.types); + } + }); + allowedTypes = _.uniq(allowedTypes); + + // only return Project Estimation Types which are allowed to the user + options.where.type = allowedTypes; // eslint-disable-line no-param-reassign + callback(null); }, }, classMethods: { diff --git a/src/permissions/index.js b/src/permissions/index.js index b1e91ed8..b881f4a6 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -125,6 +125,6 @@ module.exports = () => { Authorizer.setPolicy('projectSetting.delete', connectManagerOrAdmin); Authorizer.setPolicy('projectSetting.view', projectView); - // Poroject Estimation Items + // Project Estimation Items Authorizer.setPolicy('projectEstimation.item.list', copilotAndAbove); }; diff --git a/src/util.js b/src/util.js index c01ef232..8e2507f5 100644 --- a/src/util.js +++ b/src/util.js @@ -102,7 +102,7 @@ _.assignIn(util, { calculateProjectEstimationItems: (req, projectId) => // delete ALL existent ProjectEstimationItems for the project models.ProjectEstimationItem.deleteAllForProject(models, projectId, req.authUser, { - includeAllProjectEstimatinoItemsForInternalUsage: true, + includeAllProjectEstimatinoItemsForInternalUsage: true, }) // retrieve ProjectSettings and ProjectEstimations From 02bc7b0b41b700b106cf602f4c8f876c95070a3c Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Thu, 15 Aug 2019 19:07:53 +0800 Subject: [PATCH 11/16] use the solution from the second place submitter to take care about performance when retrieving ProjectSettings and checking their permissions added warning comments --- src/models/buildingBlock.js | 25 +++++- src/models/projectEstimationItem.js | 16 +++- src/models/projectSetting.js | 103 +++++++++++++------------ src/permissions/index.js | 4 +- src/permissions/projectSetting.edit.js | 40 ++++++++++ src/permissions/projectSetting.js | 47 ----------- src/routes/index.js | 2 +- src/routes/projectSettings/delete.js | 2 +- src/routes/projectSettings/list.js | 33 ++++---- src/routes/projectSettings/update.js | 2 +- 10 files changed, 150 insertions(+), 124 deletions(-) create mode 100644 src/permissions/projectSetting.edit.js delete mode 100644 src/permissions/projectSetting.js diff --git a/src/models/buildingBlock.js b/src/models/buildingBlock.js index e39e229d..abf160b9 100644 --- a/src/models/buildingBlock.js +++ b/src/models/buildingBlock.js @@ -1,7 +1,15 @@ /* eslint-disable valid-jsdoc */ - /** - * The Building block model + * BuildingBlock model + * + * WARNING: This model contains sensitive data! + * + * - To return data from this model to the user always use methods `find`/`findAll` which would + * filter out the sensitive data which should be never returned to the user. + * - For internal usage you can use `options.includePrivateConfigForInternalUsage` + * which would force `find`/`findAll` to return fields which contain sensitive data. + * Use the data returned in such way ONLY FOR INTERNAL usage. It means such data can be used + * to make some calculations inside Project Service but it should be never returned to the user as it is. */ module.exports = (sequelize, DataTypes) => { const BuildingBlock = sequelize.define('BuildingBlock', { @@ -23,7 +31,16 @@ module.exports = (sequelize, DataTypes) => { createdAt: 'createdAt', deletedAt: 'deletedAt', hooks: { - beforeFind: (options) => { + /** + * Inside before hook we are evaluating if user has permission to retrieve `privateConfig` field. + * If no, we remove this field from the attributes list, so this field is not requested and thus + * not returned. + * + * @param {Object} options find/findAll options + * @param {Function} callback callback after hook + */ + beforeFind: (options, callback) => { + // ONLY FOR INTERNAL USAGE: don't use this option to return the data by API if (!options.includePrivateConfigForInternalUsage) { // try to remove privateConfig from attributes const idx = options.attributes.indexOf('privateConfig'); @@ -31,6 +48,8 @@ module.exports = (sequelize, DataTypes) => { options.attributes.splice(idx, 1); } } + + return callback(null); }, }, }); diff --git a/src/models/projectEstimationItem.js b/src/models/projectEstimationItem.js index 8f9261ce..6219cd6c 100644 --- a/src/models/projectEstimationItem.js +++ b/src/models/projectEstimationItem.js @@ -1,5 +1,6 @@ +/* eslint-disable valid-jsdoc */ /** - * Project Estimation Item model + * ProjectEstimationItem model * * WARNING: This model contains sensitive data! * @@ -69,14 +70,21 @@ module.exports = function defineProjectHistory(sequelize, DataTypes) { createdAt: 'createdAt', indexes: [], hooks: { + /** + * Inside before hook we are evaluating what Project Estimation Item types current user may retrieve. + * We update `where` query so only allowed types may be retrieved. + * + * @param {Object} options find/findAll options + * @param {Function} callback callback after hook + */ beforeFind: (options, callback) => { // ONLY FOR INTERNAL USAGE: don't use this option to return the data by API if (options.includeAllProjectEstimatinoItemsForInternalUsage) { - callback(null); + return callback(null); } if (!options.reqUser || !options.members) { - callback(new Error( + return callback(new Error( 'You must provide auth user and project members to get project estimation items')); } @@ -91,7 +99,7 @@ module.exports = function defineProjectHistory(sequelize, DataTypes) { // only return Project Estimation Types which are allowed to the user options.where.type = allowedTypes; // eslint-disable-line no-param-reassign - callback(null); + return callback(null); }, }, classMethods: { diff --git a/src/models/projectSetting.js b/src/models/projectSetting.js index cb233050..f0437cc3 100644 --- a/src/models/projectSetting.js +++ b/src/models/projectSetting.js @@ -1,39 +1,22 @@ /* eslint-disable valid-jsdoc */ +/** + * ProjectSetting model + * + * WARNING: This model contains sensitive data! + * + * - To return data from this model to the user always use methods `find`/`findAll` + * and provide to them `options.reqUser` and `options.members` to check which records could be returned + * based on the user roles and `readPermission` property of the records. + * - For internal usage you can use `options.includeAllProjectSettingsForInternalUsage` + * which would force `find`/`findAll` to return all the records without checking permissions. + * Use the data returned in such way ONLY FOR INTERNAL usage. It means such data can be used + * to make some calculations inside Project Service but it should be never returned to the user as it is. + */ import _ from 'lodash'; import { VALUE_TYPE } from '../constants'; import util from '../util'; -const populateSetting = (settings, options) => { - if (Array.isArray(settings)) { - const promises = []; - _.each(settings, (setting) => { - promises.push(util.hasPermissionForProject(setting.readPermission, options.reqUser, options.projectId) - .then((r) => { - if (!r) { - _.remove(settings, { - id: setting.id, - }); - } - })); - }); - - return Promise.all(promises); - } - - return util.hasPermissionForProject(settings.readPermission, options.reqUser, options.projectId) - .then((r) => { - if (!r) { - _.map(settings, (s) => { - if (Object.prototype.hasOwnProperty.call(settings, s)) { - delete settings[s]; // eslint-disable-line no-param-reassign - } - }); - } - }); -}; - - module.exports = (sequelize, DataTypes) => { const ProjectSetting = sequelize.define( 'ProjectSetting', @@ -54,7 +37,7 @@ module.exports = (sequelize, DataTypes) => { deletedAt: { type: DataTypes.DATE, allowNull: true }, createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, updatedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, - deletedBy: DataTypes.BIGINT, + deletedBy: DataTypes.INTEGER, createdBy: { type: DataTypes.INTEGER, allowNull: false }, updatedBy: { type: DataTypes.INTEGER, allowNull: false }, }, @@ -71,31 +54,55 @@ module.exports = (sequelize, DataTypes) => { }, ], hooks: { - beforeFind: (options) => { - _.assign(options, { projectId: options.where.projectId }); + /** + * Inside before hook we are checking that required options are provided + * We do it in `beforeFind` instead of `afterFind` to avoid unnecessary data retrievement + * + * @param {Object} options find/findAll options + * @param {Function} callback callback after hook + */ + beforeFind: (options, callback) => { + // ONLY FOR INTERNAL USAGE: don't use this option to return the data by API if (options.includeAllProjectSettingsForInternalUsage) { - return { where: options.where, attributes: options.attributes }; + return callback(null); } - if (!options.reqUser) { - throw new Error('reqUser not found'); + if (!options.reqUser || !options.members) { + return callback(new Error('You must provide reqUser and project member to get project settings')); } - // Check permissions - return { - reqUser: options.reqUser, - where: options.where, - attributes: options.attributes, - }; + + return callback(null); }, - afterFind: (settings, options) => { - if (!settings) return Promise.resolve(); - if (options.reqUser) { - return populateSetting(settings, options); + /** + * Inside after hook we are filtering records based on `readPermission` and user roles + * + * @param {Mixed} results one result from `find()` or array of results form `findAll()` + * @param {Object} options find/findAll options + * @param {Function} callback callback after hook + */ + afterFind: (results, options, callback) => { + // ONLY FOR INTERNAL USAGE: don't use this option to return the data by API + if (options.includeAllProjectSettingsForInternalUsage) { + return callback(null); } - return settings; - }, + // if we have an array of results form `findAll()` we are filtering results + if (_.isArray(results)) { + // remove results from the "end" using `index` if user doesn't have permissions for to access them + for (let index = results.length - 1; index >= 0; index -= 1) { + if (!util.hasPermission(results[index].readPermission, options.reqUser, options.members)) { + results.splice(index, 1); + } + } + + // if we have one result from `find()` we check if user has permission for the record + } else if (results && !util.hasPermission(results.readPermission, options.reqUser, options.members)) { + return callback(new Error('User doesn\'t have permission to access this record.')); + } + + return callback(null); + }, }, }, ); diff --git a/src/permissions/index.js b/src/permissions/index.js index b881f4a6..cf30bd01 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -11,7 +11,7 @@ const projectAttachmentDownload = require('./project.downloadAttachment'); const connectManagerOrAdmin = require('./connectManagerOrAdmin.ops'); const copilotAndAbove = require('./copilotAndAbove'); const workManagementPermissions = require('./workManagementForTemplate'); -const projectSettings = require('./projectSetting'); +const projectSettingEdit = require('./projectSetting.edit'); module.exports = () => { Authorizer.setDeniedStatusCode(403); @@ -121,7 +121,7 @@ module.exports = () => { // Project Settings Authorizer.setPolicy('projectSetting.create', connectManagerOrAdmin); - Authorizer.setPolicy('projectSetting.edit', projectSettings); + Authorizer.setPolicy('projectSetting.edit', projectSettingEdit); Authorizer.setPolicy('projectSetting.delete', connectManagerOrAdmin); Authorizer.setPolicy('projectSetting.view', projectView); diff --git a/src/permissions/projectSetting.edit.js b/src/permissions/projectSetting.edit.js new file mode 100644 index 00000000..e75a2855 --- /dev/null +++ b/src/permissions/projectSetting.edit.js @@ -0,0 +1,40 @@ +import util from '../util'; +import models from '../models'; + +/** + * Only users who have "writePermission" of ProjectSetting can edit this entity. + * @param {Object} freq the express request instance + * @return {Promise} Returns a promise + */ +module.exports = freq => new Promise((resolve, reject) => { + const projectId = freq.params.projectId; + const settingId = freq.params.id; + let projectMembers = []; + + return models.ProjectMember.getActiveProjectMembers(projectId) + .then((members) => { + const req = freq; + req.context = req.context || {}; + req.context.currentProjectMembers = members; + + projectMembers = members; + return Promise.resolve(); + }) + .then(() => models.ProjectSetting.find({ + where: { projectId, id: settingId }, + raw: true, + includeAllProjectSettingsForInternalUsage: true, + }).then((setting) => { + if (!setting) { + // let route handle this 404 error. + return resolve(true); + } + const hasAccess = util.hasPermission(setting.writePermission, freq.authUser, projectMembers); + if (!hasAccess) { + const errorMessage = 'You do not have permissions to perform this action'; + // user is not an admin nor is a registered project member + return reject(new Error(errorMessage)); + } + return resolve(true); + })); +}); diff --git a/src/permissions/projectSetting.js b/src/permissions/projectSetting.js deleted file mode 100644 index 99b9f911..00000000 --- a/src/permissions/projectSetting.js +++ /dev/null @@ -1,47 +0,0 @@ - -import _ from 'lodash'; -import util from '../util'; -import models from '../models'; - -/** - * Allow/Deny based on projectSetting writePermission - * @param {Object} req the request - * @return {Promise} Returns a promise - */ -module.exports = req => new Promise((resolve, reject) => { - const projectId = _.parseInt(req.params.projectId); - const id = _.parseInt(req.params.id); - - return models.Project.findOne({ - where: { - id: projectId, - }, - }) - .then((project) => { - if (!project) { - return resolve(true); - } - - return models.ProjectSetting.findOne({ - includeAllProjectSettingsForInternalUsage: true, - where: { - projectId, - id, - }, - }); - }) - .then((setting) => { - if (!setting) { - return resolve(true); - } - - return util.hasPermissionForProject(setting.writePermission, req.authUser, projectId); - }) - .then((hasAccess) => { - if (!hasAccess) { - const errorMessage = 'You do not have permissions to perform this action'; - return reject(new Error(errorMessage)); - } - return resolve(true); - }); -}); diff --git a/src/routes/index.js b/src/routes/index.js index 64ef459b..2937abe9 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -322,7 +322,7 @@ router.route('/v4/projects/:projectId(\\d+)/settings') .post(require('./projectSettings/create')); // Project Estimation Items -router.route('/v4/projects/:projectId/estimations/:estimationId/items') +router.route('/v4/projects/:projectId(\\d+)/estimations/:estimationId(\\d+)/items') .get(require('./projectEstimationItems/list')); // register error handler diff --git a/src/routes/projectSettings/delete.js b/src/routes/projectSettings/delete.js index 01d57200..aa85f493 100644 --- a/src/routes/projectSettings/delete.js +++ b/src/routes/projectSettings/delete.js @@ -26,7 +26,7 @@ module.exports = [ models.sequelize.transaction(() => models.ProjectSetting.findOne({ - reqUser: req.authUser, + includeAllProjectSettingsForInternalUsage: true, where: { id, projectId, diff --git a/src/routes/projectSettings/list.js b/src/routes/projectSettings/list.js index 8a79acdb..1668178f 100644 --- a/src/routes/projectSettings/list.js +++ b/src/routes/projectSettings/list.js @@ -27,26 +27,25 @@ module.exports = [ }, attributes: { exclude: ['deletedAt', 'deletedBy'] }, raw: true, + // provide current user and project members list so `ProjectSetting.findAll` will return + // only records available to view by the current user reqUser: req.authUser, + members: req.context.currentProjectMembers, }; - models.Project.count({ - where: { - id: projectId, - }, - }) - .then((countProject) => { - if (countProject === 0) { - const apiErr = new Error(`active project not found for project id ${projectId}`); - apiErr.status = 404; - throw apiErr; - } + models.Project.findOne({ where: { id: projectId } }) + .then((project) => { + if (!project) { + const apiErr = new Error(`Project not found for id ${projectId}`); + apiErr.status = 404; + return Promise.reject(apiErr); + } - return models.ProjectSetting.findAll(options); - }) - .then((result) => { - res.json(util.wrapResponse(req.id, _.filter(result, r => r))); - }) - .catch(next); + return models.ProjectSetting.findAll(options); + }) + .then((result) => { + res.json(util.wrapResponse(req.id, _.filter(result, r => r))); + }) + .catch(next); }, ]; diff --git a/src/routes/projectSettings/update.js b/src/routes/projectSettings/update.js index 5c077a6c..df9504c4 100644 --- a/src/routes/projectSettings/update.js +++ b/src/routes/projectSettings/update.js @@ -42,7 +42,7 @@ module.exports = [ models.sequelize.transaction(() => models.ProjectSetting.findOne({ - reqUser: req.authUser, + includeAllProjectSettingsForInternalUsage: true, where: { id, projectId, From f67092bc6a5d46d2b09d2f8049399d7cb7785691 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 23 Aug 2019 13:56:49 +0800 Subject: [PATCH 12/16] fix: more realistic condition for demo/test building block --- local/seed/seedProjects.js | 2 +- src/routes/projectSettings/create.spec.js | 2 +- src/routes/projectSettings/update.spec.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/local/seed/seedProjects.js b/local/seed/seedProjects.js index 3c0f2aa0..4138296d 100644 --- a/local/seed/seedProjects.js +++ b/local/seed/seedProjects.js @@ -58,7 +58,7 @@ module.exports = (targetUrl, token) => { await models.ProjectEstimation.create({ projectId, buildingBlockKey: 'BLOCK_KEY', - conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || CA_NEEDED)', + conditions: '( HAS_DEV_DELIVERABLE && ONLY_ONE_OS_MOBILE && CA_NEEDED )', price: 6500.50, quantity: 10, minTime: 35, diff --git a/src/routes/projectSettings/create.spec.js b/src/routes/projectSettings/create.spec.js index 1b47bb43..1e9a70de 100644 --- a/src/routes/projectSettings/create.spec.js +++ b/src/routes/projectSettings/create.spec.js @@ -91,7 +91,7 @@ describe('CREATE Project Setting', () => { const estimation = { buildingBlockKey: 'BLOCK_KEY', - conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || CA_NEEDED)', + conditions: '( HAS_DEV_DELIVERABLE && ONLY_ONE_OS_MOBILE && CA_NEEDED )', price: 5000, quantity: 10, minTime: 35, diff --git a/src/routes/projectSettings/update.spec.js b/src/routes/projectSettings/update.spec.js index d4b9d67b..0c477e0d 100644 --- a/src/routes/projectSettings/update.spec.js +++ b/src/routes/projectSettings/update.spec.js @@ -120,7 +120,7 @@ describe('UPDATE Project Setting', () => { const estimation = { buildingBlockKey: 'BLOCK_KEY', - conditions: '( HAS_DEV_DELIVERABLE && (ONLY_ONE_OS_MOBILE || CA_NEEDED)', + conditions: '( HAS_DEV_DELIVERABLE && ONLY_ONE_OS_MOBILE && CA_NEEDED )', price: 6500.50, quantity: 10, minTime: 35, From 1a23721390cbff1b1b1aac57fa8af088f2237eae Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 23 Aug 2019 13:57:23 +0800 Subject: [PATCH 13/16] fix: remove unnecessary ESTIMATION_TYPE.REFERENCE_PROGRAM --- src/constants.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/constants.js b/src/constants.js index cb026766..129a83d3 100644 --- a/src/constants.js +++ b/src/constants.js @@ -229,7 +229,6 @@ export const ESTIMATION_TYPE = { FEE: 'fee', COMMUNITY: 'community', TOPCODER_SERVICE: 'topcoder_service', - REFERENCE_PROGRAM: 'reference_program', }; export const VALUE_TYPE = { From eaaaef0602728e07901f6f144cea2a91f8a6fc4c Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 23 Aug 2019 13:59:44 +0800 Subject: [PATCH 14/16] refactor: correct name for model creating method defineProjectEstimationItem --- src/models/projectEstimationItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/projectEstimationItem.js b/src/models/projectEstimationItem.js index 6219cd6c..245333ec 100644 --- a/src/models/projectEstimationItem.js +++ b/src/models/projectEstimationItem.js @@ -38,7 +38,7 @@ const permissionsConfigs = [ }, ]; -module.exports = function defineProjectHistory(sequelize, DataTypes) { +module.exports = function defineProjectEstimationItem(sequelize, DataTypes) { const ProjectEstimationItem = sequelize.define( 'ProjectEstimationItem', { From adec0ce35262d6634bdfc35f9eb5096a3af8ac12 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 23 Aug 2019 15:07:37 +0800 Subject: [PATCH 15/16] refactor: enhance unit test description --- src/routes/projectEstimationItems/list.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/projectEstimationItems/list.spec.js b/src/routes/projectEstimationItems/list.spec.js index 20846cf6..11f8a942 100644 --- a/src/routes/projectEstimationItems/list.spec.js +++ b/src/routes/projectEstimationItems/list.spec.js @@ -204,7 +204,7 @@ describe('GET project estimation items', () => { }); }); - it('should return 0 project estimation items for non-admin but project manager', (done) => { + it('should return 0 project estimation items for a project manager who is not a topcoder manager', (done) => { request(server) .get(url) .set({ From 70d70d8802a76b704e606caf93a0e4a910ace34e Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 23 Aug 2019 15:53:17 +0800 Subject: [PATCH 16/16] fix: lint --- src/permissions/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/permissions/index.js b/src/permissions/index.js index 88d86275..aedba45e 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -127,13 +127,13 @@ module.exports = () => { // Project Permissions Authorizer.setPolicy('permissions.view', projectView); - + // Project Settings Authorizer.setPolicy('projectSetting.create', connectManagerOrAdmin); Authorizer.setPolicy('projectSetting.edit', projectSettingEdit); Authorizer.setPolicy('projectSetting.delete', connectManagerOrAdmin); Authorizer.setPolicy('projectSetting.view', projectView); - + // Project Estimation Items Authorizer.setPolicy('projectEstimation.item.list', copilotAndAbove); };