Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 33 additions & 28 deletions src/domains/keyword/keywordController.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
const { fetchArticlesByKeyword, fetchArticlesByCompany, fetchArticleCounts, fetchKeywords } = require("./keywordService");
const redis = require("../../config/redis.js"); // Redis 클라이언트 불러오기

const getArticlesByKeyword = async (req, res) => {
const { keyword } = req.params;
console.log('조회 키워드: ', keyword);
const getArticlesByKeywords = async (req, res) => {
const keywords = req.query.keywords ? req.query.keywords.split(',') : [];

if (!keyword) {
return res.status(400).json({ error: "Keyword is required" });
if (keywords.length === 0) {
return res.status(400).json({ error: "At least one keyword is required" });
}

console.log('조회 키워드:', keywords);

try {
const articles = await fetchArticlesByKeyword(keyword);
res.status(200).json({ keyword, articles });
// 여러 키워드를 병렬로 조회
const results = await Promise.all(
keywords.map(async (keyword) => {
const articles = await fetchArticlesByKeyword(keyword);
return { keyword, articles };
})
);

// 키워드별 기사 리스트 정리
const response = Object.fromEntries(
results.map(({ keyword, articles }) => [keyword, articles])
);

res.status(200).json(response);
} catch (error) {
console.error("Error fetching articles:", error.message);
res.status(500).json({ error: "Failed to fetch articles" });
}
};


const getArticlesByCompany = async (req, res) => {
const { keyword, company } = req.params;
console.log("[getArticlesByCompany] 요청된 키워드:", keyword, "언론사:", company);
Expand All @@ -40,32 +54,23 @@ const getArticlesByCompany = async (req, res) => {
};

const getArticleCounts = async (req, res) => {
const keywords = req.query.keywords ? req.query.keywords.split(',') : [];
const { keyword } = req.params;
console.log('개수 조회 키워드: ', keyword);

if (keywords.length === 0) {
return res.status(400).json({ error: "At least one keyword is required" });
if (!keyword) {
return res.status(400).json({ error: "Keyword is required" });
}

console.log('개수 조회 키워드: ', keywords);

try {
// 여러 키워드를 병렬로 조회
const results = await Promise.all(
keywords.map(keyword => fetchArticleCounts(keyword))
);

// 응답 데이터 정리
const response = Object.fromEntries(
keywords.map((keyword, index) => [
keyword,
results[index] || { error: "Keyword not found in stats" }
])
);
const count = await fetchArticleCounts(keyword);
if (count === null) {
return res.status(404).json({ error: "Keyword not found in stats" });
}

res.status(200).json(response);
res.status(200).json(count);
} catch (error) {
console.error("Error fetching article counts:", error.message);
res.status(500).json({ error: "Failed to fetch article counts" });
console.error("Error fetching article count:", error.message);
res.status(500).json({ error: "Failed to fetch article count" });
}
};

Expand All @@ -81,4 +86,4 @@ const getKeywords = async (req, res) => {
};


module.exports = { getArticlesByKeyword, getArticlesByCompany, getArticleCounts, getKeywords };
module.exports = { getArticlesByKeywords, getArticlesByCompany, getArticleCounts, getKeywords };
2 changes: 1 addition & 1 deletion src/domains/keyword/keywordRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const router = express.Router();
router.get('/articles/count', getArticleCounts);

// 특정 키워드를 포함한 언론사 별 기사 목록 조회
router.get('/articles/:keyword', getArticlesByKeyword);
router.get('/articles', getArticlesByKeyword);

router.get('/articles/:keyword/:company', getArticlesByCompany);

Expand Down
16 changes: 8 additions & 8 deletions src/domains/keyword/keywordService.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,20 @@ const { normalizeData } = require("./redisUtils");

const fetchArticlesByKeyword = async (keyword) => {
try {
// 키 존재 여부 확인
const key = `keyword:${keyword}:company_articles:*`;
const companyKeys = await redisClient.keys(key);
console.log(companyKeys)
const keyPattern = `keyword:${keyword}:company_articles:*`;
const companyKeys = await redisClient.keys(keyPattern);

if (!companyKeys || companyKeys.length === 0) {
console.log(`Key does not exist: ${key}`);
console.log(`Key does not exist: ${keyPattern}`);
return {};
}

const articlesByCompany = {};

await Promise.all(
companyKeys.map(async (companyKey) => {
const company = companyKey.split(":").pop();
const type = await redisClient.type(companyKey); // `TYPE` 명령어 호출

// 키의 데이터 타입 확인
const type = await redisClient.type(companyKey);

let data = [];
if (type === "string") {
Expand All @@ -35,13 +33,15 @@ const fetchArticlesByKeyword = async (keyword) => {
articlesByCompany[company] = data;
})
);

return articlesByCompany;
} catch (err) {
console.error("Error fetching articles by keyword:", err);
throw err;
}
};


const fetchArticlesByCompany = async (keyword, company) => {
console.log(`조회 키워드: ${keyword}, 언론사: ${company}`);

Expand Down