Skip to content

Commit

Permalink
Merge pull request #55 from Romantic-Yeojido/feature/#41-add-swagger-…
Browse files Browse the repository at this point in the history
…docs

#41-update to swagger
  • Loading branch information
kuchic0918 authored Dec 21, 2024
2 parents 6da55eb + 0503003 commit ee67a30
Show file tree
Hide file tree
Showing 7 changed files with 311 additions and 148 deletions.
63 changes: 23 additions & 40 deletions src/controllers/user.home.controller.js
Original file line number Diff line number Diff line change
@@ -1,38 +1,29 @@
// controllers/user.home.controller.js
import { UserHomeService } from '../services/user.home.service.js';
import { RandomMemoryResponseDTO } from '../dtos/user.home.dto.js';
import { StatusCodes } from 'http-status-codes'; // StatusCodes 임포트 추가
import { getTodayMemory, getRandomCompleteMemory } from '../services/user.home.service.js';
import { RandomMemoryResponseDTO } from '../dtos/user.home.dto.js';
import { StatusCodes } from 'http-status-codes';

export class UserHomeController {
constructor() {
this.userHomeService = new UserHomeService();
this.getRandomMemory = this.getRandomMemory.bind(this);
}

async getTodayMemory(req, res) {
try {
const userId = parseInt(req.params.userId);

const memory = await this.userHomeService.getTodayMemory(userId);

return res.status(200).json({
success: true,
data: memory // memory가 없으면 null이 반환됩니다
});
export const getTodayMemoryController = async (req, res) => {
try {
const userId = parseInt(req.params.userId);
const memory = await getTodayMemory(userId);

return res.status(200).json({
success: true,
data: memory
});
} catch (error) {
console.error('추억 조회 중 오류 발생:', error);
return res.status(500).json({
success: false,
message: "추억 조회 중 오류가 발생했습니다"
});
}
};

} catch (error) {
console.error('추억 조회 중 오류 발생:', error);
return res.status(500).json({
success: false,
message: "추억 조회 중 오류가 발생했습니다"
});
}
}

async getRandomMemory(req,res) {
export const getRandomMemoryController = async (req, res) => {
try {
const userId = parseInt(req.params.userId);
const memory = await this.userHomeService.getRandomCompleteMemory(userId);
const memory = await getRandomCompleteMemory(userId);

if (!memory) {
return res.status(StatusCodes.NOT_FOUND).json({
Expand All @@ -42,23 +33,15 @@ export class UserHomeController {
}
const responseData = new RandomMemoryResponseDTO(memory);


res.status(StatusCodes.OK).json({
success: true,
data: responseData
});

} catch (error) {
console.error('Random memory fetch error:', error);
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
success: false,
message: "서버 에러가 발생했습니다"
});
}

}




}
};
1 change: 0 additions & 1 deletion src/dtos/user.home.dto.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// dtos/user.home.dto.js
export class RandomMemoryResponseDTO {
constructor(memory) {
this.title = memory.title;
Expand Down
3 changes: 2 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ app.get("/openapi.json", async (req, res) => {
writeOutputFile: false,
};
const outputFile = "/dev/null";
const routes = ["./src/index.js", "./src/routes/*.router.js"];
const routes = ["./src/index.js", "./src/routes/*.router.js" , "./src/routes/*.route.js"
];

// 요청의 host와 protocol을 동적으로 가져오기
const protocol = req.protocol; // http 또는 https
Expand Down
107 changes: 52 additions & 55 deletions src/repositories/user.home.repository.js
Original file line number Diff line number Diff line change
@@ -1,60 +1,57 @@
// repositories/user.home.repository.js
import { pool } from '../db.config.js';

export class UserHomeRepository {
async findTodayMemory(userId) {
try {
const [rows] = await pool.query(
`SELECT title, visit_date
FROM memories
WHERE DATE_FORMAT(visit_date, '%m-%d') = DATE_FORMAT(CURRENT_DATE, '%m-%d')
AND user_id = ?
AND is_deleted = false
ORDER BY RAND()
LIMIT 1`,
[userId]
);

return rows[0] || null; // 결과가 없으면 null 반환
} catch (error) {
console.error('추억 조회 중 DB 오류:', error);
throw error;
}
export const findTodayMemory = async (userId) => {
try {
const [rows] = await pool.query(
`SELECT title, visit_date
FROM memories
WHERE DATE_FORMAT(visit_date, '%m-%d') = DATE_FORMAT(CURRENT_DATE, '%m-%d')
AND user_id = ?
AND is_deleted = false
ORDER BY RAND()
LIMIT 1`,
[userId]
);

return rows[0] || null;
} catch (error) {
console.error('추억 조회 중 DB 오류:', error);
throw error;
}
async fetchRandomMemory(userId) {
const conn = await pool.getConnection();
try {
const [memories] = await pool.query(
`SELECT
m.title,
m.content,
m.friends,
m.visit_date,
GROUP_CONCAT(mi.image_url) as images
FROM memories m
LEFT JOIN memory_images mi ON m.id = mi.memory_id
WHERE m.user_id = ?
AND m.is_deleted = false
GROUP BY m.id, m.title, m.content, m.friends, m.visit_date
ORDER BY RAND()
LIMIT 1`,
[userId]
);

if (!memories || memories.length === 0) {
return null;
}

const memory = memories[0];
// 콤마 구분된 이미지 URL 문자열을 배열로
memory.images = memory.images ? memory.images.split(',') : [];

return memory;
} catch (error) {
console.error('Repository error:', error);
throw error;
} finally {
conn.release();
};

export const fetchRandomMemory = async (userId) => {
const conn = await pool.getConnection();
try {
const [memories] = await pool.query(
`SELECT
m.title,
m.content,
m.friends,
m.visit_date,
GROUP_CONCAT(mi.image_url) as images
FROM memories m
LEFT JOIN memory_images mi ON m.id = mi.memory_id
WHERE m.user_id = ?
AND m.is_deleted = false
GROUP BY m.id, m.title, m.content, m.friends, m.visit_date
ORDER BY RAND()
LIMIT 1`,
[userId]
);

if (!memories || memories.length === 0) {
return null;
}

const memory = memories[0];
memory.images = memory.images ? memory.images.split(',') : [];

return memory;
} catch (error) {
console.error('Repository error:', error);
throw error;
} finally {
conn.release();
}
}
};
131 changes: 127 additions & 4 deletions src/routes/memo.route.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,134 @@ const router = express.Router();
//등록
router.post("/users/:userId/locations/:locationId", handleMemories);

//수정
router.patch("/user/memories/:memoryId", handleUpdateMemory);
router.patch("/user/memories/:memoryId",
// #swagger.tags = ['Memories']
// #swagger.summary = '추억 수정하기'
// #swagger.description = '사용자의 추억 내용을 수정합니다. visit_date는 수정이 불가능합니다. 수정하고 싶은 필드만 요청에 포함하면 해당 필드만 수정됩니다.'
/* #swagger.parameters['memoryId'] = {
in: 'path',
description: '수정할 추억의 ID',
required: true,
type: 'integer',
example: 1
} */
/* #swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
type: 'object',
required: ['userId'],
properties: {
userId: {
type: 'integer',
description: '사용자 ID (필수)',
example: 1
},
title: {
type: 'string',
description: '수정할 제목 (선택)',
example: '롯데월드에서의 특별한 하루'
},
content: {
type: 'string',
description: '수정할 내용 (선택, 수정 시 자동으로 새로운 summary 생성)',
example: '오늘은 친구들과 롯데월드에서 즐거운 시간을 보냈다.'
},
friends: {
type: 'string',
description: '수정할 친구 목록 (선택)',
example: '영희, 철수, 민수'
}
}
}
}
}
} */
/* #swagger.responses[200] = {
description: '수정 성공',
content: {
"application/json": {
example: {
success: true,
result: {
user_id: 1,
location_id: 1,
title: "롯데월드에서의 특별한 하루",
visit_date: "2024-12-21T00:00:00.000Z",
friends: "영희, 철수, 민수",
content: "오늘은 친구들과 롯데월드에서 즐거운 시간을 보냈다.",
summary: "친구들과 롯데월드에서 즐거운 시간을 보냄"
}
}
}
}
} */
/* #swagger.responses[500] = {
description: '서버 에러',
content: {
"application/json": {
example: {
success: false,
message: "메모리 수정에 실패했습니다."
}
}
}
} */
handleUpdateMemory);

//삭제
router.delete("/user/memories/:memoryId", handleDeleteMemory);
router.patch("/user/memories/delete/:memoryId",
// #swagger.tags = ['Memories']
// #swagger.summary = '추억 삭제하기 (소프트 삭제)'
// #swagger.description = '추억을 소프트 삭제합니다 (is_deleted 플래그를 true로 설정)'
/* #swagger.parameters['memoryId'] = {
in: 'path',
description: '삭제할 추억의 ID',
required: true,
type: 'integer',
example: 1
} */
/* #swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
type: 'object',
required: ['userId'],
properties: {
userId: {
type: 'integer',
description: '사용자 ID (필수)',
example: 1
}
}
}
}
}
} */
/* #swagger.responses[200] = {
description: '삭제 성공',
content: {
"application/json": {
example: {
success: true,
message: "추억이 삭제되었습니다."
}
}
}
} */
/* #swagger.responses[500] = {
description: '서버 에러',
content: {
"application/json": {
example: {
success: false,
message: "추억 삭제 중 오류가 발생했습니다."
}
}
}
} */
handleDeleteMemory);

//불러오기
router.get("/users/:userId/locations/:locationId/memory-content", handleGetMemory);
Expand Down
Loading

0 comments on commit ee67a30

Please sign in to comment.