2022-04-18 (C) Questetra, Inc. (MIT License) 2 Delete the shared link accessible by anyone with the link or within the domain from the specified file or folder on Google Drive. Permissions for users or groups remain undeleted. Google ドライブ の指定ファイルやフォルダから、リンクを知っている全員、もしくはドメイン内の全員がアクセスできる共有リンクを削除します。ユーザやグループへのアクセス許可は削除されずに残ります。 https://support.questetra.com/bpmn-icons/service-task-google-drive-permission-delete/ https://support.questetra.com/ja/bpmn-icons/service-task-google-drive-permission-delete/ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADLUlEQVRYR2NkYGBgZBhAALJ81AFE hUBmYabNj19/dglzM7ERirGerpkshNTA5ImOgvTClGu/fjEq5AfeYdeX+YrT0cv2S3y69kjgVGv7 IjdiHEGUAzKK0nKf8X9peyz5ntv5jty/7qTzTPgML51n+O/rbyaH6f3TjxByBFEOSMxO/XZB/wnH d6k/DGpnRb82WT/nwhcKF59w/5++VfnmzP45WhQ7IL0wdfZzga8Rt4xfc4MM43zGwkBMKICi4vBt idoZfbMm43ME3hAAJbx/DL9nHXR+qAEzBOQA2eeCBEMBpD5psv6P+VNnc5HtgOrKuF2XOf5YwnyP 7oiN4XfAoYILEJMgcYYAyPdPBT5uR7ccFg2gUAgX+/I3yvEFHyUJEqcDQNnulOZTDVDCQwegaAAB g4syPwhlS1CCXL1Xdi+ubInVAbBsh833yNEAcgAb2/8HM9IvwdMIttDAlyAxHIAt4WEzFJQdJT9w rwDJ2am9DMUXFfiyJYYD0LMdNstBUQDyPSyFg8qJebkXOQglyEO3xFfP7J+diqwOxQGk+F7qI08V LI+DosxW9UUzoQQJypYcbCxuyCUkigPwJTzkuDe7Ln0DvZQD6c30vqtOqIRET5BwBxCT8ECOsN8r f4OJgTUNvZyHhR6pCRLuAOTyHldcwhIeejzC1IPSDyhBBuvu42MXwV4NoGdLsAOISXj4fA9zACwU JgavwJktQQ4DZUtYgoQ6AHehAzMc5HvhV9zM/xkl/uFL7SA5xv8vmAg1XD7//nsLlI7ADiAm/i23 K/y48ywQnNXY9S0ZePlx1zGfP37D60aZN33fONheVoJyETwN4MsBIN+/vxADrngIWU4odDjeH/vP 93kpvK0AdwCszXfc8wFKgQKyXOi1MuPdp5ZclFoOchz/3ZZvnKxvPGC5CK0cwGx8gEo8UNBTw3KI 75fNQ85FGEUxLDvCajtqWQ5KF8ofSzEKMAwHwBIkyAGgoH8iUsSFL8ERinOYPCjoYQkPZ12AKFBS rj0X+Cb77f9UbmpYjp7wCDoAlCC//xbZQazviFGHnPAIOoAYA6mlhqh+AbUsw2bOgDsAAHEO2FDM 6/Q2AAAAAElFTkSuQmCC { const quser = engine.createQuser(3, 'サウスポール', 'SouthPole@questetra.com'); configs.putObject('conf_User', quser); // ファイル/フォルダの ID が保存された文字型データ項目(単一行)を準備 const fileIdDef = engine.createDataDefinition('共有リンクを削除するファイル/フォルダの ID', 1, 'q_fileId', 'STRING_TEXTFIELD'); engine.setData(fileIdDef, fileId); configs.putObject('conf_FileId', fileIdDef); }; /** * UserID に対応する QuserView がない場合 */ test('User not found', () => { prepareConfigs('abc123'); configs.put('conf_User', ''); expect(execute).toThrow('User not found'); }); /** * ファイル/フォルダの ID が空でエラーになる場合 */ test('No File / Folder ID', () => { prepareConfigs(null); expect(execute).toThrow("File / Folder ID isn't set."); }); /** * GET リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param fileId */ const assertGetRequest = ({url, method}, fileId) => { const fields = encodeURIComponent('permissions/id,permissions/type'); expect(url).toEqual(`https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}/permissions?fields=${fields}&supportsAllDrives=true`); expect(method).toEqual('GET'); }; /** * GET API リクエストでエラー */ test('GET Failed', () => { prepareConfigs('abc123'); httpClient.setRequestHandler((request) => { assertGetRequest(request, 'abc123'); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to get permission list. File:abc123, Status:400'); }); const SAMPLE_GET_NO_SHARED_LINK = { "permissions": [ { "id": "p1", "type": "user" } ] }; /** * GET リクエストは成功するが、削除対象の共有設定がなくエラー */ test('No shared link to delete', () => { prepareConfigs('abc123'); httpClient.setRequestHandler((request) => { assertGetRequest(request, 'abc123'); return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_GET_NO_SHARED_LINK)); }); expect(execute).toThrow('No shared link to delete. File:abc123'); }); const SAMPLE_GET_1 = { "permissions": [ { "id": "p1", "type": "user" }, { "id": "p2", "type": "group" }, { "id": "p3", "type": "anyone" } ] }; const SAMPLE_GET_2 = { "permissions": [ { "id": "p1", "type": "domain" }, { "id": "p2", "type": "user" } ] }; /** * DELETE リクエストのテスト * @param {Object} request * @param request.url * @param request.method * @param fileId * @param permissionId */ const assertDeleteRequest = ({url, method, contentType, body}, fileId, permissionId) => { expect(url).toEqual(`https://www.googleapis.com/drive/v3/files/${encodeURIComponent(fileId)}/permissions/${permissionId}?supportsAllDrives=true`); expect(method).toEqual('DELETE'); }; /** * DELETE API リクエストでエラー */ test('DELETE Failed', () => { prepareConfigs('abc123'); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetRequest(request, 'abc123'); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_GET_1)); } assertDeleteRequest(request, 'abc123', 'p3'); return httpClient.createHttpResponse(400, 'application/json', '{}'); }); expect(execute).toThrow('Failed to delete permission. File:abc123, Permission:p3, Status:400'); }); /** * 共有リンク削除成功 * 共有範囲が anyone のものを削除 */ test('Success - anyone', () => { prepareConfigs('abc123'); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetRequest(request, 'abc123'); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_GET_1)); } assertDeleteRequest(request, 'abc123', 'p3'); return httpClient.createHttpResponse(200, 'application/json', '{}'); }); execute(); }); /** * 共有リンク削除成功 * 共有範囲が domain のものを削除 */ test('Success - domain', () => { prepareConfigs('def789'); let reqCount = 0; httpClient.setRequestHandler((request) => { if (reqCount === 0) { assertGetRequest(request, 'def789'); reqCount++; return httpClient.createHttpResponse(200, 'application/json', JSON.stringify(SAMPLE_GET_2)); } assertDeleteRequest(request, 'def789', 'p1'); return httpClient.createHttpResponse(200, 'application/json', '{}'); }); execute(); }); ]]>