Skip to content

Commit

Permalink
fix: 위치 기반 앨범api 수정사항 반영, 문서화
Browse files Browse the repository at this point in the history
  • Loading branch information
sunyou10 committed Nov 7, 2024
1 parent a03c4ac commit 935cb66
Show file tree
Hide file tree
Showing 6 changed files with 252 additions and 28 deletions.
94 changes: 87 additions & 7 deletions build/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -922,13 +922,6 @@ paths:
type: string
example: 하루필름
description: 필터링할 포토부스 브랜드명
- in: query
name: location
required: false
schema:
type: boolean
example: true
description: '사용자 현재 위치를 기반으로 필터링 여부 (true: 현재 위치 기반)'
- in: query
name: hashtag
required: false
Expand Down Expand Up @@ -968,6 +961,93 @@ paths:
description: 사진이 존재하지 않거나 조회된 사진이 없는 경우
'500':
description: 서버 오류
'/api/album/{user_id}/location':
get:
summary: 특정 위치 기반으로 반경 1km 내의 포토부스에서 촬영된 사진 조회
description: 사용자 ID에 따라 포토부스 반경 1km 내에서 촬영된 사진들을 조회하고 검색어를 통해 위치 기반 검색을 수행합니다.
parameters:
- name: user_id
in: path
required: true
schema:
type: string
description: 조회할 사용자의 ID
- name: latitude
in: query
required: false
schema:
type: string
default: '37.6329741'
description: 조회할 위치의 위도 (기본값 제공)
- name: longitude
in: query
required: false
schema:
type: string
default: '127.0798802'
description: 조회할 위치의 경도 (기본값 제공)
- name: searchTerm
in: query
required: false
schema:
type: string
description: 카카오 API를 이용한 위치 검색어. 위치가 검색되면 위도와 경도를 자동으로 설정
responses:
'200':
description: 검색된 반경 내 포토부스에서 촬영된 사진 데이터 반환
content:
application/json:
schema:
type: object
properties:
photonum:
type: integer
description: 사진이 없을 경우 0 반환
images:
type: array
items:
type: string
description: 사진 URL
photo_like:
type: integer
description: 각 사진에 대한 좋아요 수
photo_id:
type: integer
description: 각 사진의 고유 ID
examples:
no_photos:
summary: 사진 없음
value:
photonum: 0
with_photos:
summary: 사진 있음
value:
- images: 'https://example.com/photo1.jpg'
photo_like: 42
photo_id: 1
- images: 'https://example.com/photo2.jpg'
photo_like: 35
photo_id: 2
'404':
description: 검색어 위치를 찾을 수 없음
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: 검색어의 위치를 찾을 수 없습니다.
'500':
description: 서버 오류
content:
application/json:
schema:
type: object
properties:
error:
type: string
example: Internal Server Error
'/api/photo/like/{photo_id}':
post:
tags:
Expand Down
85 changes: 72 additions & 13 deletions controllers/albumController.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
const Photo = require('../models/photo');
const Photobooth = require('../models/photobooth');
const { Sequelize, Op, fn, col } = require('sequelize');
const axios = require('axios');

