apiRequest.js 4.08 KB
// api key
require('dotenv').config();

// api key error check
try {
    if( process.env.TEST != "OKAY" ) {
        throw new Error( "키 오류 키파일을 확인하세요" );
    }
}
catch( err ) {
    throw new Error(err);
}
const rp = require("request-promise");

// Api URL
const URL = {
    "ETRI" : "http://aiopen.etri.re.kr:8000/",
    "Korean" : "https://search.naver.com/p/csearch/ocontent/util/SpellerProxy?_callback=&color_blindness=0&q="
}

// ETRI Api Request Format
const apiRequestJsonFrame = {
	"request_id" : "reserved field",
	"access_key" : process.env.ETRI_API_KEY,
	"argument" : {}   
};
            
let apiRequest = {};

/** 
 * @param {String} query 세부 url / 형식은 api사이트 참조
 * @param {Object} argument 필요한 argument / 형식은 api사이트 참조
 * @returns {Object} api사이트에서 정해진 형식의 응답을 받아옵니다. 
 * @description 이 함수는 이미 정해진 url(etri api)+query의
    경로로 argument와 함께 request를 보냅니다.
    그 후 얻은 응답을 js object로 보내줍니다.
*/
apiRequest.ETRI = async ( query, argument ) => {
    return new Promise( ( resolve, reject ) => { 
        let apiReqJson = apiRequestJsonFrame;
        apiReqJson.argument = argument;
        let apiReqOption = {             headers: {
            "Accept": "application/json",
            "Content-Type": "application/json",
          },uri : URL.ETRI + query, body : JSON.stringify( apiReqJson ) };
          
          rp.post( apiReqOption )
          .then( ( body ) => {
              body = JSON.parse( body );
              if( body.result == "-1" ) {
                  throw new Error( body.reason );
              }
              resolve( body );
          })
          .catch( ( err ) => {
              throw new Error( err );
          });      
    })  
}

/** 
 * @param {String} text 고치고 싶은 문장
 * @returns {Object} 정해진 형식의 응답을 보내줍니다.
 * @description 네이버 맞춤법 사이트로 text를 보내서 응답을 받아옵니다.
*/
apiRequest.Korean = async ( text ) => {
    return new Promise( ( resolve,reject ) => {

        rp( { "uri" : URL.Korean+encodeURI( text ) } )
        .then( ( body ) => {
            body = body.substring( 1, body.length - 2 );
            resolve( JSON.parse( body ).message.result );
        })
        .catch( ( err ) => {
            throw new Error( err );
        });
    });
}

apiRequest.multiETRI = async ( searchResults, keywordText ) => {
    try {
        const Promises = await searchResults.map((searchResult, index)=>{
            //return makeOption( searchResults, keywordText, index );
            return DOCVECAPI( searchResults, keywordText, index );
        });
        await Promise.all( Promises );
    }
    catch ( err ) {
        throw new Error( err.message );
    }
}


/** 
 * @param {String} keywordText 사용자의 검색에서 textAnalystic을 거쳐 keyword만 남은 text
 * @param {{title:string,passage:string,ulr:string}} searchResult searchResults keywordtext문장을 검색하여 나온 결과들
 * @returns confidence key와 해당 value가 추가된 searchResults 
 * @description DOCVECAPI를 이용해 각각의 searchResult의 keywordtext에 대한 정확도(confidence, 검색문장에 대해 검색 결과가 얼마나 지)를
 * 판단하고, confidence key와 해당 value를 searchResult에 추가해줍니다.
*/
const DOCVECAPI = (searchResults, keywordText, index) => {
    return new Promise((resolve, reject) => {
      apiReqOption = {
        method: "POST",
        uri: "http://127.0.0.1:5000/analyze",
        body: {
          sentence1: searchResults[index].passage,
          sentence2: keywordText
        },
        json: true
      };
      rp.post(apiReqOption)
        .then(body => {
          if (body.result == "-1") {
            throw new Error(body.data + " index : " + index);
          }
          searchResults[index].confidence = Number(body.result);
          resolve();
        })
        .catch(err => {
          searchResults[index].confidence = 0;
          resolve();
        });
    });
  };

module.exports = apiRequest;