|
|
@@ -18,6 +18,12 @@ type checkPermissionForInteractionsResults = {
|
|
|
rejectedResults:PromiseRejectedResult[]
|
|
|
}
|
|
|
|
|
|
+type checkEachRelationResult = {
|
|
|
+ allowedRelation:Relation|null,
|
|
|
+ disallowedGrowiUrl:string|null,
|
|
|
+ eachRelationCommandName:string,
|
|
|
+}
|
|
|
+
|
|
|
@Service()
|
|
|
export class RelationsService {
|
|
|
|
|
|
@@ -117,7 +123,80 @@ export class RelationsService {
|
|
|
async checkPermissionForInteractions(
|
|
|
relations:Relation[], actionId:string, callbackId:string, channelName:string,
|
|
|
):Promise<checkPermissionForInteractionsResults> {
|
|
|
- return this.relationsResult(relations, actionId, callbackId, channelName);
|
|
|
+
|
|
|
+ const allowedRelations:Relation[] = [];
|
|
|
+ const disallowedGrowiUrls:Set<string> = new Set();
|
|
|
+ let commandName = '';
|
|
|
+
|
|
|
+ const results = await Promise.allSettled(relations.map(async(relation) => {
|
|
|
+ const relationResult = await this.checkEachRelation(relation, actionId, callbackId, channelName);
|
|
|
+ const { allowedRelation, disallowedGrowiUrl, eachRelationCommandName } = relationResult;
|
|
|
+
|
|
|
+ console.log(relationResult);
|
|
|
+
|
|
|
+ if (allowedRelation != null) {
|
|
|
+ allowedRelations.push(allowedRelation);
|
|
|
+ }
|
|
|
+ if (disallowedGrowiUrl != null) {
|
|
|
+ disallowedGrowiUrls.add(disallowedGrowiUrl);
|
|
|
+ }
|
|
|
+ commandName = eachRelationCommandName;
|
|
|
+
|
|
|
+ }));
|
|
|
+ console.log(144, results);
|
|
|
+
|
|
|
+
|
|
|
+ const rejectedResults: PromiseRejectedResult[] = results.filter((result): result is PromiseRejectedResult => result.status === 'rejected');
|
|
|
+
|
|
|
+ // return this.relationsResult(relations, actionId, callbackId, channelName);
|
|
|
+ return {
|
|
|
+ allowedRelations, disallowedGrowiUrls, commandName, rejectedResults,
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ async checkEachRelation(relation:Relation, actionId:string, callbackId:string, channelName:string):Promise<checkEachRelationResult> {
|
|
|
+
|
|
|
+ let allowedRelation:Relation|null = null;
|
|
|
+ let disallowedGrowiUrl:string|null = null;
|
|
|
+ let eachRelationCommandName = '';
|
|
|
+
|
|
|
+ let permissionForInteractions:boolean|string[];
|
|
|
+ const singleUse = Object.keys(relation.permissionsForSingleUseCommands);
|
|
|
+ const broadCastUse = Object.keys(relation.permissionsForBroadcastUseCommands);
|
|
|
+
|
|
|
+ [...singleUse, ...broadCastUse].forEach(async(tempCommandName) => {
|
|
|
+
|
|
|
+ // ex. search OR search:handlerName
|
|
|
+ const commandRegExp = new RegExp(`(^${tempCommandName}$)|(^${tempCommandName}:\\w+)`);
|
|
|
+ // skip this forEach loop if the requested command is not in permissionsForBroadcastUseCommands and permissionsForSingleUseCommands
|
|
|
+ if (!commandRegExp.test(actionId) && !commandRegExp.test(callbackId)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ eachRelationCommandName = tempCommandName;
|
|
|
+
|
|
|
+ // case: singleUse
|
|
|
+ permissionForInteractions = relation.permissionsForSingleUseCommands[tempCommandName];
|
|
|
+ // case: broadcastUse
|
|
|
+ if (permissionForInteractions == null) {
|
|
|
+ permissionForInteractions = relation.permissionsForBroadcastUseCommands[tempCommandName];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (permissionForInteractions === true) {
|
|
|
+ allowedRelation = relation;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // check permission at channel level
|
|
|
+ if (Array.isArray(permissionForInteractions) && permissionForInteractions.includes(channelName)) {
|
|
|
+ allowedRelation = relation;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ disallowedGrowiUrl = relation.growiUri;
|
|
|
+ });
|
|
|
+
|
|
|
+ return { allowedRelation, disallowedGrowiUrl, eachRelationCommandName };
|
|
|
}
|
|
|
|
|
|
async relationsResult(
|