Skip to content

Commit

Permalink
Merge pull request #49 from 9oormthonUniv-seoultech/docs/#34
Browse files Browse the repository at this point in the history
feat:부스위치api
  • Loading branch information
sooieese00 authored Nov 7, 2024
2 parents 1500089 + 21927d1 commit a03c4ac
Show file tree
Hide file tree
Showing 8 changed files with 244 additions and 98 deletions.
76 changes: 66 additions & 10 deletions build/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -662,7 +662,7 @@ paths:
tags:
- Review
summary: Get photobooth rating and review photos
description: '해당 포토부스의 평점과 각 리뷰의 첫 번째 사진, 전체 사진 개수를 가져옴'
description: '해당 포토부스의 평점과 각 리뷰의 최대 4개의 이미지, 전체 사진 개수를 가져옴'
parameters:
- in: path
name: photobooth_id
Expand All @@ -686,16 +686,13 @@ paths:
reviewPhotos:
type: array
items:
type: object
properties:
Image:
type: string
description: 각 리뷰의 첫 번째 이미지 URL
example: 'https://amazonaws.com/pocket-imagetest2.jpg'
type: string
description: 리뷰에서 최대 4개의 이미지 URL
example: 'https://amazonaws.com/pocket-imagetest2.jpg'
totalImageCount:
type: integer
description: 해당 포토부스의 모든 리뷰 사진 총 개수
example: 4
example: 10
'404':
description: 포토부스를 찾을 수 없습니다.
content:
Expand Down Expand Up @@ -1772,6 +1769,7 @@ paths:
message:
type: string
example: 즐겨찾기 해제에 실패했습니다.
'/api/booth/{photobooth_id}':
get:
tags:
- Booth
Expand Down Expand Up @@ -1838,5 +1836,63 @@ paths:
message:
type: string
example: 부스 정보를 가져오는 데 실패했습니다.
'/api/booth/{photobooth_id}':
$ref: '#/paths/~1api~1booth~1'
'/api/booth/location/{phtobooth_id}':
get:
tags:
- Booth
summary: 포토부스 위치 정보 조회
description: '포토부스 ID를 통해 해당 부스의 이름, 위도, 경도, 평점을 조회합니다.'
parameters:
- in: path
name: photobooth_id
required: true
schema:
type: integer
description: 조회할 포토부스의 ID
responses:
'200':
description: 포토부스 위치 정보 조회 성공
content:
application/json:
schema:
type: object
properties:
booth_name:
type: string
description: 포토부스 이름
example: 인생네컷 홍대점
latitude:
type: number
format: float
description: 포토부스의 위도
example: 37.5665
longitude:
type: number
format: float
description: 포토부스의 경도
example: 126.978
rating:
type: number
format: float
description: 포토부스의 평점
example: 4.5
'404':
description: 해당 ID의 포토부스를 찾을 수 없는 경우
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: 해당 포토부스를 찾을 수 없습니다.
'500':
description: 서버 오류 발생 시
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: 포토부스 정보를 가져오는 데 실패했습니다.
56 changes: 43 additions & 13 deletions controllers/boothPhotoController.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,35 @@ const getBoothPhotos = async (req, res) => {
return res.status(404).json({ message: '해당 부스를 찾을 수 없습니다.' });
}

// 해당 부스의 리뷰에서 각 리뷰 첫 번째 사진과 전체 사진 개수 가져오기
// 해당 부스의 리뷰에서 각 리뷰의 최대 4개의 이미지와 전체 사진 개수 가져오기
const reviews = await Review.findAll({
where: { photobooth_id: photobooth_id },
order: [['date', 'DESC']],
attributes: ['image_url'],
});

let totalImageCount = 0; // 부스의 전체 사진 개수를 계산할 변수
const reviewPhotos = reviews.map((review) => {
let totalImageCount = 0;
const reviewPhotos = [];

for (const review of reviews) {
let images = [];
try {
images = review.image_url ? JSON.parse(review.image_url) : []; // image_url을 배열로 변환
images = review.image_url ? JSON.parse(review.image_url) : [];
} catch (error) {
console.error(`Failed to parse image_url for review ${review.id}:`, error);
}

totalImageCount += images.length; // 각 리뷰의 이미지 개수를 총합에 추가
totalImageCount += images.length;

return {
Image: images[0] || null, // 첫 번째 이미지 URL (없으면 null)
};
});
// 최대 4개의 이미지만 추출
reviewPhotos.push(...images.slice(0, 4));
if (reviewPhotos.length >= 4) break;
}

res.status(200).json({
rating: photobooth.rating,
reviewPhotos: reviewPhotos,
totalImageCount: totalImageCount, // 부스의 전체 사진 개수
reviewPhotos: reviewPhotos.slice(0, 4),
totalImageCount: totalImageCount,
});
} catch (error) {
console.error('부스 리뷰 사진 조회 중 오류:', error);
Expand All @@ -60,14 +63,15 @@ const getBoothModal = async (req, res) => {
});

if (!booth) {
res.status(404).json({ message: '해당 부스를 찾을 수 없습니다.' });
return res.status(404).json({ message: '해당 부스를 찾을 수 없습니다.' });
}

