2024-11-21 (C) Questetra, Inc. (MIT License) 3 2 This item creates a shared link for the specified file or folder on Google Drive. An error occurs when the file/folder is already shared with anyone or within the domain. この工程は、Google ドライブ の指定ファイルやフォルダの共有リンクを作成します。すでにリンクを知っている全員、もしくはドメインで共有されているファイル/フォルダを指定した場合はエラーになります。 https://support.questetra.com/bpmn-icons/googledrive-permissioncreate/ https://support.questetra.com/ja/bpmn-icons/googledrive-permissioncreate/ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA71JREFUWEfF V11oFFcU/s7M7K6TRs1vK1VUSGmbCK2SB6VFgpLWlYC2omIDLaUlCBGfimwWgw9Fu9mW0ocSoUhE aKmlgUgUyShiEUWSh4AW7L9CS5PGZhuTJmTi7swcmUn3d+ZOdtGy87Ts3HvOd77zfefeIZT5oVLy h2MP3wTMViJqZqABQM1/+6cIuMvMo4B8RYuGzhUbd0kArT1TK2VWj5CEg2DUFRWYkGALX5ikf3Kl q2bGb48vgJ0x/T2WEC86cWEmQoIsRIai6mkRCCGAcHy+F0ydRVW81CLik1qk4pDXMk8A4bj+NRhv LRW3pPeEs1pEbXeTVPDPE63clc3NRB4DTs8JfX6V7d2soKVRgizlk5cyGBdvmbj8velLDDHez9VE JoqtdoXU3/wE19Io452tCtQgUP2Uu3u/TliInE1CT/pgICQM1p9LuyMTZUdMP06Eo37wYweC2LhO wsQ0o245QZHzVxsm8O2IgS+vG74sMOPEpajabS/KAAjH9Um/6vdvUdD+qoKQAiykgFmdUb/CzcLE DCN+PoWfxi0xCEJCi6j1GQDOhCNrQLRjdQ2h+40g1tdnE/4zy6gIkdOO3Mdi4OodE59eTPmbhKU9 9sR0IoZj870gsec7tivY1axAkbIxDQuY/JexaiWBCoiYnmd8fsnAzV98BMl8UotWHHK27uzRhxnY 7AX55XUSjrQFULvcTbdNs92G2kr3u1u/W4h+I1YjASNDXeqWRQZ69EnAe85Hdwew9QXZVeXsAqP3 soENayS0bZJR4EpHJ2eupTA4KmQhoXWpi00N9+j2qhyCF7l4/SUZHdsUVC7Lr9Du87UfTXx8IYW1 dYRje4JYXe1m4d7fjI8GkxibYi9yLa1LlYUAbHEd3xdE0xoXLhQqPdchuZlsnZwfNXDqqqct8wC4 WlBK0FLA5gDMtsBLhJ+9HcSLz7qrH3/AmFtgBJR8ym0uQwG4tGJawNBtE/3D+Szki9DDhrubZbzb EsCyQBaz3wASmX7sAePDgST+SBToINeGokF0Yn8Qm9ZLTlXMwF/TjKdXuEewKHnSAPpHDHx1w0MD uYPIcYLHKH7leRmHdyioqiCHdltU9u9inx/+tNDd73E4FY5iO6DoMPqgLYBtTTLuzzBWVZHL7yIw cw8Zfd8Z0G6754DnYSQ6jm2fd74WQMMzhMpQcdXb7br+s4nYoMd5IDqOnZFcxIWkWPpF64QXkvSG sl7JsiDKeCn9X5go9VqeBlHWD5M0iLJ+mhUquSwfp49ru6X2PwLQFL0wM02BagAAAABJRU5ErkJg gg== { const quser = engine.createQuser(3, 'サウスポール', 'SouthPole@questetra.com'); configs.putObject('conf_UserID', quser); // 共有するファイル/フォルダの ID を保存する文字型データ項目(単一行)を準備 const fileIdDef = engine.createDataDefinition('共有するファイル/フォルダの ID', 1, 'q_fileId', 'STRING_TEXTFIELD'); engine.setData(fileIdDef, fileId); configs.putObject('conf_FileIdsItem', fileIdDef); configs.put('conf_SharedRange', sharedRange); configs.put('conf_Role', role); configs.put('conf_Domain', domain); configs.putObject('conf_AllowFileDiscovery', allowFileDiscovery); // 共有したファイル/フォルダの表示 URL を保存する文字型データ項目(単一行)を準備 const sharedUrlItemDef = engine.createDataDefinition('共有したファイル/フォルダの表示 URL', 2, 'q_fileUrl', 'STRING_TEXTFIELD'); engine.setData(sharedUrlItemDef, '事前文字列'); configs.putObject('conf_SharedUrlItem', sharedUrlItemDef); return sharedUrlItemDef; }; /** * 異常系のテスト * @param errorMsg */ const assertError = (errorMsg) => { let failed = false; try { main(); } catch (e) { failed = true; expect(e.toString()).toEqual(errorMsg); } if (!failed) { fail('No error was thrown.'); } }; /** * UserID に対応する QuserView がない場合 */ test('User not found', () => { prepareConfigs('abc123', ANYONE, VIEWER, '', false); configs.put('conf_UserID', ''); assertError('User not found'); }); /** * 共有範囲がドメインなのにドメインが空でエラーになる場合 */ test('domain is blank', () => { prepareConfigs('abc456', DOMAIN, VIEWER, '', false); assertError("Domain to share isn't set."); }); /** * 共有するファイル/フォルダの ID が空でエラーになる場合 */ test('File / Folder ID is blank', () => { prepareConfigs(null, ANYONE, VIEWER, '', true); assertError("File / Folder ID isn't set."); }); /** * 1つ目の API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param fileId */ const assert1stRequest = ({ url, method }, fileId) => { const fields = encodeURIComponent('permissions/type'); expect(url).toEqual(`https://www.googleapis.com/drive/v3/files/${fileId}/permissions?fields=${fields}&supportsAllDrives=true`); expect(method).toEqual('GET'); }; /** * 1つ目の API リクエストでエラー */ test('1st API Request Failed', () => { prepareConfigs('def789', ANYONE, VIEWER, '', false); httpClient.setRequestHandler((request) => { assert1stRequest(request, 'def789'); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); assertError('Failed to get permission list. File:def789, Status:400'); }); /** * すでにドメイン内で共有されていてエラー */ test('The file is already shared - domain', () => { prepareConfigs('def789', ANYONE, VIEWER, '', false); const res = { permissions: [ { "type": "user" }, { "type": "domain" } ] }; httpClient.setRequestHandler((request) => { assert1stRequest(request, 'def789'); return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(res)); }); assertError('The item (ID: def789) is already shared.'); }); /** * すでにリンクを知っている全員に共有されていてエラー */ test('The file is already shared - anyone', () => { prepareConfigs('def789', ANYONE, VIEWER, '', false); const res = { permissions: [ { "type": "anyone" }, { "type": "group" } ] }; httpClient.setRequestHandler((request) => { assert1stRequest(request, 'def789'); return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(res)); }); assertError('The item (ID: def789) is already shared.'); }); /** * 2つ目の API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param request.contentType * @param request.body * @param fileId * @param type * @param role * @param domain * @param allowFileDiscovery */ const assert2ndRequest = ({ url, method, contentType, body }, fileId, type, role, domain, allowFileDiscovery) => { expect(url).toEqual(`https://www.googleapis.com/drive/v3/files/${fileId}/permissions?supportsAllDrives=true`); expect(method).toEqual('POST'); expect(contentType).toEqual('application/json; charset=UTF-8'); const bodyObj = JSON.parse(body); expect(bodyObj.type).toEqual(type); expect(bodyObj.role).toEqual(role); if (type === "domain") { expect(bodyObj.domain).toEqual(domain); expect(bodyObj.allowFileDiscovery).toEqual(allowFileDiscovery); } else { expect(bodyObj.domain).toEqual(undefined); expect(bodyObj.allowFileDiscovery).toEqual(undefined); } }; const SAMPLE_PERMISSION_LIST = { permissions: [ { "type": "user" }, { "type": "group" } ] }; /** * 2つ目の API リクエストでエラー */ test('2nd API Request Failed', () => { prepareConfigs('abc789', DOMAIN, EDITOR, 'test1.example.com', true); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assert1stRequest(request, 'abc789'); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_PERMISSION_LIST)); } assert2ndRequest(request, 'abc789', DOMAIN, EDITOR, 'test1.example.com', true); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); assertError('Failed to create permission. File:abc789, Status:400'); }); /** * 3つ目の API リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param fileId */ const assert3rdRequest = ({ url, method }, fileId) => { expect(url).toEqual(`https://www.googleapis.com/drive/v3/files/${fileId}?fields=webViewLink&supportsAllDrives=true`); expect(method).toEqual('GET'); }; /** * 3つ目の API リクエストでエラー */ test('3rd API Request Failed', () => { prepareConfigs('abc789', ANYONE, VIEWER, '', false); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assert1stRequest(request, 'abc789'); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_PERMISSION_LIST)); } if (reqCount === 1) { assert2ndRequest(request, 'abc789', ANYONE, VIEWER, '', false); reqCount++; return httpClient.createHttpResponse(200, 'application/json', '{}'); } assert3rdRequest(request, 'abc789'); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); assertError('Failed to get item info. File:abc789, Status:400'); }); const SAMPLE_FILE_1 = { "webViewLink": "https://docs.google.com/spreadsheets/d/def123/edit?usp=drivesdk" }; const SAMPLE_FILE_2 = { "webViewLink": "https://docs.google.com/spreadsheets/d/abc789/edit?usp=drivesdk" }; /** * 共有成功 - ドメイン */ test('Succeed - domain', () => { const sharedUrlItemDef = prepareConfigs('def123', DOMAIN, VIEWER, 'test1.example.com', true); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assert1stRequest(request, 'def123'); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_PERMISSION_LIST)); } if (reqCount === 1) { assert2ndRequest(request, 'def123', DOMAIN, VIEWER, 'test1.example.com', true); reqCount++; return httpClient.createHttpResponse(200, 'application/json', '{}'); } assert3rdRequest(request, 'def123'); return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_FILE_1)); }); //