diff --git a/.github/blunderbuss.yml b/.github/blunderbuss.yml index 5d5fbe59a6..9481d26855 100644 --- a/.github/blunderbuss.yml +++ b/.github/blunderbuss.yml @@ -37,6 +37,11 @@ assign_issues_by: - 'api: dlp' to: - GoogleCloudPlatform/googleapis-dlp +- labels: + - 'api: contentwarehouse' + - 'api: documentai' + to: + - GoogleCloudPlatform/document-ai-samples-contributors assign_prs_by: - labels: @@ -58,3 +63,8 @@ assign_prs_by: - 'api: dlp' to: - GoogleCloudPlatform/googleapis-dlp +- labels: + - 'api: contentwarehouse' + - 'api: documentai' + to: + - GoogleCloudPlatform/document-ai-samples-contributors diff --git a/.github/workflows/document-warehouse.yaml b/.github/workflows/document-warehouse.yaml new file mode 100644 index 0000000000..dfcb9eb340 --- /dev/null +++ b/.github/workflows/document-warehouse.yaml @@ -0,0 +1,62 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: document-warehouse +on: + push: + branches: + - main + paths: + - 'document-warehouse/**' + - '.github/workflows/document-warehouse.yaml' + pull_request: + paths: + - 'document-warehouse/**' + - '.github/workflows/document-warehouse.yaml' + pull_request_target: + types: [labeled] + paths: + - 'document-warehouse/**' + - '.github/workflows/document-warehouse.yaml' + schedule: + - cron: '0 0 * * 0' +jobs: + test: + # Ref: https://github.com/google-github-actions/auth#usage + permissions: + contents: 'read' + id-token: 'write' + if: github.event.action != 'labeled' || github.event.label.name == 'actions:force-run' + uses: ./.github/workflows/test.yaml + with: + name: 'document-warehouse' + path: 'document-warehouse' + remove_label: + # Ref: https://github.com/google-github-actions/auth#usage + permissions: + contents: 'read' + id-token: 'write' + if: | + github.event.action == 'labeled' && + github.event.label.name == 'actions:force-run' && + always() + uses: ./.github/workflows/remove-label.yaml + flakybot: + # Ref: https://github.com/google-github-actions/auth#usage + permissions: + contents: 'read' + id-token: 'write' + if: github.event_name == 'schedule' && always() # always() submits logs even if tests fail + uses: ./.github/workflows/flakybot.yaml + needs: [test] diff --git a/.github/workflows/utils/workflows.json b/.github/workflows/utils/workflows.json index 950aca0d12..fb31254fef 100644 --- a/.github/workflows/utils/workflows.json +++ b/.github/workflows/utils/workflows.json @@ -39,6 +39,7 @@ "discoveryengine", "dlp", "document-ai", + "document-warehouse", "endpoints/getting-started", "endpoints/getting-started-grpc", "error-reporting", diff --git a/CODEOWNERS b/CODEOWNERS index 0f2a8fe69c..99c71af94e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -57,7 +57,8 @@ datalabeling @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-sample dialogflow @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers dialogflow-cx @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers discoveryengine @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers -document-ai @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers +document-ai @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers @GoogleCloudPlatform/document-ai-samples-contributors +document-warehouse @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers @GoogleCloudPlatform/document-ai-samples-contributors mediatranslation @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers notebooks @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers speech @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers diff --git a/document-warehouse/.eslintrc.yml b/document-warehouse/.eslintrc.yml new file mode 100644 index 0000000000..874e3161ce --- /dev/null +++ b/document-warehouse/.eslintrc.yml @@ -0,0 +1,17 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- +rules: + no-console: off + node/no-unsupported-features/node-builtins: off diff --git a/document-warehouse/fetch-acl.js b/document-warehouse/fetch-acl.js new file mode 100644 index 0000000000..fa8e77f3e4 --- /dev/null +++ b/document-warehouse/fetch-acl.js @@ -0,0 +1,72 @@ +/** Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +async function main( + projectId = 'YOUR_PROJECT_ID', + location = 'YOUR_PROJECT_LOCATION', + userId = 'user:xxxx@example.com', + documentId = 'YOUR_DOCUMENT_ID' +) { + // [START contentwarehouse_fetch_acl] + + /** + * TODO(developer): Uncomment these variables before running the sample. + * const projectId = 'YOUR_PROJECT_ID'; + * const location = 'YOUR_PROJECT_LOCATION'; // Format is 'us' or 'eu' + * const documentId = 'YOUR_DOCUMENT_ID', + * const userId = "user:xxxx@example.com" // Format is "user:xxxx@example.com" + */ + + // Import from google cloud + const {DocumentServiceClient} = require('@google-cloud/contentwarehouse').v1; + + // Create service client + const serviceClient = new DocumentServiceClient(); + + // Fetches access control policies on project or document level. + async function fetchACL() { + // Initialize request argument(s) + const request = {}; + if (documentId !== 'YOUR_DOCUMENT_ID') { + // Full document resource name, e.g.: + // projects/{project_id}/locations/{location}/documents/{document_id} + request.resource = `projects/${projectId}/locations/${location}/documents/${documentId}`; + request.requestMetadata = {userInfo: {id: userId}}; + } else { + // Full document resource name, e.g.: projects/{project_id} + request.resource = `projects/${projectId}`; + request.projectOwner = true; + } + + // Make Request + const response = serviceClient.fetchAcl(request); + + // Print out response + response.then( + result => console.log(`Success! Response: \n${JSON.stringify(result)}`), + error => console.log(`Failed! Response: \n${error}`) + ); + } + + // [END contentwarehouse_fetch_acl] + await fetchACL(); +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/document-warehouse/package.json b/document-warehouse/package.json new file mode 100644 index 0000000000..3f22485e62 --- /dev/null +++ b/document-warehouse/package.json @@ -0,0 +1,13 @@ +{ + "name": "nodejs-document-warehouse-samples", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "scripts": { + "test": "c8 mocha test/*.js --timeout 600000" + }, + "dependencies": { + "@google-cloud/contentwarehouse": "^0.5.1", + "assert": "^2.0.0" + } +} diff --git a/document-warehouse/test/.eslintrc.yml b/document-warehouse/test/.eslintrc.yml new file mode 100644 index 0000000000..734e9736fe --- /dev/null +++ b/document-warehouse/test/.eslintrc.yml @@ -0,0 +1,18 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- +env: + mocha: true +rules: + node/no-extraneous-require: off diff --git a/document-warehouse/test/fetch-acl.test.js b/document-warehouse/test/fetch-acl.test.js new file mode 100644 index 0000000000..6db2aa9b56 --- /dev/null +++ b/document-warehouse/test/fetch-acl.test.js @@ -0,0 +1,48 @@ +/** Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const cp = require('child_process'); +const path = require('path'); +const assert = require('assert'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); +const cwd = path.join(__dirname, '..'); +const PROJECT_ID_PASS = 'YOUR_PROJECT_ID'; +const PROJECT_ID_FAILED = 'PROJECT_ID_WITHOUT_ACL'; +const LOCATION = 'us'; +const USER_ID = 'user:xxxx@example.com'; +const DOCUMENT_ID = 'YOUR_DOCUMENT_ID'; + +describe('Fetch document acl', () => { + it('should get acl given only a projectId', async () => { + const stdout = execSync(`node ./fetch-acl.js ${PROJECT_ID_PASS} `, {cwd}); + assert(stdout.startsWith('Success!')); + }); + + it('should get acl given a documentId', async () => { + const stdout = execSync( + `node ./fetch-acl.js ${PROJECT_ID_PASS} ${LOCATION} ${USER_ID} ${DOCUMENT_ID}`, + {cwd} + ); + assert(stdout.startsWith('Success!')); + }); + + it('should fail given an incorrect projectId', async () => { + const stdout = execSync(`node ./fetch-acl.js ${PROJECT_ID_FAILED}`, {cwd}); + assert(stdout.startsWith('Failed!')); + }); +}); diff --git a/package.json b/package.json index 068f1e8d9b..caecbe496a 100644 --- a/package.json +++ b/package.json @@ -17,14 +17,15 @@ "test": "echo 'Please run tests in each sample directory.' && exit 1", "generate-ci": "node .github/workflows/utils/generate.js" }, - "devDependencies": { - "c8": "^7.13.0", + "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/parser": "^5.59.0", + "c8": "^7.13.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", - "eslint-config-prettier": "^8.8.0", "gts": "^3.1.1", + "mocha": "^10.2.0", "nunjucks": "^3.2.4", "prettier": "^2.8.7", "typescript": "^5.0.4"