diff --git a/src/domains/keyword/keywordController.js b/src/domains/keyword/keywordController.js index d307c8e..029223a 100644 --- a/src/domains/keyword/keywordController.js +++ b/src/domains/keyword/keywordController.js @@ -1,6 +1,36 @@ -const { fetchArticlesByKeyword, fetchArticlesByCompany, fetchArticleCounts, fetchKeywords } = require("./keywordService"); +const { fetchArticleTotalCount, fetchArticlesByKeyword, fetchArticlesByCompany, fetchArticleCounts, fetchKeywords } = require("./keywordService"); const redis = require("../../config/redis.js"); // Redis 클라이언트 불러오기 +const getArticleTotalCount = async (req, res) => { + const keywords = req.query.keywords ? req.query.keywords.split(',') : []; + + if (keywords.length === 0) { + return res.status(400).json({ error: "At least one keyword is required" }); + } + + console.log("조회 키워드:", keywords); + + try { + const results = await Promise.all( + keywords.map(async (keyword) => { + const totalCount = await fetchArticleTotalCount(keyword); + return { keyword, totalCount }; + }) + ); + + // 키워드별 totalCount만 반환 + const response = Object.fromEntries( + results.map(({ keyword, totalCount }) => [keyword, totalCount]) + ); + + res.status(200).json(response); + } catch (error) { + console.error("Error fetching totalCounts:", error.message); + res.status(500).json({ error: "Failed to fetch total counts" }); + } +}; + + const getArticlesByKeywords = async (req, res) => { const keywords = req.query.keywords ? req.query.keywords.split(',') : []; @@ -95,4 +125,4 @@ const getKeywords = async (req, res) => { }; -module.exports = { getArticlesByKeywords, getArticlesByCompany, getArticleCounts, getKeywords }; +module.exports = { getArticleTotalCount, getArticlesByKeywords, getArticlesByCompany, getArticleCounts, getKeywords }; diff --git a/src/domains/keyword/keywordRoutes.js b/src/domains/keyword/keywordRoutes.js index 143c524..8dab15f 100644 --- a/src/domains/keyword/keywordRoutes.js +++ b/src/domains/keyword/keywordRoutes.js @@ -1,15 +1,18 @@ const express = require('express'); -const { getArticlesByKeywords, getArticlesByCompany, getArticleCounts, getKeywords } = require('./keywordController.js'); +const { getArticleTotalCount, getArticlesByKeywords, getArticlesByCompany, getArticleCounts, getKeywords } = require('./keywordController.js'); const router = express.Router(); -// 특정 키워드를 포함한 언론사 별 기사 목록 조회 +// 키워드 별 기사 개수 조회 +router.get('/articles/count/total', getArticleTotalCount); + +// 특정 키워드를 포함한 언론사 별 기사 목록 조회 (list?keywords=a,b,c) router.get('/articles/list', getArticlesByKeywords); -// 키워드별 개수 조회 +// 키워드별 기사 개수 조회 (count?keywords=a,b,c) router.get('/articles/count', getArticleCounts); - +// 특정 키워드에 대한 언론사 별 기사 조회 router.get('/articles/:keyword/:company', getArticlesByCompany); // 키워드 50개 조회 diff --git a/src/domains/keyword/keywordService.js b/src/domains/keyword/keywordService.js index 90b0568..1212730 100644 --- a/src/domains/keyword/keywordService.js +++ b/src/domains/keyword/keywordService.js @@ -1,6 +1,23 @@ const { client: redisClient } = require("../../config/redis.js"); // Redis 클라이언트 설정 const { normalizeData } = require("./redisUtils"); +const fetchArticleTotalCount = async (keyword) => { + try { + const key = "keyword:stats"; + const exists = await redisClient.hExists(key, keyword); + if (!exists) { + console.log(`Key does not exist: ${keyword}`); + return null; + } + + const totalCount = await redisClient.hGet(key, keyword); + return totalCount ? parseInt(totalCount, 10) : 0; + } catch (err) { + console.error("Error fetching totalCount:", err); + throw err; + } +}; + const fetchArticlesByKeyword = async (keyword) => { try { const keyPattern = `keyword:${keyword}:company_articles:*`; @@ -111,4 +128,4 @@ const fetchKeywords = async () => { } }; -module.exports = { fetchArticlesByKeyword, fetchArticlesByCompany, fetchArticleCounts, fetchKeywords }; +module.exports = { fetchArticleTotalCount, fetchArticlesByKeyword, fetchArticlesByCompany, fetchArticleCounts, fetchKeywords };