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));
});
//