const getAlbum = async (req, res) => {
try {
const user_id = req.params.user_id;
const date = req.query.date ? new Date(req.query.date) : null;
const brand = req.query.brand ? req.query.brand : null;
const location = req.query.location ? req.query.location : null;
const hashtag = req.query.hashtag ? req.query.hashtag : null; // 해시태그 검색 값 추가

let photos;
Expand Down Expand Up @@ -42,17 +42,6 @@ const getAlbum = async (req, res) => {
order: [['date', 'DESC']],
attributes: ['image_url', 'photo_like', 'id'],
});
} else if (location && req.nearbyBoothIds && req.nearbyBoothIds.length > 0) {
// location 필터링 - 미들웨어 반환값 이용, 현재위치 시에는 location=true로 받아야함
console.log("location으로 들어옴");
photos = await Photo.findAll({
where: {
user_id: user_id,
photobooth_id: { [Op.in]: req.nearbyBoothIds },
},
order: [['date', 'DESC']],
attributes: ['image_url', 'photo_like', 'id'],
});
} else if (hashtag) { // 해시태그 필터링
console.log("hashtag로 들어옴");
photos = await Photo.findAll({
Expand Down Expand Up @@ -97,4 +86,74 @@ const getAlbum = async (req, res) => {
}
};

module.exports = { getAlbum };
const getNearAlbum = async (req, res) => {
const user_id = req.params.user_id;
let latitude, longitude;
if (searchTerm = req.query.searchTerm){
try {
const kakaoUrl = `https://dapi.kakao.com/v2/local/search/keyword.json?query=${searchTerm}`;
const kakaoSecretKey = process.env.KAKAO_ID;

const response = await axios.get(kakaoUrl, {
headers: {
Authorization: `KakaoAK ${kakaoSecretKey}`
}
});
console.log(response.data.documents[0].place_name);
longitude = response.data.documents[0].x;
latitude = response.data.documents[0].y;
} catch (err) {
console.error(err);
res.status(404).json({ message: '검색어의 위치를 찾을 수 없습니다.'});
}
} else {
latitude = req.query.latitude ? req.query.latitude : '37.6329741';
longitude = req.query.longitude ? req.query.longitude : '127.0798802';
}

console.log("latitude: ", latitude, "longitude: ", longitude)
const radius = 1000;

try {
const photobooths = await Photobooth.findAll({
where: Sequelize.where(
Sequelize.fn(
'ST_Distance_Sphere',
Sequelize.literal(`POINT(${longitude}, ${latitude})`),
Sequelize.literal(`POINT(longitude, latitude)`)
),
{
[Op.lte]: radius
}
)
});

const boothIds = photobooths.map(booth => booth.id);

const photos = await Photo.findAll({
where: {
user_id: user_id,
photobooth_id: {
[Op.in]: boothIds
}
}
});

if (photos.length === 0) {
return res.status(200).json({ photonum: 0 });
};

const response = photos.map((photo) => ({
images: photo.image_url,
photo_like: photo.photo_like,
photo_id :photo.id ,
}));

return res.status(200).json(response);
} catch(err) {
console.error("getPhoto error", err);
return res.status(500).json({ error: "Internal Server Error" });
}
};

module.exports = { getAlbum, getNearAlbum };
89 changes: 89 additions & 0 deletions docs/album-location.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
get:
summary: 특정 위치 기반으로 반경 1km 내의 포토부스에서 촬영된 사진 조회
description: 사용자 ID에 따라 포토부스 반경 1km 내에서 촬영된 사진들을 조회하고 검색어를 통해 위치 기반 검색을 수행합니다.
parameters:
- name: user_id
in: path
required: true
schema:
type: string
description: 조회할 사용자의 ID
- name: latitude
in: query
required: false
schema:
type: string
default: "37.6329741"
description: 조회할 위치의 위도 (기본값 제공)
- name: longitude
in: query
required: false
schema:
type: string
default: "127.0798802"
description: 조회할 위치의 경도 (기본값 제공)
- name: searchTerm
in: query
required: false
schema:
type: string
description: 카카오 API를 이용한 위치 검색어. 위치가 검색되면 위도와 경도를 자동으로 설정

responses:
'200':
description: 검색된 반경 내 포토부스에서 촬영된 사진 데이터 반환
content:
application/json:
schema:
type: object
properties:
photonum:
type: integer
description: 사진이 없을 경우 0 반환
images:
type: array
items:
type: string
description: 사진 URL
photo_like:
type: integer
description: 각 사진에 대한 좋아요 수
photo_id:
type: integer
description: 각 사진의 고유 ID
examples:
no_photos:
summary: 사진 없음
value:
photonum: 0
with_photos:
summary: 사진 있음
value:
- images: "https://example.com/photo1.jpg"
photo_like: 42
photo_id: 1
- images: "https://example.com/photo2.jpg"
photo_like: 35
photo_id: 2

'404':
description: 검색어 위치를 찾을 수 없음
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: 검색어의 위치를 찾을 수 없습니다.

'500':
description: 서버 오류
content:
application/json:
schema:
type: object
properties:
error:
type: string
example: Internal Server Error
7 changes: 0 additions & 7 deletions docs/album.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,6 @@ get:
type: string
example: "하루필름"
description: "필터링할 포토부스 브랜드명"
- in: query
name: location
required: false
schema:
type: boolean
example: true
description: "사용자 현재 위치를 기반으로 필터링 여부 (true: 현재 위치 기반)"
- in: query
name: hashtag
required: false
Expand Down
2 changes: 2 additions & 0 deletions docs/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ paths:
$ref: './map-search.yaml'
/api/album/{user_id}:
$ref: './album.yaml'
/api/album/{user_id}/location:
$ref: './album-location.yaml'
/api/photo/like/{photo_id}:
$ref: './photo-like.yaml'
/api/photo/toggleLike/{photo_id}:
Expand Down
3 changes: 2 additions & 1 deletion routes/albumRouter.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
const express = require('express');
const router = express.Router();
const { getNearbyBooths } = require('../middlewares/location');
const {getAlbum} = require('../controllers/albumController');
const { getAlbum, getNearAlbum } = require('../controllers/albumController');

// 앨범 조회용 라우트
router.get('/:user_id', getNearbyBooths , getAlbum);
router.get('/:user_id/location', getNearAlbum);

module.exports = router;

0 comments on commit 935cb66

Please sign in to comment.