diff --git a/README.md b/README.md index 4c1df143..e296a80a 100644 --- a/README.md +++ b/README.md @@ -141,10 +141,15 @@ | `npm run start` | Start app in the production mode from prebuilt `dist` folder. | | `npm run dev` | Start app in the development mode using `nodemon`. | | `npm run test` | Run tests. | -| `npm run test-data` | Clears and imports Data into ES. | | `npm run init-db` | Initializes Database. | -| `npm run create-index` | Create Elasticsearch indexes. | -| `npm run delete-index` | Delete Elasticsearch indexes. | +| `npm run create-index` | Create Elasticsearch indexes. Use `-- --force` flag to skip confirmation | +| `npm run delete-index` | Delete Elasticsearch indexes. Use `-- --force` flag to skip confirmation | +| `npm run data:import ` | Imports data into ES and db from filePath (`./data/demo-data.json` is used as default). Use `-- --force` flag to skip confirmation | +| `npm run data:export ` | Exports data from ES and db into filePath (`./data/demo-data.json` is used as default). Use `-- --force` flag to skip confirmation | +| `npm run index:all` | Indexes all data from db into ES. Use `-- --force` flag to skip confirmation| +| `npm run index:jobs ` | Indexes job data from db into ES, if jobId is not given all data is indexed. Use `-- --force` flag to skip confirmation | +| `npm run index:job-candidates ` | Indexes job candidate data from db into ES, if jobCandidateId is not given all data is indexed. Use `-- --force` flag to skip confirmation | +| `npm run index:resource-bookings ` | Indexes resource bookings data from db into ES, if resourceBookingsId is not given all data is indexed. Use `-- --force` flag to skip confirmation | | `npm run services:up` | Start services via docker-compose for local development. | | `npm run services:down` | Stop services via docker-compose for local development. | | `npm run services:logs -- -f ` | View logs of some service inside docker-compose. | diff --git a/config/default.js b/config/default.js index e729d62b..afda7a7b 100644 --- a/config/default.js +++ b/config/default.js @@ -47,6 +47,9 @@ module.exports = { // the project service url PROJECT_API_URL: process.env.PROJECT_API_URL || 'https://api.topcoder-dev.com', + // the default path for importing and exporting data + DEFAULT_DATA_FILE_PATH: './data/demo-data.json', + esConfig: { // the elasticsearch host HOST: process.env.ES_HOST || 'http://localhost:9200', @@ -68,7 +71,12 @@ module.exports = { // the job candidate index ES_INDEX_JOB_CANDIDATE: process.env.ES_INDEX_JOB_CANDIDATE || 'job_candidate', // the resource booking index - ES_INDEX_RESOURCE_BOOKING: process.env.ES_INDEX_RESOURCE_BOOKING || 'resource_booking' + ES_INDEX_RESOURCE_BOOKING: process.env.ES_INDEX_RESOURCE_BOOKING || 'resource_booking', + + // the max bulk size in MB for ES indexing + MAX_BULK_REQUEST_SIZE_MB: process.env.MAX_BULK_REQUEST_SIZE_MB || 20, + // the max number of documents per bulk for ES indexing + MAX_BULK_NUM_DOCUMENTS: process.env.MAX_BULK_NUM_DOCUMENTS || 100 }, // Topcoder Bus API URL diff --git a/data/demo-data.json b/data/demo-data.json new file mode 100644 index 00000000..6c8872b4 --- /dev/null +++ b/data/demo-data.json @@ -0,0 +1 @@ +{"Job":[{"id":"b9887564-3d3d-4c70-8a7b-552576ef2e8d","projectId":111,"externalId":"0","description":"taas-demo-job1","title":"Demo Title","startDate":"2020-09-27T04:17:23.131Z","endDate":"2020-09-27T04:17:23.131Z","numPositions":13,"resourceType":"Dummy Resource Type","rateType":"weekly","workload":"full-time","skills":["ee4c50c1-c8c3-475e-b6b6-edbd136a19d6","89139c80-d0a2-47c2-aa16-14589d5afd10","9f2d9127-6a2e-4506-ad76-c4ab63577b09","9515e7ee-83b6-49d1-ba5c-6c59c5a8ef1b","c854ab55-5922-4be1-8ecc-b3bc1f8629af","8456002e-fa2d-44f0-b0e7-86b1c02b6e4c","114b4ec8-805e-4c60-b351-14a955a991a9","213408aa-f16f-46c8-bc57-9e569cee3f11","b37a48db-f775-4e4e-b403-8ad1d234cdea","99b930b5-1b91-4df1-8b17-d9307107bb51","6388a632-c3ad-4525-9a73-66a527c03672","23839f38-6f19-4de9-9d28-f020056bca73","289e42a3-23e9-49be-88e1-6deb93cd8c31","b403f209-63b5-42bc-9b5f-1564416640d8"],"status":"sourcing","createdAt":"2021-01-28T19:36:33.409Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","projectId":111,"externalId":"0","description":"taas-demo-job2","title":"Dummy title - at most 64 characters","startDate":"2020-09-27T04:17:23.131Z","endDate":"2020-09-27T04:17:23.131Z","numPositions":7,"resourceType":"Dummy Resource Type","rateType":"weekly","workload":"full-time","skills":["213408aa-f16f-46c8-bc57-9e569cee3f11","b37a48db-f775-4e4e-b403-8ad1d234cdea","99b930b5-1b91-4df1-8b17-d9307107bb51","6388a632-c3ad-4525-9a73-66a527c03672","23839f38-6f19-4de9-9d28-f020056bca73","289e42a3-23e9-49be-88e1-6deb93cd8c31","b403f209-63b5-42bc-9b5f-1564416640d8"],"status":"in-review","createdAt":"2021-01-28T19:36:44.975Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:38:17.463Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","projectId":111,"externalId":"0","description":"taas-demo-job3","title":"Dummy title - at most 64 characters","startDate":"2020-09-27T04:17:23.131Z","endDate":"2020-09-27T04:17:23.131Z","numPositions":7,"resourceType":"Dummy Resource Type","rateType":"weekly","workload":"full-time","skills":[],"status":"assigned","createdAt":"2021-01-28T19:38:23.739Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:41:10.607Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"84b73f90-0fef-4507-887a-074578e5ef38","projectId":111,"externalId":"0","description":"taas-demo-job4","title":"Dummy title - at most 64 characters","startDate":"2020-09-27T04:17:23.131Z","endDate":"2020-09-27T04:17:23.131Z","numPositions":7,"resourceType":"Dummy Resource Type","rateType":"weekly","workload":"full-time","skills":["8456002e-fa2d-44f0-b0e7-86b1c02b6e4c","114b4ec8-805e-4c60-b351-14a955a991a9","213408aa-f16f-46c8-bc57-9e569cee3f11","b37a48db-f775-4e4e-b403-8ad1d234cdea","99b930b5-1b91-4df1-8b17-d9307107bb51","6388a632-c3ad-4525-9a73-66a527c03672"],"status":"closed","createdAt":"2021-01-28T19:41:21.892Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:41:28.849Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"62399aa0-b088-41fe-9e9b-0c8071f1934f","projectId":111,"externalId":"0","description":"taas-demo-job5","title":"Dummy title - at most 64 characters","startDate":"2020-09-27T04:17:23.131Z","endDate":"2020-09-27T04:17:23.131Z","numPositions":7,"resourceType":"Dummy Resource Type","rateType":"weekly","workload":"full-time","skills":["b37a48db-f775-4e4e-b403-8ad1d234cdea","99b930b5-1b91-4df1-8b17-d9307107bb51","6388a632-c3ad-4525-9a73-66a527c03672"],"status":"cancelled","createdAt":"2021-01-28T19:41:35.098Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:41:42.124Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"}],"JobCandidate":[{"id":"debadcd8-64bf-4ab8-9cdb-297479eef6f5","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"4dfc6090-4ba8-4387-b5c4-584fcef982ba","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:05.723Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"7ff45b8f-2b71-4510-b760-8dfa62e79504","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"243517dd-77d7-4f70-8951-0bc66da83076","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:11.598Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"91d63d5f-01d5-419e-89df-6117ea92f535","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"a2e28bf4-1147-41a6-a39f-e2509306f2a6","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:18.066Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"257f98d9-45f7-4e13-a6c2-d7e7b6efc9fe","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"b8649393-d32f-4b7f-a156-12e9776acb0e","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:24.095Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"a01852d0-fa08-410c-b97b-67580ce62215","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"a0a3a5ce-1de6-465d-91b2-518feb299851","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:29.734Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"2fd7ca69-c8ec-4bf3-a7f3-655fbfe3e7df","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"e6958d77-ffaf-4d24-9cdb-6391506695a4","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:44.728Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"f0023058-2996-4bba-8c5f-d09a7023be38","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"626bb327-e738-48e3-8f67-1fa2dc677d3c","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:50.619Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"a189b34d-acde-4633-b18b-f7a34d7c5a74","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"b49a0adb-1565-4de1-9189-a763c77f5ed4","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:37:56.456Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"5191a860-4327-4c50-b76b-84beba04519b","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"79ce2a3e-7679-48cf-8ac9-0a8ca4c4b463","status":"shortlist","externalId":null,"resume":null,"createdAt":"2021-01-28T19:36:51.222Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:38:02.293Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"e6d9635c-b122-4f69-9285-09fb1ab30106","jobId":"a5b3bf94-a8bf-4c7e-b685-70a29a4d7d6e","userId":"98ec2c16-442e-4b61-8ad1-66123ee37d3c","status":"rejected","externalId":null,"resume":null,"createdAt":"2021-01-28T19:36:58.774Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:38:13.553Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"f67b155e-0f09-4fdd-89a7-d79c5e46cac6","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"05e988b7-7d54-4c10-ada1-1a04870a88a8","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:38:38.332Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"8ffd33d3-4a43-4719-aee4-8e46be1d8f1c","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"a2ffdeed-704d-4cf7-b70a-93fcf61de598","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:38:43.967Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"2b8ba549-8878-43d6-ad5f-6a66e3b9d6c9","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"4709473d-f060-4102-87f8-4d51ff0b34c1","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:38:50.106Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"ae5a81ec-5d05-43c4-8253-847d91a54711","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"39c7376e-2d5c-4601-bc47-6b60f505814d","status":"open","externalId":null,"resume":null,"createdAt":"2021-01-28T19:38:55.734Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":null,"updatedBy":null},{"id":"85d6649e-2682-4904-9480-a77b72fef27d","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"213d2dd9-1fc3-4eda-ad97-2d56e2a84a1e","status":"selected","externalId":null,"resume":null,"createdAt":"2021-01-28T19:38:30.856Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:27.209Z","updatedBy":"00000000-0000-0000-0000-000000000000"},{"id":"922dfce3-4e06-4387-9fdb-64f70675e86b","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"dd5adacb-444d-4992-8b7b-0c349be598db","status":"selected","externalId":null,"resume":null,"createdAt":"2021-01-28T19:39:02.435Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:49.349Z","updatedBy":"00000000-0000-0000-0000-000000000000"},{"id":"c26c38e2-a47d-405b-abc6-fe62a739561c","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"6d0509c7-5f12-4d84-9a19-8e80ef7ddd66","status":"selected","externalId":null,"resume":null,"createdAt":"2021-01-28T19:39:08.233Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:53.659Z","updatedBy":"00000000-0000-0000-0000-000000000000"},{"id":"7bef2b37-e1ee-4638-bfc1-c911787ac955","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"f65e2104-2987-4136-839d-ee4632f0b2e5","status":"selected","externalId":null,"resume":null,"createdAt":"2021-01-28T19:39:13.469Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:57.999Z","updatedBy":"00000000-0000-0000-0000-000000000000"},{"id":"e9716139-1f40-4bf1-9f8a-77ae4bcc621e","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"e5e667ad-0950-43c2-8d1d-6e83ad7d1c7e","status":"selected","externalId":null,"resume":null,"createdAt":"2021-01-28T19:39:19.215Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:41:01.953Z","updatedBy":"00000000-0000-0000-0000-000000000000"},{"id":"a1731d01-eac9-4eff-8e5a-8a3c99bc66e0","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","userId":"bef43122-426b-4b2b-acdd-9b5b3bd1c0bf","status":"selected","externalId":null,"resume":null,"createdAt":"2021-01-28T19:39:24.625Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:41:06.370Z","updatedBy":"00000000-0000-0000-0000-000000000000"}],"ResourceBooking":[{"id":"08f5e4b9-1088-496d-91a7-5b22a3583e3c","projectId":111,"userId":"213d2dd9-1fc3-4eda-ad97-2d56e2a84a1e","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"assigned","startDate":"2021-01-25T19:39:28.000Z","endDate":"2021-01-31T19:39:28.000Z","memberRate":1000,"customerRate":1200,"rateType":"weekly","createdAt":"2021-01-28T19:39:30.052Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:25.260Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"7d967fed-9792-4768-98a7-0b644aa84f2e","projectId":111,"userId":"05e988b7-7d54-4c10-ada1-1a04870a88a8","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"in-review","startDate":"2021-01-25T19:39:34.000Z","endDate":"2021-01-31T19:39:34.000Z","memberRate":1000,"customerRate":1200,"rateType":"weekly","createdAt":"2021-01-28T19:39:35.571Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:30.291Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"35e1abd8-1890-4664-bb52-aade382d7b66","projectId":111,"userId":"a2ffdeed-704d-4cf7-b70a-93fcf61de598","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"closed","startDate":"2021-01-25T19:39:39.000Z","endDate":"2021-01-31T19:39:39.000Z","memberRate":1000,"customerRate":1200,"rateType":"weekly","createdAt":"2021-01-28T19:39:41.205Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:34.859Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"a098e8d8-ce5b-47d9-afee-38b050d16745","projectId":111,"userId":"4709473d-f060-4102-87f8-4d51ff0b34c1","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"cancelled","startDate":"2021-01-25T19:39:45.000Z","endDate":"2021-01-31T19:39:45.000Z","memberRate":1000,"customerRate":1200,"rateType":"weekly","createdAt":"2021-01-28T19:39:46.515Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:38.820Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"d38a6223-3f91-4300-9ecb-6e5fee173625","projectId":111,"userId":"39c7376e-2d5c-4601-bc47-6b60f505814d","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"sourcing","startDate":"2021-01-25T19:39:50.000Z","endDate":"2021-01-31T19:39:50.000Z","memberRate":1000,"customerRate":1200,"rateType":"weekly","createdAt":"2021-01-28T19:39:52.063Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:43.021Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"51b45f5d-5df2-46d5-9c3d-8a1323df38dd","projectId":111,"userId":"dd5adacb-444d-4992-8b7b-0c349be598db","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"assigned","startDate":"2021-01-25T19:39:58.000Z","endDate":"2021-01-31T19:39:58.000Z","memberRate":800,"customerRate":1000,"rateType":"weekly","createdAt":"2021-01-28T19:39:59.432Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:47.743Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"0a6799d7-f5d1-456b-8bf1-90619284b295","projectId":111,"userId":"6d0509c7-5f12-4d84-9a19-8e80ef7ddd66","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"assigned","startDate":"2021-01-25T19:40:03.000Z","endDate":"2021-01-31T19:40:03.000Z","memberRate":2000,"customerRate":2500,"rateType":"weekly","createdAt":"2021-01-28T19:40:04.761Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:52.303Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"61f5d474-e41f-490b-ab58-9f983e3d4916","projectId":111,"userId":"f65e2104-2987-4136-839d-ee4632f0b2e5","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"assigned","startDate":"2000-07-27T04:17:23.131Z","endDate":"2000-09-27T04:17:23.131Z","memberRate":3000,"customerRate":3500,"rateType":"weekly","createdAt":"2021-01-28T19:40:09.879Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:40:56.381Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"dc4477ec-07f8-4c8e-a8fe-ffe38dd290fa","projectId":111,"userId":"e5e667ad-0950-43c2-8d1d-6e83ad7d1c7e","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"assigned","startDate":"2022-07-27T04:17:23.131Z","endDate":"2022-09-27T04:17:23.131Z","memberRate":1700,"customerRate":1900,"rateType":"weekly","createdAt":"2021-01-28T19:40:15.326Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:41:00.503Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"},{"id":"8173579e-4b3c-418d-a9a1-c999caa38404","projectId":111,"userId":"bef43122-426b-4b2b-acdd-9b5b3bd1c0bf","jobId":"2d5e2a52-e0dd-4cd9-8f4c-7cffa43951d0","status":"assigned","startDate":"2020-09-27T04:17:23.131Z","endDate":"2020-09-27T04:17:23.131Z","memberRate":0,"customerRate":0,"rateType":"weekly","createdAt":"2021-01-28T19:40:20.627Z","createdBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c","updatedAt":"2021-01-28T19:41:04.919Z","updatedBy":"57646ff9-1cd3-4d3c-88ba-eb09a395366c"}]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 26e22f89..52f6a14f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "topcoder-bookings-api", + "name": "taas-apis", "version": "1.0.0", "lockfileVersion": 1, "requires": true, @@ -778,12 +778,116 @@ } } }, + "ansi-bgblack": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", + "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgblue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", + "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgcyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", + "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bggreen": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", + "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgmagenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", + "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgred": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", + "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgwhite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", + "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgyellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", + "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-black": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", + "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-blue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", + "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bold": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", + "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-dim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", + "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -799,11 +903,91 @@ } } }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-grey": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", + "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-hidden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", + "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-inverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", + "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-italic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", + "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-magenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", + "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, + "ansi-reset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", + "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-strikethrough": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", + "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -812,6 +996,35 @@ "color-convert": "^1.9.0" } }, + "ansi-underline": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", + "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-white": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", + "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "ansi-yellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", + "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -850,6 +1063,29 @@ "sprintf-js": "~1.0.2" } }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-swap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arr-swap/-/arr-swap-1.0.1.tgz", + "integrity": "sha1-FHWQ7WX8gVvAf+8Jl8Llgj1kNTQ=", + "requires": { + "is-number": "^3.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=", + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, "array-filter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", @@ -1311,6 +1547,16 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "choices-separator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/choices-separator/-/choices-separator-2.0.0.tgz", + "integrity": "sha1-kv0XYxgteQM/XFxR0Lo1LlVnxpY=", + "requires": { + "ansi-dim": "^0.1.1", + "debug": "^2.6.6", + "strip-color": "^0.1.0" + } + }, "chokidar": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", @@ -1416,6 +1662,24 @@ } } }, + "clone-deep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-1.0.0.tgz", + "integrity": "sha512-hmJRX8x1QOJVV+GUjOBzi6iauhPqc9hIF6xitWRBbiPZOBb6vGo/mDRIK9P74RTKSQK7AE8B0DDWY/vpRrPmQw==", + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^5.0.0", + "shallow-clone": "^1.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==" + } + } + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -1440,6 +1704,15 @@ } } }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", @@ -1590,6 +1863,11 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, "core-js": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", @@ -1751,6 +2029,14 @@ "object-keys": "^1.0.12" } }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, "deglob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/deglob/-/deglob-4.0.1.tgz", @@ -1920,6 +2206,11 @@ "is-arrayish": "^0.2.1" } }, + "error-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", + "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" + }, "es-abstract": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", @@ -2425,6 +2716,14 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -2637,6 +2936,19 @@ } } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -3127,6 +3439,11 @@ "wrappy": "1" } }, + "info-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", + "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -3217,6 +3534,21 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "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==", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, "is-arguments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", @@ -3257,11 +3589,48 @@ "ci-info": "^2.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==", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3336,6 +3705,14 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -3394,8 +3771,7 @@ "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 + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-yarn-global": { "version": "0.3.0", @@ -3421,6 +3797,11 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -3864,6 +4245,26 @@ "json-buffer": "3.0.0" } }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + } + } + }, + "koalas": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", + "integrity": "sha1-MYQz8HQjXbePrlZhoCqMpT7ilc0=" + }, "kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -3878,6 +4279,14 @@ "package-json": "^6.3.0" } }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, "le_node": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/le_node/-/le_node-1.8.0.tgz", @@ -3996,6 +4405,15 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -4057,6 +4475,56 @@ } } }, + "log-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", + "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", + "requires": { + "ansi-colors": "^0.2.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + }, + "dependencies": { + "ansi-colors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", + "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^2.0.1" + } + } + } + }, "logform": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", @@ -4135,6 +4603,14 @@ } } }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4213,6 +4689,22 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -4776,6 +5268,59 @@ "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=", + "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=", + "requires": { + "is-descriptor": "^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=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "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=", + "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==", + "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==" + } + } + } + } + }, "object-inspect": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", @@ -4786,6 +5331,14 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, "object.assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", @@ -5232,6 +5785,11 @@ "find-up": "^2.1.0" } }, + "pointer-symbol": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pointer-symbol/-/pointer-symbol-1.0.0.tgz", + "integrity": "sha1-YPkRAgTqepKbYmRKITFVQ8uz1Ec=" + }, "postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -5303,6 +5861,150 @@ "iterate-value": "^1.0.0" } }, + "prompt-actions": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prompt-actions/-/prompt-actions-3.0.2.tgz", + "integrity": "sha512-dhz2Fl7vK+LPpmnQ/S/eSut4BnH4NZDLyddHKi5uTU/2PDn3grEMGkgsll16V5RpVUh/yxdiam0xsM0RD4xvtg==", + "requires": { + "debug": "^2.6.8" + } + }, + "prompt-base": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prompt-base/-/prompt-base-4.1.0.tgz", + "integrity": "sha512-svGzgLUKZoqomz9SGMkf1hBG8Wl3K7JGuRCXc/Pv7xw8239hhaTBXrmjt7EXA9P/QZzdyT8uNWt9F/iJTXq75g==", + "requires": { + "component-emitter": "^1.2.1", + "debug": "^3.0.1", + "koalas": "^1.0.2", + "log-utils": "^0.2.1", + "prompt-actions": "^3.0.2", + "prompt-question": "^5.0.1", + "readline-ui": "^2.2.3", + "readline-utils": "^2.2.3", + "static-extend": "^0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "prompt-choices": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prompt-choices/-/prompt-choices-4.1.0.tgz", + "integrity": "sha512-ZNYLv6rW9z9n0WdwCkEuS+w5nUAGzRgtRt6GQ5aFNFz6MIcU7nHFlHOwZtzy7RQBk80KzUGPSRQphvMiQzB8pg==", + "requires": { + "arr-flatten": "^1.1.0", + "arr-swap": "^1.0.1", + "choices-separator": "^2.0.0", + "clone-deep": "^4.0.0", + "collection-visit": "^1.0.0", + "define-property": "^2.0.2", + "is-number": "^6.0.0", + "kind-of": "^6.0.2", + "koalas": "^1.0.2", + "log-utils": "^0.2.1", + "pointer-symbol": "^1.0.0", + "radio-symbol": "^2.0.0", + "set-value": "^3.0.0", + "strip-color": "^0.1.0", + "terminal-paginator": "^2.0.2", + "toggle-array": "^1.0.1" + }, + "dependencies": { + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "is-number": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz", + "integrity": "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + } + } + }, + "prompt-confirm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prompt-confirm/-/prompt-confirm-2.0.4.tgz", + "integrity": "sha512-X5lzbC8/kMNHdPOqQPfMKpH4VV2f7v2OTRJoN69ZYBirSwTeQaf9ZhmzPEO9ybMA0YV2Pha5MV27u2/U4ahWfg==", + "requires": { + "ansi-cyan": "^0.1.1", + "prompt-base": "^4.0.1" + } + }, + "prompt-question": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/prompt-question/-/prompt-question-5.0.2.tgz", + "integrity": "sha512-wreaLbbu8f5+7zXds199uiT11Ojp59Z4iBi6hONlSLtsKGTvL2UY8VglcxQ3t/X4qWIxsNCg6aT4O8keO65v6Q==", + "requires": { + "clone-deep": "^1.0.0", + "debug": "^3.0.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "kind-of": "^5.0.2", + "koalas": "^1.0.2", + "prompt-choices": "^4.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "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==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -5408,6 +6110,16 @@ } } }, + "radio-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/radio-symbol/-/radio-symbol-2.0.0.tgz", + "integrity": "sha1-eqm/xQSFY21S3XbWqOYxspB5muE=", + "requires": { + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "is-windows": "^1.0.1" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5499,6 +6211,82 @@ "picomatch": "^2.2.1" } }, + "readline-ui": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/readline-ui/-/readline-ui-2.2.3.tgz", + "integrity": "sha512-ix7jz0PxqQqcIuq3yQTHv1TOhlD2IHO74aNO+lSuXsRYm1d+pdyup1yF3zKyLK1wWZrVNGjkzw5tUegO2IDy+A==", + "requires": { + "component-emitter": "^1.2.1", + "debug": "^2.6.8", + "readline-utils": "^2.2.1", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "readline-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/readline-utils/-/readline-utils-2.2.3.tgz", + "integrity": "sha1-b4R9a48ZFcORtYHDZ81HhzhiNRo=", + "requires": { + "arr-flatten": "^1.1.0", + "extend-shallow": "^2.0.1", + "is-buffer": "^1.1.5", + "is-number": "^3.0.0", + "is-windows": "^1.0.1", + "koalas": "^1.0.2", + "mute-stream": "0.0.7", + "strip-color": "^0.1.0", + "window-size": "^1.1.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + } + } + }, "reconnect-core": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reconnect-core/-/reconnect-core-1.3.0.tgz", @@ -5831,11 +6619,44 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "^0.3.0" + } + }, + "set-value": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-3.0.2.tgz", + "integrity": "sha512-npjkVoz+ank0zjlV9F47Fdbjfj/PfXyVhZvGALWsyIYU/qrMzpi6avjKW3/7KeSU2Df3I46BrN1xOI1+6vW0hA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "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==" + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -6059,6 +6880,81 @@ "pkg-conf": "^3.1.0" } }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "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=", + "requires": { + "is-descriptor": "^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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "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=", + "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=", + "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==", + "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==" + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -6143,11 +7039,21 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=" + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" + }, "superagent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", @@ -6272,6 +7178,16 @@ "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", "dev": true }, + "terminal-paginator": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/terminal-paginator/-/terminal-paginator-2.0.2.tgz", + "integrity": "sha512-IZMT5ECF9p4s+sNCV8uvZSW9E1+9zy9Ji9xz2oee8Jfo7hUFpauyjxkhfRcIH6Lu3Wdepv5D1kVRc8Hx74/LfQ==", + "requires": { + "debug": "^2.6.6", + "extend-shallow": "^2.0.1", + "log-utils": "^0.2.1" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -6298,6 +7214,11 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -6322,6 +7243,14 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "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=", + "requires": { + "kind-of": "^3.0.2" + } + }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -6337,6 +7266,14 @@ "is-number": "^7.0.0" } }, + "toggle-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toggle-array/-/toggle-array-1.0.1.tgz", + "integrity": "sha1-y/WEB5K9UJfzMReugkyTKv/ofVg=", + "requires": { + "isobject": "^3.0.0" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -6674,6 +7611,11 @@ "extsprintf": "^1.2.0" } }, + "warning-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", + "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -6757,6 +7699,25 @@ "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.2.tgz", "integrity": "sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ==" }, + "window-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz", + "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==", + "requires": { + "define-property": "^1.0.0", + "is-number": "^3.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=", + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, "winston": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", diff --git a/package.json b/package.json index 65029201..28fdc09d 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,16 @@ "lint": "standard", "lint:fix": "standard --fix", "init-db": "node src/init-db.js", - "create-index": "node scripts/createIndex.js", - "delete-index": "node scripts/deleteIndex.js", + "create-index": "node scripts/es/createIndex.js", + "delete-index": "node scripts/es/deleteIndex.js", + "index:all": "node scripts/es/reIndexAll.js", + "index:jobs": "node scripts/es/reIndexJobs.js", + "index:job-candidates": "node scripts/es/reIndexJobCandidates.js", + "index:resource-bookings": "node scripts/es/reIndexResourceBookings.js", + "data:export": "node scripts/data/exportData.js", + "data:import": "node scripts/data/importData.js", "migrate": "npx sequelize db:migrate", "migrate:undo": "npx sequelize db:migrate:undo", - "test-data": "node scripts/insert-es-data.js", "test": "mocha test/unit/*.test.js --timeout 30000 --exit", "services:up": "docker-compose -f ./local/docker-compose.yml up -d", "services:down": "docker-compose -f ./local/docker-compose.yml down", @@ -41,6 +46,7 @@ "lodash": "^4.17.20", "pg": "^8.4.0", "pg-hstore": "^2.3.3", + "prompt-confirm": "^2.0.4", "rewire": "^5.0.0", "sequelize": "^6.3.5", "superagent": "^6.1.0", @@ -61,6 +67,10 @@ "standard": "^14.3.4" }, "standard": { + "ignore": [ + "/docs", + "/migrations" + ], "env": [ "mocha" ] diff --git a/scripts/createIndex.js b/scripts/createIndex.js deleted file mode 100644 index 4bba1957..00000000 --- a/scripts/createIndex.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Create index in Elasticsearch - */ - -const config = require('config') -const logger = require('../src/common/logger') -const helper = require('../src/common/helper') - -async function createIndex () { - const esClient = helper.getESClient() - - const indices = [ - { - index: config.get('esConfig.ES_INDEX_JOB'), - body: { - mappings: { - properties: { - projectId: { type: 'integer' }, - externalId: { type: 'keyword' }, - description: { type: 'text' }, - title: { type: 'text' }, - startDate: { type: 'date' }, - endDate: { type: 'date' }, - numPositions: { type: 'integer' }, - resourceType: { type: 'keyword' }, - rateType: { type: 'keyword' }, - workload: { type: 'keyword' }, - skills: { type: 'keyword' }, - status: { type: 'keyword' }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - } - } - }, - { - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - body: { - mappings: { - properties: { - jobId: { type: 'keyword' }, - userId: { type: 'keyword' }, - status: { type: 'keyword' }, - externalId: { type: 'keyword' }, - resume: { type: 'text' }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - } - } - }, - { - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - body: { - mappings: { - properties: { - projectId: { type: 'integer' }, - userId: { type: 'keyword' }, - jobId: { type: 'keyword' }, - status: { type: 'keyword' }, - startDate: { type: 'date' }, - endDate: { type: 'date' }, - memberRate: { type: 'float' }, - customerRate: { type: 'float' }, - rateType: { type: 'keyword' }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - } - } - }] - - for (const index of indices) { - await esClient.indices.create(index) - logger.info({ component: 'createIndex', message: `ES Index ${index.index} creation succeeded!` }) - } - process.exit(0) -} - -createIndex().catch((err) => { - logger.logFullError(err, { component: 'createIndex' }) - process.exit(1) -}) diff --git a/scripts/data/exportData.js b/scripts/data/exportData.js new file mode 100644 index 00000000..c443cb38 --- /dev/null +++ b/scripts/data/exportData.js @@ -0,0 +1,24 @@ +/** + * Export data to a json file + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const filePath = helper.getParamFromCliArgs() || config.DEFAULT_DATA_FILE_PATH +const userPrompt = `WARNING: are you sure you want to export all data in the database to a json file with the path ${filePath}? This will overwrite the file.` +const dataModels = ['Job', 'JobCandidate', 'ResourceBooking'] + +async function exportData () { + await helper.promptUser(userPrompt, async () => { + try { + await helper.exportData(filePath, dataModels, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'exportData' }) + process.exit(1) + } + }) +} + +exportData() diff --git a/scripts/data/importData.js b/scripts/data/importData.js new file mode 100644 index 00000000..1f51e61c --- /dev/null +++ b/scripts/data/importData.js @@ -0,0 +1,24 @@ +/** + * Import data from a json file into the db and index it in Elasticsearch + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const filePath = helper.getParamFromCliArgs() || config.DEFAULT_DATA_FILE_PATH +const userPrompt = `WARNING: this would remove existing data. Are you sure you want to import data from a json file with the path ${filePath}?` +const dataModels = ['Job', 'JobCandidate', 'ResourceBooking'] + +async function importData () { + await helper.promptUser(userPrompt, async () => { + try { + await helper.importData(filePath, dataModels, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'importData' }) + process.exit(1) + } + }) +} + +importData() diff --git a/scripts/deleteIndex.js b/scripts/deleteIndex.js deleted file mode 100644 index dd7ca7e6..00000000 --- a/scripts/deleteIndex.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Delete index in Elasticsearch - */ - -const config = require('config') -const logger = require('../src/common/logger') -const helper = require('../src/common/helper') - -async function deleteIndex () { - logger.info({ component: 'deleteIndex', message: 'ES Index deletion started!' }) - const esClient = helper.getESClient() - const indices = [config.get('esConfig.ES_INDEX_JOB'), - config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - config.get('esConfig.ES_INDEX_RESOURCE_BOOKING')] - for (const index of indices) { - await esClient.indices.delete({ - index - }) - logger.info({ component: 'deleteIndex', message: `ES Index ${index} deletion succeeded!` }) - } - process.exit(0) -} -deleteIndex().catch((err) => { - logger.logFullError(err, { component: 'deleteIndex' }) - process.exit(1) -}) diff --git a/scripts/es/createIndex.js b/scripts/es/createIndex.js new file mode 100644 index 00000000..d2c72943 --- /dev/null +++ b/scripts/es/createIndex.js @@ -0,0 +1,29 @@ +/** + * Create index in Elasticsearch + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const indices = [ + config.get('esConfig.ES_INDEX_JOB'), + config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), + config.get('esConfig.ES_INDEX_RESOURCE_BOOKING') +] +const userPrompt = `WARNING: Are you sure want to create the following elasticsearch indices: ${indices}?` + +async function createIndex () { + await helper.promptUser(userPrompt, async () => { + for (const index of indices) { + try { + await helper.createIndex(index, logger) + } catch (err) { + logger.logFullError(err, { component: 'createIndex' }) + process.exit(1) + } + } + process.exit(0) + }) +} + +createIndex() diff --git a/scripts/es/deleteIndex.js b/scripts/es/deleteIndex.js new file mode 100644 index 00000000..6e30995a --- /dev/null +++ b/scripts/es/deleteIndex.js @@ -0,0 +1,29 @@ +/** + * Delete index in Elasticsearch + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const indices = [ + config.get('esConfig.ES_INDEX_JOB'), + config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), + config.get('esConfig.ES_INDEX_RESOURCE_BOOKING') +] +const userPrompt = `WARNING: this would remove existent data! Are you sure want to delete the following eleasticsearch indices: ${indices}?` + +async function deleteIndex () { + await helper.promptUser(userPrompt, async () => { + for (const index of indices) { + try { + await helper.deleteIndex(index, logger) + } catch (err) { + logger.logFullError(err, { component: 'deleteIndex' }) + process.exit(1) + } + } + process.exit(0) + }) +} + +deleteIndex() diff --git a/scripts/es/reIndexAll.js b/scripts/es/reIndexAll.js new file mode 100644 index 00000000..65ddc2ec --- /dev/null +++ b/scripts/es/reIndexAll.js @@ -0,0 +1,24 @@ +/** + * Reindex all data in Elasticsearch using data from database + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const userPrompt = 'WARNING: this would remove existent data! Are you sure want to reindex all indices?' + +async function indexAll () { + await helper.promptUser(userPrompt, async () => { + try { + await helper.indexBulkDataToES('Job', config.get('esConfig.ES_INDEX_JOB'), logger) + await helper.indexBulkDataToES('JobCandidate', config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), logger) + await helper.indexBulkDataToES('ResourceBooking', config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'indexAll' }) + process.exit(1) + } + }) +} + +indexAll() diff --git a/scripts/es/reIndexJobCandidates.js b/scripts/es/reIndexJobCandidates.js new file mode 100644 index 00000000..7e0aec22 --- /dev/null +++ b/scripts/es/reIndexJobCandidates.js @@ -0,0 +1,37 @@ +/** + * Reindex JobCandidates data in Elasticsearch using data from database + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const jobCandidateId = helper.getParamFromCliArgs() +const index = config.get('esConfig.ES_INDEX_JOB_CANDIDATE') +const reIndexAllJobCandidatesPrompt = `WARNING: this would remove existent data! Are you sure you want to reindex the index ${index}?` +const reIndexJobCandidatePrompt = `WARNING: this would remove existent data! Are you sure you want to reindex the document with id ${jobCandidateId} in index ${index}?` + +async function reIndexJobCandidates () { + if (jobCandidateId === null) { + await helper.promptUser(reIndexAllJobCandidatesPrompt, async () => { + try { + await helper.indexBulkDataToES('JobCandidate', index, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'reIndexJobCandidates' }) + process.exit(1) + } + }) + } else { + await helper.promptUser(reIndexJobCandidatePrompt, async () => { + try { + await helper.indexDataToEsById(jobCandidateId, 'JobCandidate', index, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'reIndexJobCandidates' }) + process.exit(1) + } + }) + } +} + +reIndexJobCandidates() diff --git a/scripts/es/reIndexJobs.js b/scripts/es/reIndexJobs.js new file mode 100644 index 00000000..5d44ba70 --- /dev/null +++ b/scripts/es/reIndexJobs.js @@ -0,0 +1,37 @@ +/** + * Reindex Jobs data in Elasticsearch using data from database + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const jobId = helper.getParamFromCliArgs() +const index = config.get('esConfig.ES_INDEX_JOB') +const reIndexAllJobsPrompt = `WARNING: this would remove existent data! Are you sure you want to reindex the index ${index}?` +const reIndexJobPrompt = `WARNING: this would remove existent data! Are you sure you want to reindex the document with id ${jobId} in index ${index}?` + +async function reIndexJobs () { + if (jobId === null) { + await helper.promptUser(reIndexAllJobsPrompt, async () => { + try { + await helper.indexBulkDataToES('Job', index, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'reIndexJobs' }) + process.exit(1) + } + }) + } else { + await helper.promptUser(reIndexJobPrompt, async () => { + try { + await helper.indexDataToEsById(jobId, 'Job', index, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'reIndexJobs' }) + process.exit(1) + } + }) + } +} + +reIndexJobs() diff --git a/scripts/es/reIndexResourceBookings.js b/scripts/es/reIndexResourceBookings.js new file mode 100644 index 00000000..ef2bf940 --- /dev/null +++ b/scripts/es/reIndexResourceBookings.js @@ -0,0 +1,37 @@ +/** + * Reindex ResourceBookings data in Elasticsearch using data from database + */ +const config = require('config') +const logger = require('../../src/common/logger') +const helper = require('../../src/common/helper') + +const resourceBookingId = helper.getParamFromCliArgs() +const index = config.get('esConfig.ES_INDEX_RESOURCE_BOOKING') +const reIndexAllResourceBookingsPrompt = `WARNING: this would remove existent data! Are you sure you want to reindex the index ${index}` +const reIndexResourceBookingPrompt = `WARNING: this would remove existent data! Are you sure you want to reindex the document with id ${resourceBookingId} in index ${index}?` + +async function reIndexResourceBookings () { + if (resourceBookingId === null) { + await helper.promptUser(reIndexAllResourceBookingsPrompt, async () => { + try { + await helper.indexBulkDataToES('ResourceBooking', index, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'reIndexResourceBookings' }) + process.exit(1) + } + }) + } else { + await helper.promptUser(reIndexResourceBookingPrompt, async () => { + try { + await helper.indexDataToEsById(resourceBookingId, 'ResourceBooking', index, logger) + process.exit(0) + } catch (err) { + logger.logFullError(err, { component: 'reIndexResourceBookings' }) + process.exit(1) + } + }) + } +} + +reIndexResourceBookings() diff --git a/scripts/feed-data/jobCandidates.json b/scripts/feed-data/jobCandidates.json deleted file mode 100644 index f76c8978..00000000 --- a/scripts/feed-data/jobCandidates.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "result": [{ - "jobId": "948a25a6-086f-4a96-aad5-9ccd2d3e87b2", - "userId": "df2f0027-f74f-45fa-85cd-84c9fdc2faf4", - "createdAt": "2020-11-18T14:46:06.146Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "11a64405-3b70-4e40-9f88-bbf12819a62b" - }, { - "jobId": "7489c927-7e19-404c-9947-6039ede6123b", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T14:46:06.146Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "f9b59481-a44a-4575-acda-49dcb271e507" - }, { - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-09T14:51:18.579Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "f61e555a-4682-4f3d-b3d4-8f705002612b" - }, { - "jobId": "2de6b167-8c6a-44dd-a6a2-8abd8bf6443b", - "userId": "df2f0027-f74f-45fa-85cd-84c9fdc2faf4", - "createdAt": "2020-11-18T16:22:21.927Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "dd209fc4-73c5-49cb-b8aa-1f00b73ded74" - }, { - "jobId": "07102f1a-6399-4ec6-9198-0156a5bbc991", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-19T09:29:03.237Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "d8a7617d-d9f9-4ba5-8f60-9c205a1966ac" - }, { - "jobId": "7489c927-7e19-404c-9947-6039ede6123b", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T14:46:09.052Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "open", - "id": "cd4d117a-0b56-40ae-bf9c-3d820e9829ae" - }, { - "jobId": "cd7b9ca7-8b5a-4cfb-b04a-5a6c5214efe7", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T14:47:53.977Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "open", - "id": "a8d82e96-2307-4dd9-bab8-0c151ce6f3a7" - }, { - "jobId": "cd7b9ca7-8b5a-4cfb-b04a-5a6c5214efe7", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T14:47:49.785Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "8ff03c86-bd6e-43e6-ad2b-c7e65f142fcf" - }, { - "jobId": "1a5f81ca-65e1-4022-b997-6ab0f9140aa0", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-19T09:51:55.236Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "8eb66f6c-be1a-4fde-8705-15dbbb33f9b1" - }, { - "jobId": "2393adca-0253-4423-a8b4-55194d383d44", - "userId": "1b88e433-828b-4e0d-9fb5-ef75b9dcca6e", - "createdAt": "2020-11-19T14:39:13.332Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "84abfdc5-7af6-4b03-bde8-7afeadf705a3" - }, { - "jobId": "d14418d5-0a55-45b2-b203-cd7235818732", - "userId": "07102f1a-6399-4ec6-9198-0156a5bbc991", - "createdAt": "2020-11-19T09:25:53.636Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "83c3d6d0-d6af-49e5-acbf-b35ba99e5901" - }, { - "jobId": "cd7b9ca7-8b5a-4cfb-b04a-5a6c5214efe7", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T14:47:58.079Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "open", - "id": "6ca8e095-c3c1-405d-8fb1-64b1f193271b" - }, { - "jobId": "1a5f81ca-65e1-4022-b997-6ab0f9140aa0", - "userId": "1b88e433-828b-4e0d-9fb5-ef75b9dcca6e", - "createdAt": "2020-11-19T14:35:20.119Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "6aefe263-bb94-471b-a0f4-4f6748dc3819" - }, { - "jobId": "a3b4e6ba-af63-4d6e-a878-faac1b67ab05", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T14:39:58.951Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "51b922dd-dcde-4864-b83c-62eb5e53b3eb" - }, { - "jobId": "05c7a62e-ba48-4c6b-90f5-48080daecb98", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-16T09:44:54.228Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "43dcc6f1-653f-4741-b3b7-83a098456986" - }, { - "jobId": "d14418d5-0a55-45b2-b203-cd7235818732", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-17T08:07:59.641Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "421954de-04d0-4f9e-a310-c9c0df889649" - }, { - "jobId": "a3b4e6ba-af63-4d6e-a878-faac1b67ab05", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T14:40:04.437Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "open", - "id": "3c3f2b10-2867-484f-b855-b37f2832b5f5" - }, { - "jobId": "1304d5a4-cae9-46fe-aada-0470c349636b", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-18T15:12:33.132Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "shortlist", - "updatedBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "updatedAt": "2020-11-18T15:12:42.714Z", - "id": "3b9bc2a2-db47-4012-8213-9ec559690146" - }, { - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-04T08:35:54.342Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "37b5b42d-c3d3-4877-9f9d-3df67a467707" - }, { - "jobId": "05645f48-6d8d-44cd-accb-a8bb8f21a7b9", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-18T16:12:13.637Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "1e7bf292-3859-4571-94e3-d3ad80924515" - }, { - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-09T12:53:33.710Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "181242e5-8bda-4f03-956a-7ade75952d86" - }] -} diff --git a/scripts/feed-data/jobs.json b/scripts/feed-data/jobs.json deleted file mode 100644 index 4106bf0a..00000000 --- a/scripts/feed-data/jobs.json +++ /dev/null @@ -1,302 +0,0 @@ -{ - "result": [{ - "projectId": 9050, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["faaa0c21-2352-4e27-a1cf-dc05345a86ba"], - "createdAt": "2020-11-18T16:56:11.875Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "f0e8ab04-8659-4ecb-bf7b-f81f24a995f1" - }, { - "projectId": 26, - "externalId": "1211", - "description": "Dummy123 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 2, - "resourceType": "Dummy Resource Type", - "rateType": "weekly", - "skills": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], - "createdAt": "2020-11-04T10:13:15.651Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "ebb35606-8951-4b18-b825-db3d97946930" - }, { - "projectId": 60, - "externalId": "0", - "description": "Dummy59 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 60, - "resourceType": "Dummy Resource Type", - "rateType": "weekly", - "skills": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], - "createdAt": "2020-11-18T15:12:35.798Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "e6653ff9-a4bf-4127-a4f2-397613652d3a" - }, { - "projectId": 59, - "externalId": "0", - "description": "Dummy59 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 59, - "resourceType": "Dummy Resource Type", - "rateType": "weekly", - "skills": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], - "createdAt": "2020-11-17T08:02:01.505Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "d14418d5-0a55-45b2-b203-cd7235818732", - "candidates": [{ - "jobId": "d14418d5-0a55-45b2-b203-cd7235818732", - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "createdAt": "2020-11-17T08:07:59.641Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "421954de-04d0-4f9e-a310-c9c0df889649" - }, { - "jobId": "d14418d5-0a55-45b2-b203-cd7235818732", - "userId": "07102f1a-6399-4ec6-9198-0156a5bbc991", - "createdAt": "2020-11-19T09:25:53.636Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "id": "83c3d6d0-d6af-49e5-acbf-b35ba99e5901" - }] - }, { - "projectId": 109, - "externalId": "34192329", - "description": " Dummy109 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 9, - "resourceType": "Dummy9 Resource Type", - "rateType": "weekly", - "skills": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], - "createdAt": "2020-11-04T10:15:57.442Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "updatedAt": "2020-11-14T12:32:30.584Z", - "id": "b5b2bcb3-4c3b-44d6-ae28-8b8ad721a30b" - }, { - "projectId": 26, - "externalId": "1211", - "description": "Dummy123 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 2, - "resourceType": "Dummy Resource Type", - "rateType": "weekly", - "skills": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], - "createdAt": "2020-11-04T16:57:36.775Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "b3e49039-aaf8-4a7b-90ff-cacc05b85259" - }, { - "projectId": 9050, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-18T16:50:04.244Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "b014c046-cc3d-42a4-80e4-a29280a39479" - }, { - "projectId": 21, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-17T21:00:15.689Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "a938da41-9dd0-44e0-8b0e-271e98646967" - }, { - "projectId": 111, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-19T09:40:20.142Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "a0172c49-6607-476c-81f2-5808adf3e4cf" - }, { - "projectId": 111, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-19T09:59:53.343Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "9f14c68f-baad-4fd6-aa8d-d76ede8eaf65" - }, { - "projectId": 111, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-18T15:07:00.946Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "sourcing", - "id": "9bfe3042-eee2-4621-a59c-c41b9577b029" - }, { - "projectId": 16705, - "externalId": "0", - "description": "Dummy16705-uniq1 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 60, - "resourceType": "Dummy Resource Type", - "rateType": "weekly", - "skills": ["faaa0c21-2352-4e27-a1cf-dc05345a86ba"], - "createdAt": "2020-11-18T16:56:15.437Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "948a25a6-086f-4a96-aad5-9ccd2d3e87b2" - }, { - "projectId": 111, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-18T14:44:41.794Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "90d969d7-992c-429d-82d5-bb875ad7990a" - }, { - "projectId": 21, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-18T14:12:12.543Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "8a46556c-b820-4aae-92f1-11371dd783fc" - }, { - "projectId": 21, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-18T13:57:28.300Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "8875c462-3562-4c43-8614-ce063b24c32f" - }, { - "projectId": 26, - "externalId": "1212", - "description": "Dummy535353 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 1, - "resourceType": "Dummy12353 Resource Type", - "rateType": "hourly", - "skills": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], - "createdAt": "2020-11-16T09:38:35.099Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "updatedAt": "2020-11-16T09:43:33.664Z", - "id": "8444b21a-9970-487a-9c3d-b927378fafd8" - }, { - "projectId": 9050, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["faaa0c21-2352-4e27-a1cf-dc05345a86ba"], - "createdAt": "2020-11-19T09:41:04.100Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "79a056b8-bdbf-4135-b828-3265f9a32763" - }, { - "projectId": 111, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-18T14:23:37.829Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "sourcing", - "id": "75cd1ff7-ee40-44c9-9ca4-20491ec76536" - }, { - "projectId": 59, - "externalId": "0", - "description": "Dummy59 Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 59, - "resourceType": "Dummy Resource Type", - "rateType": "weekly", - "skills": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], - "createdAt": "2020-11-17T08:06:35.838Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "74a2f422-7d60-495e-a330-8f277042474d" - }, { - "projectId": 111, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": ["56fdc405-eccc-4189-9e83-c78abf844f50", "f91ae184-aba2-4485-a8cb-9336988c05ab", "edfc7b4f-636f-44bd-96fc-949ffc58e38b", "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", "ee03c041-d53b-4c08-b7d9-80d7461da3e4"], - "createdAt": "2020-11-18T14:37:00.936Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "60a7db48-7d86-4612-bf11-a173b1bc6295" - }] -} \ No newline at end of file diff --git a/scripts/feed-data/resourceBookings.json b/scripts/feed-data/resourceBookings.json deleted file mode 100644 index 5c33b333..00000000 --- a/scripts/feed-data/resourceBookings.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "result": [{ - "projectId": 16704, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "1a5f81ca-65e1-4022-b997-6ab0f9140aa0", - "startDate": "2020-11-27T04:17:23.131Z", - "endDate": "2020-12-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 113, - "rateType": "weekly", - "createdAt": "2020-11-19T09:55:40.896Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "updatedAt": "2020-11-19T09:58:08.413Z", - "id": "cd32fce8-7cbb-4a8e-ad32-b5dc8e495f47" - }, { - "projectId": 61, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 61, - "customerRate": 61, - "rateType": "weekly", - "createdAt": "2020-11-18T08:24:59.286Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "c8189e84-6cd6-41f8-bbf5-0c692a38594d" - }, { - "projectId": 16704, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "05645f48-6d8d-44cd-accb-a8bb8f21a7b9", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 61, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-18T16:14:35.995Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "assigned", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "updatedAt": "2020-11-18T16:15:23.546Z", - "id": "c7c1ee0f-84cd-4153-8f8c-d06e4bf89dff" - }, { - "projectId": 16705, - "userId": "df2f0027-f74f-45fa-85cd-84c9fdc2faf4", - "jobId": "2de6b167-8c6a-44dd-a6a2-8abd8bf6443b", - "startDate": "2020-11-15T04:17:23.131Z", - "endDate": "2020-12-15T04:17:23.131Z", - "memberRate": 200, - "customerRate": 200, - "rateType": "weekly", - "createdAt": "2020-11-18T16:24:02.682Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "assigned", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "updatedAt": "2020-11-18T16:24:56.797Z", - "id": "a7a65205-d7c5-4725-a1db-923543e621b1" - }, { - "projectId": 56, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-06T08:20:59.895Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "9c8144c9-bb38-4a0a-98e4-270001abf040" - }, { - "projectId": 55, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-06T08:18:54.803Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "926c6dde-e9b8-4f8e-816a-6ada8f458faf" - }, { - "projectId": 111, - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "jobId": "1304d5a4-cae9-46fe-aada-0470c349636b", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-18T15:12:47.545Z", - "createdBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "status": "assigned", - "updatedBy": "0bcb0d86-09bb-410a-b2b1-fba90d1a7699", - "updatedAt": "2020-11-18T15:12:56.010Z", - "id": "52093ad7-aea3-48ae-88b9-6055f4c49e22" - }, { - "projectId": 111, - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "jobId": "7489c927-7e19-404c-9947-6039ede6123b", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-18T14:46:14.088Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "496a0f53-8d6c-44a8-ac46-0198f88692aa" - }, { - "projectId": 25, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-04T08:37:19.635Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "41fc7d75-b41c-4a07-af37-2d411bf0ee0f" - }, { - "projectId": 61, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-06T08:37:25.696Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "40193e5f-59f4-4c73-986b-da3e5d8caee2" - }, { - "projectId": 16704, - "userId": "1b88e433-828b-4e0d-9fb5-ef75b9dcca6e", - "jobId": "2393adca-0253-4423-a8b4-55194d383d44", - "startDate": "2020-11-27T04:17:23.131Z", - "endDate": "2020-12-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 113, - "rateType": "weekly", - "createdAt": "2020-11-19T14:40:43.025Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "assigned", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "updatedAt": "2020-11-19T14:41:52.415Z", - "id": "38bdcff6-89b2-4e3d-9899-5dd9b2cd344c" - }, { - "projectId": 25, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-06T07:32:11.293Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "1e40607c-d6e1-4ab2-ba94-ff7ac8d0347e" - }, { - "projectId": 111, - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "jobId": "cd7b9ca7-8b5a-4cfb-b04a-5a6c5214efe7", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-18T14:48:03.482Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "1c73a4f3-1704-4ecb-85a7-a40d376b3eea" - }, { - "projectId": 60, - "userId": "3f64739e-10bf-42ca-8314-8aea0245cd0f", - "jobId": "0c1e518f-7aad-47f6-81e1-1d0aedb1e9b6", - "startDate": "2020-09-27T04:17:23.131Z", - "endDate": "2020-09-27T04:17:23.131Z", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "createdAt": "2020-11-06T08:37:13.681Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "id": "16df6970-b92a-4da7-98a3-b9f8041b5a67" - }] -} \ No newline at end of file diff --git a/scripts/insert-es-data.js b/scripts/insert-es-data.js deleted file mode 100644 index 09ac281b..00000000 --- a/scripts/insert-es-data.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Import data into ES. - */ -const config = require('config') -const _ = require('lodash') -const logger = require('../src/common/logger') -const helper = require('../src/common/helper') - -const jobs = require('./feed-data/jobs.json').result - -const jobCandidates = require('./feed-data/jobCandidates.json').result - -const resourceBookings = require('./feed-data/resourceBookings.json').result - -const insertESData = async () => { - logger.info('Inserting ES Data started!') - const esClient = helper.getESClient() - - await esClient.deleteByQuery({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - body: { - query: { - match_all: { } - } - } - }) - logger.info('Clear all ES Data on ' + config.get('esConfig.ES_INDEX_RESOURCE_BOOKING')) - - await esClient.deleteByQuery({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - body: { - query: { - match_all: { } - } - } - }) - logger.info('Clear all ES Data on ' + config.get('esConfig.ES_INDEX_JOB_CANDIDATE')) - - await esClient.deleteByQuery({ - index: config.get('esConfig.ES_INDEX_JOB'), - body: { - query: { - match_all: { } - } - } - }) - logger.info('Clear all ES Data on ' + config.get('esConfig.ES_INDEX_JOB')) - - for (const job of jobs) { - await esClient.create({ - index: config.get('esConfig.ES_INDEX_JOB'), - id: job.id, - body: _.omit(job, 'id'), - refresh: 'true' - }) - } - logger.info('Insert ES Data on ' + config.get('esConfig.ES_INDEX_JOB')) - - for (const jobCandidate of jobCandidates) { - await esClient.create({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - id: jobCandidate.id, - body: _.omit(jobCandidate, 'id'), - refresh: 'true' - }) - } - logger.info('Insert ES Data on ' + config.get('esConfig.ES_INDEX_JOB_CANDIDATE')) - - for (const resourceBooking of resourceBookings) { - await esClient.create({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: resourceBooking.id, - body: _.omit(resourceBooking, 'id'), - refresh: 'true' - }) - } - logger.info('Insert ES Data on ' + config.get('esConfig.ES_INDEX_RESOURCE_BOOKING')) -} - -if (!module.parent) { - insertESData().then(() => { - logger.info('Inserting ES Data successfully') - process.exit() - }).catch((e) => { - logger.logFullError(e) - process.exit(1) - }) -} - -module.exports = { - insertESData: insertESData -} diff --git a/src/common/helper.js b/src/common/helper.js index a6a33d7c..c7673c0f 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -2,7 +2,9 @@ * This file defines helper methods */ +const fs = require('fs') const querystring = require('querystring') +const Confirm = require('prompt-confirm') const AWS = require('aws-sdk') const config = require('config') const HttpStatus = require('http-status-codes') @@ -50,6 +52,377 @@ function getBusApiClient () { // ES Client mapping const esClients = {} +// The es index property mapping +const esIndexPropertyMapping = {} +esIndexPropertyMapping[config.get('esConfig.ES_INDEX_JOB')] = { + projectId: { type: 'integer' }, + externalId: { type: 'keyword' }, + description: { type: 'text' }, + title: { type: 'text' }, + startDate: { type: 'date' }, + endDate: { type: 'date' }, + numPositions: { type: 'integer' }, + resourceType: { type: 'keyword' }, + rateType: { type: 'keyword' }, + workload: { type: 'keyword' }, + skills: { type: 'keyword' }, + status: { type: 'keyword' }, + createdAt: { type: 'date' }, + createdBy: { type: 'keyword' }, + updatedAt: { type: 'date' }, + updatedBy: { type: 'keyword' } +} +esIndexPropertyMapping[config.get('esConfig.ES_INDEX_JOB_CANDIDATE')] = { + jobId: { type: 'keyword' }, + userId: { type: 'keyword' }, + status: { type: 'keyword' }, + externalId: { type: 'keyword' }, + resume: { type: 'text' }, + createdAt: { type: 'date' }, + createdBy: { type: 'keyword' }, + updatedAt: { type: 'date' }, + updatedBy: { type: 'keyword' } +} +esIndexPropertyMapping[config.get('esConfig.ES_INDEX_RESOURCE_BOOKING')] = { + projectId: { type: 'integer' }, + userId: { type: 'keyword' }, + jobId: { type: 'keyword' }, + status: { type: 'keyword' }, + startDate: { type: 'date' }, + endDate: { type: 'date' }, + memberRate: { type: 'float' }, + customerRate: { type: 'float' }, + rateType: { type: 'keyword' }, + createdAt: { type: 'date' }, + createdBy: { type: 'keyword' }, + updatedAt: { type: 'date' }, + updatedBy: { type: 'keyword' } +} + +/** + * Get the first parameter from cli arguments + */ +function getParamFromCliArgs () { + const filteredArgs = process.argv.filter(arg => !arg.includes('--')) + + if (filteredArgs.length > 2) { + return filteredArgs[2] + } + + return null +} + +/** + * Prompt the user with a y/n query and call a callback function based on the answer + * @param {string} promptQuery the query to ask the user + * @param {function} cb the callback function + */ +async function promptUser (promptQuery, cb) { + if (process.argv.includes('--force')) { + await cb() + return + } + + const prompt = new Confirm(promptQuery) + prompt.ask(async (answer) => { + if (answer) { + await cb() + } + }) +} + +/** + * Create index in elasticsearch + * @param {Object} index the index name + * @param {Object} logger the logger object + * @param {Object} esClient the elasticsearch client (optional, will create if not given) + */ +async function createIndex (index, logger, esClient = null) { + if (!esClient) { + esClient = getESClient() + } + + await esClient.indices.create({ + index, + body: { + mappings: { + properties: esIndexPropertyMapping[index] + } + } + }) + logger.info({ component: 'createIndex', message: `ES Index ${index} creation succeeded!` }) +} + +/** + * Delete index in elasticsearch + * @param {Object} index the index name + * @param {Object} logger the logger object + * @param {Object} esClient the elasticsearch client (optional, will create if not given) + */ +async function deleteIndex (index, logger, esClient = null) { + if (!esClient) { + esClient = getESClient() + } + + await esClient.indices.delete({ index }) + logger.info({ component: 'deleteIndex', message: `ES Index ${index} deletion succeeded!` }) +} + +/** + * Split data into bulks + * @param {Array} data the array of data to split + */ +function getBulksFromDocuments (data) { + const maxBytes = config.get('esConfig.MAX_BULK_REQUEST_SIZE_MB') * 1e6 + const bulks = [] + let documentIndex = 0 + let currentBulkSize = 0 + let currentBulk = [] + + while (true) { + // break loop when parsed all documents + if (documentIndex >= data.length) { + bulks.push(currentBulk) + break + } + + // check if current document size is greater than the max bulk size, if so, throw error + const currentDocumentSize = Buffer.byteLength(JSON.stringify(data[documentIndex]), 'utf-8') + if (maxBytes < currentDocumentSize) { + throw new Error(`Document with id ${data[documentIndex]} has size ${currentDocumentSize}, which is greater than the max bulk size, ${maxBytes}. Consider increasing the max bulk size.`) + } + + if (currentBulkSize + currentDocumentSize > maxBytes || + currentBulk.length >= config.get('esConfig.MAX_BULK_NUM_DOCUMENTS')) { + // if adding the current document goes over the max bulk size OR goes over max number of docs + // then push the current bulk to bulks array and reset the current bulk + bulks.push(currentBulk) + currentBulk = [] + currentBulkSize = 0 + } else { + // otherwise, add document to current bulk + currentBulk.push(data[documentIndex]) + currentBulkSize += currentDocumentSize + documentIndex++ + } + } + return bulks +} + +/** +* Index records in bulk +* @param {Object} modelName the model name in db +* @param {Object} indexName the index name +* @param {Object} logger the logger object +*/ +async function indexBulkDataToES (modelName, indexName, logger) { + logger.info({ component: 'indexBulkDataToES', message: `Reindexing of ${modelName}s started!` }) + + const esClient = getESClient() + + // clear index + const indexExistsRes = await esClient.indices.exists({ index: indexName }) + if (indexExistsRes.statusCode !== 404) { + await deleteIndex(indexName, logger, esClient) + } + await createIndex(indexName, logger, esClient) + + // get data from db + logger.info({ component: 'indexBulkDataToES', message: 'Getting data from database' }) + const model = models[modelName] + const data = await model.findAll({ raw: true }) + if (_.isEmpty(data)) { + logger.info({ component: 'indexBulkDataToES', message: `No data in database for ${modelName}` }) + return + } + const bulks = getBulksFromDocuments(data) + + const startTime = Date.now() + let doneCount = 0 + for (const bulk of bulks) { + // send bulk to esclient + const body = bulk.flatMap(doc => [{ index: { _index: indexName, _id: doc.id } }, doc]) + await esClient.bulk({ refresh: true, body }) + doneCount += bulk.length + + // log metrics + const timeSpent = Date.now() - startTime + const avgTimePerDocument = timeSpent / doneCount + const estimatedLength = (avgTimePerDocument * data.length) + const timeLeft = (startTime + estimatedLength) - Date.now() + logger.info({ + component: 'indexBulkDataToES', + message: `Processed ${doneCount} of ${data.length} documents, average time per document ${formatTime(avgTimePerDocument)}, time spent: ${formatTime(timeSpent)}, time left: ${formatTime(timeLeft)}` + }) + } +} + +/** + * Index job by id + * @param {Object} modelName the model name in db + * @param {Object} indexName the index name + * @param {string} id the job id + * @param {Object} logger the logger object + */ +async function indexDataToEsById (id, modelName, indexName, logger) { + logger.info({ component: 'indexDataToEsById', message: `Reindexing of ${modelName} with id ${id} started!` }) + const esClient = getESClient() + + logger.info({ component: 'indexDataToEsById', message: 'Getting data from database' }) + const model = models[modelName] + + const data = await model.findById(id) + logger.info({ component: 'indexDataToEsById', message: 'Indexing data into Elasticsearch' }) + await esClient.index({ + index: indexName, + id: id, + body: _.omit(data.dataValues, 'id') + }) + logger.info({ component: 'indexDataToEsById', message: 'Indexing complete!' }) +} + +/** + * Import data from a json file into the database + * @param {string} pathToFile the path to the json file + * @param {Array} dataModels the data models to import + * @param {Object} logger the logger object + */ +async function importData (pathToFile, dataModels, logger) { + // check if file exists + if (!fs.existsSync(pathToFile)) { + throw new Error(`File with path ${pathToFile} does not exist`) + } + + // clear database + logger.info({ component: 'importData', message: 'Clearing database...' }) + await models.sequelize.sync({ force: true }) + + let transaction = null + let currentModelName = null + try { + // Start a transaction + transaction = await models.sequelize.transaction() + const jsonData = JSON.parse(fs.readFileSync(pathToFile).toString()) + + for (let index = 0; index < dataModels.length; index += 1) { + const modelName = dataModels[index] + currentModelName = modelName + const model = models[modelName] + const modelRecords = jsonData[modelName] + + if (modelRecords && modelRecords.length > 0) { + logger.info({ component: 'importData', message: `Importing data for model: ${modelName}` }) + + await model.bulkCreate(modelRecords, { transaction }) + logger.info({ component: 'importData', message: `Records imported for model: ${modelName} = ${modelRecords.length}` }) + } else { + logger.info({ component: 'importData', message: `No records to import for model: ${modelName}` }) + } + } + // commit transaction only if all things went ok + logger.info({ component: 'importData', message: 'committing transaction to database...' }) + await transaction.commit() + } catch (error) { + logger.error({ component: 'importData', message: `Error while writing data of model: ${currentModelName}` }) + // rollback all insert operations + if (transaction) { + logger.info({ component: 'importData', message: 'rollback database transaction...' }) + transaction.rollback() + } + if (error.name && error.errors && error.fields) { + // For sequelize validation errors, we throw only fields with data that helps in debugging error, + // because the error object has many fields that contains very big sql query for the insert bulk operation + throw new Error( + JSON.stringify({ + modelName: currentModelName, + name: error.name, + errors: error.errors, + fields: error.fields + }) + ) + } else { + throw error + } + } + + // after importing, index data + await indexBulkDataToES('Job', config.get('esConfig.ES_INDEX_JOB'), logger) + await indexBulkDataToES('JobCandidate', config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), logger) + await indexBulkDataToES('ResourceBooking', config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), logger) +} + +/** + * Export data from the database into a json file + * @param {string} pathToFile the path to the json file + * @param {Array} dataModels the data models to export + * @param {Object} logger the logger object + */ +async function exportData (pathToFile, dataModels, logger) { + logger.info({ component: 'exportData', message: `Start Saving data to file with path ${pathToFile}....` }) + + const allModelsRecords = {} + for (let index = 0; index < dataModels.length; index += 1) { + const modelName = dataModels[index] + const modelRecords = await models[modelName].findAll({ + raw: true, + where: { + deletedAt: null + }, + attributes: { + exclude: ['deletedAt'] + } + }) + allModelsRecords[modelName] = modelRecords + logger.info({ component: 'exportData', message: `Records loaded for model: ${modelName} = ${modelRecords.length}` }) + } + + fs.writeFileSync(pathToFile, JSON.stringify(allModelsRecords)) + logger.info({ component: 'exportData', message: 'End Saving data to file....' }) +} + +/** + * Format a time in milliseconds into a human readable format + * @param {Date} milliseconds the number of milliseconds + */ +function formatTime (millisec) { + const ms = Math.floor(millisec % 1000) + const secs = Math.floor((millisec / 1000) % 60) + const mins = Math.floor((millisec / (1000 * 60)) % 60) + const hrs = Math.floor((millisec / (1000 * 60 * 60)) % 24) + const days = Math.floor((millisec / (1000 * 60 * 60 * 24)) % 7) + const weeks = Math.floor((millisec / (1000 * 60 * 60 * 24 * 7)) % 4) + const mnths = Math.floor((millisec / (1000 * 60 * 60 * 24 * 7 * 4)) % 12) + const yrs = Math.floor((millisec / (1000 * 60 * 60 * 24 * 7 * 4 * 12))) + + let formattedTime = '0 milliseconds' + if (ms > 0) { + formattedTime = `${ms} milliseconds` + } + if (secs > 0) { + formattedTime = `${secs} seconds ${formattedTime}` + } + if (mins > 0) { + formattedTime = `${mins} minutes ${formattedTime}` + } + if (hrs > 0) { + formattedTime = `${hrs} hours ${formattedTime}` + } + if (days > 0) { + formattedTime = `${days} days ${formattedTime}` + } + if (weeks > 0) { + formattedTime = `${weeks} weeks ${formattedTime}` + } + if (mnths > 0) { + formattedTime = `${mnths} months ${formattedTime}` + } + if (yrs > 0) { + formattedTime = `${yrs} years ${formattedTime}` + } + + return formattedTime.trim() +} + /** * Check if exists. * @@ -615,6 +988,14 @@ async function checkIsMemberOfProject (userId, projectId) { } module.exports = { + getParamFromCliArgs, + promptUser, + createIndex, + deleteIndex, + indexBulkDataToES, + indexDataToEsById, + importData, + exportData, checkIfExists, autoWrapExpress, setResHeaders, diff --git a/src/models/Job.js b/src/models/Job.js index 14cec753..d6cc3955 100644 --- a/src/models/Job.js +++ b/src/models/Job.js @@ -69,7 +69,7 @@ module.exports = (sequelize) => { type: Sequelize.STRING(255) }, description: { - type: Sequelize.TEXT, // technically unlimited length + type: Sequelize.TEXT // technically unlimited length }, title: { type: Sequelize.STRING(128),