diff --git a/src/main/java/com/kakaoasset/portfolio/controller/NewsStockController.java b/src/main/java/com/kakaoasset/portfolio/controller/NewsStockController.java new file mode 100644 index 0000000..0899f86 --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/controller/NewsStockController.java @@ -0,0 +1,24 @@ +package com.kakaoasset.portfolio.controller; + +import com.kakaoasset.portfolio.service.NewsStockService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@CrossOrigin(origins = "*") +public class NewsStockController { + + @Autowired + private NewsStockService newsStockService; + + @RequestMapping(value = "/main/news", method = RequestMethod.GET) + public String news(@RequestParam String stockCode) { + String result = ""; + + result = newsStockService.selectNewsStock(stockCode); + + return result; + } + + +} diff --git a/src/main/java/com/kakaoasset/portfolio/controller/RealtimeStockController.java b/src/main/java/com/kakaoasset/portfolio/controller/RealtimeStockController.java new file mode 100644 index 0000000..c123242 --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/controller/RealtimeStockController.java @@ -0,0 +1,23 @@ +package com.kakaoasset.portfolio.controller; +import com.kakaoasset.portfolio.service.RealtimeStockService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@CrossOrigin(origins = "*") +public class RealtimeStockController { + + @Autowired + private RealtimeStockService realtimeStockService; + + @RequestMapping(value = "/main/realtime", method = RequestMethod.GET) + public String realtimeStock(@RequestParam String stock_name){ + + String result = null; + + result = realtimeStockService.selectRealtimeStock(stock_name); + + return result; + } +} + diff --git a/src/main/java/com/kakaoasset/portfolio/controller/SearchRankController.java b/src/main/java/com/kakaoasset/portfolio/controller/SearchRankController.java new file mode 100644 index 0000000..42d3948 --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/controller/SearchRankController.java @@ -0,0 +1,34 @@ +package com.kakaoasset.portfolio.controller; + +import com.kakaoasset.portfolio.service.SearchRankService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * packageName : com.kakaoasset.portfolio.elasticsearch.elasticAPI.controller + * fileName : SearchRankController + * author : Hwang + * date : 2022-11-14 + */ + +@RestController +@CrossOrigin(origins = "*") +public class SearchRankController { + + @Autowired + private SearchRankService searchRankService; + + @RequestMapping(value = "/search/rank", method = RequestMethod.GET) + public String searchRank(){ + + String result = null; + + result = searchRankService.selectSearchRank(); + + return result; + } + +} diff --git a/src/main/java/com/kakaoasset/portfolio/controller/SectorController.java b/src/main/java/com/kakaoasset/portfolio/controller/SectorController.java new file mode 100644 index 0000000..59e3f0f --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/controller/SectorController.java @@ -0,0 +1,30 @@ +package com.kakaoasset.portfolio.controller; + +import com.kakaoasset.portfolio.service.SectorService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * packageName : com.kakaoasset.portfolio.elasticsearch.elasticAPI.controller + * fileName : SectorController + * author : Hwang + * date : 2022-11-14 + */ + +@RestController +@CrossOrigin(origins = "*") +public class SectorController { + + @Autowired + private SectorService sectorService; + + @RequestMapping(value = "/sector", method = RequestMethod.GET) + public String searchRank(@RequestParam String stock_sector){ + + String result = null; + + result = sectorService.selectSectorStock(stock_sector); + + return result; + } +} diff --git a/src/main/java/com/kakaoasset/portfolio/service/NewsStockService.java b/src/main/java/com/kakaoasset/portfolio/service/NewsStockService.java new file mode 100644 index 0000000..b204c58 --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/service/NewsStockService.java @@ -0,0 +1,55 @@ +package com.kakaoasset.portfolio.service; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +@Service +public class NewsStockService { + public String selectNewsStock(String stockCode) { + String result = ""; + JSONArray jsonarr = new JSONArray(); + String detail_url = "https://finance.daum.net/quotes/"; + + // make request for elasticsearch api + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add((request, body, execution) -> { + ClientHttpResponse response = execution.execute(request,body); + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + return response; + }); + + final HttpHeaders headers = new HttpHeaders(); + headers.add("Referer","http://finance.daum.net"); + headers.add("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 OPR/58.0.3135.127"); + final HttpEntity entity = new HttpEntity<>(headers); + try { + // send request to elasticsearch + + result = restTemplate.exchange("https://finance.daum.net/content/news?page=1&perPage=5&category=economy&searchType=all&keyword=" + stockCode, HttpMethod.GET, entity, String.class).getBody(); + }catch (HttpClientErrorException e){ + // no index + return new JSONObject("{\"error\":\"No Index\", \"index\":\""+stockCode+"\"}").toString(); + } + + // 뉴스 크롤링에 대한 response + 상세페이지를 보여주기 위한 newsId + JSONObject json = new JSONObject(result); + if(JSONObject.NULL != json.get("data")){ + for (int i = 0; i < json.getJSONArray("data").length(); i++) { + JSONObject temp = (JSONObject) json.getJSONArray("data").get(i); + String newsId = ((JSONObject)json.getJSONArray("data").get(i)).getString("newsId"); + temp.put("detail_url", detail_url + stockCode + "#news/stock/" + newsId); + jsonarr.put(temp); + } + } + + return jsonarr.toString(); + } +} diff --git a/src/main/java/com/kakaoasset/portfolio/service/RealtimeStockService.java b/src/main/java/com/kakaoasset/portfolio/service/RealtimeStockService.java new file mode 100644 index 0000000..a1824a8 --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/service/RealtimeStockService.java @@ -0,0 +1,51 @@ +package com.kakaoasset.portfolio.service; + + +import org.springframework.beans.factory.annotation.Value; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +@Service +public class RealtimeStockService { + + @Value("${elasticsearch.host}") + private String host; + + public String selectRealtimeStock(String stock_name){ + String index = "stock-data"; + JSONArray jsonarr = new JSONArray(); + String result = null; + + // make request for elasticsearch api + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add((request, body, execution) -> { + ClientHttpResponse response = execution.execute(request,body); + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + return response; + }); + final HttpHeaders headers = new HttpHeaders(); + final HttpEntity entity = new HttpEntity<>(headers); + try { + // send request to elasticsearch + result = restTemplate.exchange("http://"+host+":9200/"+index+"/_search?sort=datetime:acs&size=10000&q=" + stock_name, HttpMethod.GET, entity, String.class).getBody(); + }catch (HttpClientErrorException e){ + // no index + return new JSONObject("{\"error\":\"No Index\", \"index\":\""+stock_name+"\"}").toString(); + } + + JSONObject json = new JSONObject(result); + for (int i = 0; i < json.getJSONObject("hits").getJSONArray("hits").length(); i++) { + JSONObject temp = ((JSONObject) json.getJSONObject("hits").getJSONArray("hits").get(i)).getJSONObject("_source"); + jsonarr.put(temp); + } + return jsonarr.toString(); + } +} diff --git a/src/main/java/com/kakaoasset/portfolio/service/SearchRankService.java b/src/main/java/com/kakaoasset/portfolio/service/SearchRankService.java new file mode 100644 index 0000000..6ea3859 --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/service/SearchRankService.java @@ -0,0 +1,63 @@ +package com.kakaoasset.portfolio.service; + + +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +/** + *packageName : com.kakaoasset.portfolio.elasticsearch.elasticAPI.service + * fileName : SearchRankController + * author : Hwang + * date : 2022-11-14 +*/ + +@Service +public class SearchRankService { + + @Value("${elasticsearch.host}") + private String host; + + public String selectSearchRank(){ + + String index = "stock-rank"; + JSONArray jsonarr = new JSONArray(); + String result = null; + + // make request for elasticsearch api + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add((request, body, execution) -> { + ClientHttpResponse response = execution.execute(request,body); + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + return response; + }); + final HttpHeaders headers = new HttpHeaders(); + final HttpEntity entity = new HttpEntity<>(headers); + try { + // send request to elasticsearch + + result = restTemplate.exchange("http://"+host+":9200/"+index+"/_search?sort=datetime:acs", HttpMethod.GET, entity, String.class).getBody(); + }catch (HttpClientErrorException e){ + // no index + return new JSONObject("{\"error\":\"No Index\"").toString(); + } + + JSONObject json = new JSONObject(result); + + System.out.println("-------------------------------api-search-rank---------------------------"); + + for (int i = 0; i < json.getJSONObject("hits").getJSONArray("hits").length(); i++) { + JSONObject temp = ((JSONObject) json.getJSONObject("hits").getJSONArray("hits").get(i)).getJSONObject("_source"); + jsonarr.put(temp); + } + return jsonarr.toString(); + } +} diff --git a/src/main/java/com/kakaoasset/portfolio/service/SectorService.java b/src/main/java/com/kakaoasset/portfolio/service/SectorService.java new file mode 100644 index 0000000..53b1322 --- /dev/null +++ b/src/main/java/com/kakaoasset/portfolio/service/SectorService.java @@ -0,0 +1,138 @@ +package com.kakaoasset.portfolio.service; + +import com.fasterxml.jackson.databind.JsonNode; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +/** + * packageName : com.kakaoasset.portfolio.elasticsearch.elasticAPI.service + * fileName : SectorService + * author : Hwang + * date : 2022-11-14 + */ + +@Service +public class SectorService { + @Value("${elasticsearch.host}") + private String host; + + public String selectSectorStock(String stock_sector){ + String index = "stock-data"; + JSONArray jsonarr = new JSONArray(); + String result = null; + String personResultAsJsonStr = null; + + // make request for elasticsearch api + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add((request, body, execution) -> { + ClientHttpResponse response = execution.execute(request,body); + response.getHeaders().setContentType(MediaType.APPLICATION_JSON); + return response; + }); + final HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + final HttpEntity entity = new HttpEntity<>(headers); + + String req_body = "{\n" + + " \"size\": 0,\n" + + " \"query\": {\n" + + " \"term\": {\n" + + " \"sectorCode.keyword\": {\n" + + " \"value\": \""+stock_sector+"\",\n" + + " \"boost\": 1.0\n" + + " }\n" + + " }\n" + + " },\n" + + " \"_source\": false,\n" + + " \"stored_fields\": \"none\",\n" + + " \"aggregations\": {\n" + + " \"groupby\": {\n" + + " \"composite\": {\n" + + " \"size\": 1000,\n" + + " \"sources\": [\n" + + " {\n" + + " \"ad594295\": {\n" + + " \"terms\": {\n" + + " \"field\": \"name.keyword\",\n" + + " \"missing_bucket\": true,\n" + + " \"order\": \"asc\"\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"aggregations\": {\n" + + " \"cae43aee\": {\n" + + " \"top_hits\": {\n" + + " \"from\": 0,\n" + + " \"size\": 1,\n" + + " \"version\": false,\n" + + " \"seq_no_primary_term\": false,\n" + + " \"explain\": false,\n" + + " \"docvalue_fields\": [\n" + + " {\n" + + " \"field\": \"datetime.keyword\"\n" + + " }\n" + + " ],\n" + + " \"sort\": [\n" + + " {\n" + + " \"datetime.keyword\": {\n" + + " \"order\": \"desc\",\n" + + " \"missing\": \"_last\",\n" + + " \"unmapped_type\": \"text\"\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + try { + // send request to elasticsearch + + JSONObject req_json = new JSONObject(req_body); + + HttpEntity request = + new HttpEntity(req_json.toString(), headers); + + personResultAsJsonStr = + restTemplate.postForObject("http://"+host+":9200/"+index+"/_search", request, String.class); + + }catch (HttpClientErrorException e){ + // no index + System.out.println("e = " + e); + return new JSONObject("{\"error\":\"No Index\", \"sector\":\""+stock_sector+"\"}").toString(); + } + + JSONObject json = new JSONObject(personResultAsJsonStr); + + for (int i = 0; i < json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").length(); i++) { + JSONObject temp = new JSONObject(); + temp.put("name",((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).getJSONObject("_source").get("name")); + temp.put("tradePrice",((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).getJSONObject("_source").get("tradePrice")); + temp.put("prevAccTradeVolumeChangeRate", ((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).getJSONObject("_source").get("prevAccTradeVolumeChangeRate")); + temp.put("accTradeVolume", ((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).getJSONObject("_source").get("accTradeVolume")); + temp.put("accTradePrice", ((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).getJSONObject("_source").get("accTradePrice")); + temp.put("marketCap", ((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).getJSONObject("_source").get("marketCap")); + temp.put("foreignRatio", ((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).getJSONObject("_source").get("foreignRatio")); + temp.put("id", ((JSONObject) ((JSONObject) json.getJSONObject("aggregations").getJSONObject("groupby").getJSONArray("buckets").get(i)).getJSONObject("cae43aee").getJSONObject("hits").getJSONArray("hits").get(0)).get("_id")); + + jsonarr.put(temp); + + + } + return jsonarr.toString(); + } + +}