// 부스 리뷰 개수와 첫 번째 이미지, 이미지 개수
const reviews = await Review.findAll({
where: { photobooth_id: photobooth_id },
order: [['date', 'DESC']],
attributes: ['image_url'],
limit:4,
});

const reviewCount = reviews.length;
Expand Down Expand Up @@ -106,4 +110,30 @@ const getBoothModal = async (req, res) => {
}
};

module.exports = { getBoothPhotos , getBoothModal };
// 포토부스 위치 정보 가져오기
const getBoothLocation = async (req, res) => {
try {
const { photobooth_id } = req.params;

const booth = await Photobooth.findByPk(photobooth_id, {
attributes: ['name', 'latitude', 'longitude', 'rating'],
});

if (!booth) {
res.status(404).json({ message: '해당 포토부스를 찾을 수 없습니다.' });
}

res.status(200).json({
booth_name: booth.name,
latitude: booth.latitude,
longitude: booth.longitude,
rating: booth.rating,
});
} catch (error) {
console.error('getBoothLocation Error:', error);
res.status(500).json({ message: '포토부스 정보를 가져오는 데 실패했습니다.' });
}
};


module.exports = { getBoothPhotos , getBoothModal, getBoothLocation };
66 changes: 1 addition & 65 deletions docs/booth-like-add-delete.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -99,68 +99,4 @@ delete:
properties:
message:
type: string
example: "즐겨찾기 해제에 실패했습니다."
get:
tags:
- Booth
summary: "부스 모달창 정보 조회"
description: "모달창에 들어갈 부스의 평점, 상위 두 개의 키워드, 이미지 개수, 첫 번째 이미지, 리뷰 개수를 반환합니다."
parameters:
- in: path
name: photobooth_id
required: true
schema:
type: integer
description: "조회할 포토부스의 ID"
responses:
200:
description: "부스 모달 정보 조회 성공"
content:
application/json:
schema:
type: object
properties:
rating:
type: number
format: float
description: "포토부스 평점"
example: 4.3
topHashtag:
type: array
items:
type: string
description: "가장 많이 사용된 상위 두 개의 해시태그"
example: ["인생네컷", "친구"]
imageCount:
type: integer
description: "포토부스 리뷰의 전체 이미지 개수"
example: 15
firstImage:
type: string
nullable: true
description: "리뷰에서 가장 첫 번째 이미지의 URL"
example: "https://example.com/photo.jpg"
reviewCount:
type: integer
description: "부스 리뷰 개수"
example: 5
404:
description: "해당 포토부스를 찾을 수 없는 경우"
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: "해당 부스를 찾을 수 없습니다."
500:
description: "서버 오류"
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: "부스 정보를 가져오는 데 실패했습니다."
example: "즐겨찾기 해제에 실패했습니다."
59 changes: 59 additions & 0 deletions docs/booth-location.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
get:
tags:
- Booth
summary: "포토부스 위치 정보 조회"
description: "포토부스 ID를 통해 해당 부스의 이름, 위도, 경도, 평점을 조회합니다."
parameters:
- in: path
name: photobooth_id
required: true
schema:
type: integer
description: "조회할 포토부스의 ID"
responses:
200:
description: "포토부스 위치 정보 조회 성공"
content:
application/json:
schema:
type: object
properties:
booth_name:
type: string
description: "포토부스 이름"
example: "인생네컷 홍대점"
latitude:
type: number
format: float
description: "포토부스의 위도"
example: 37.5665
longitude:
type: number
format: float
description: "포토부스의 경도"
example: 126.978
rating:
type: number
format: float
description: "포토부스의 평점"
example: 4.5
404:
description: "해당 ID의 포토부스를 찾을 수 없는 경우"
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: "해당 포토부스를 찾을 수 없습니다."
500:
description: "서버 오류 발생 시"
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: "포토부스 정보를 가져오는 데 실패했습니다."
64 changes: 64 additions & 0 deletions docs/booth-modal.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
get:
tags:
- Booth
summary: "부스 모달창 정보 조회"
description: "모달창에 들어갈 부스의 평점, 상위 두 개의 키워드, 이미지 개수, 첫 번째 이미지, 리뷰 개수를 반환합니다."
parameters:
- in: path
name: photobooth_id
required: true
schema:
type: integer
description: "조회할 포토부스의 ID"
responses:
200:
description: "부스 모달 정보 조회 성공"
content:
application/json:
schema:
type: object
properties:
rating:
type: number
format: float
description: "포토부스 평점"
example: 4.3
topHashtag:
type: array
items:
type: string
description: "가장 많이 사용된 상위 두 개의 해시태그"
example: ["인생네컷", "친구"]
imageCount:
type: integer
description: "포토부스 리뷰의 전체 이미지 개수"
example: 15
firstImage:
type: string
nullable: true
description: "리뷰에서 가장 첫 번째 이미지의 URL"
example: "https://example.com/photo.jpg"
reviewCount:
type: integer
description: "부스 리뷰 개수"
example: 5
404:
description: "해당 포토부스를 찾을 수 없는 경우"
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: "해당 부스를 찾을 수 없습니다."
500:
description: "서버 오류"
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: "부스 정보를 가져오는 데 실패했습니다."
Loading

0 comments on commit a03c4ac

Please sign in to comment.