11import { verifyGoogleIdToken , signAccessToken , EXPIRES_IN_SECONDS , signRefreshToken ,
22 REFRESH_EXPIRES_IN_SECONDS , } from "../auth.config.js" ;
3- import { parseIdTokenBody , validateOnboardingBody } from "../dtos/user.dto.js" ;
3+ import { parseIdTokenBody , validateOnboardingBody , validatePatchInterestsBody } from "../dtos/user.dto.js" ;
44import {
55 findUserByProviderOauthId ,
66 createUser ,
@@ -13,6 +13,7 @@ import {
1313 findInterestsByIds ,
1414} from "../repositories/user.repository.js" ;
1515
16+
1617/**
1718 * POST /api/users/oauth2/google
1819 * - Request: { idToken }
@@ -267,4 +268,41 @@ function authFailGoogle() {
267268 success : null ,
268269 } ;
269270 return err ;
270- }
271+ }
272+
273+ /**
274+ * PATCH /api/users/me/interests
275+ * - Request: { interestIds: number[] }
276+ * - Response: { interests: [{id, name}, ...] }
277+ */
278+ export async function patchMyInterestsByUserId ( userId , body ) {
279+ const { interestIds } = validatePatchInterestsBody ( body ) ;
280+
281+ const user = await findUserById ( userId ) ;
282+ if ( ! user ) {
283+ const err = new Error ( "User not found" ) ;
284+ err . statusCode = 404 ;
285+ err . payload = {
286+ resultType : "FAIL" ,
287+ error : { errorCode : "U404" , reason : "사용자 정보를 찾을 수 없습니다." , data : null } ,
288+ success : null ,
289+ } ;
290+ throw err ;
291+ }
292+
293+ // 1) (선택) interest master에 존재하는 id만 남기기
294+ const existing = await findInterestsByIds ( interestIds ) ;
295+ const validIds = existing . map ( ( x ) => x . id ) ;
296+
297+ // 2) userProfile.interests upsert
298+ await upsertUserProfileInterests ( userId , validIds ) ;
299+
300+ // 3) 최신 관심사 목록 반환
301+ return {
302+ resultType : "SUCCESS" ,
303+ error : null ,
304+ success : {
305+ interests : existing , // id/name 형태로 반환
306+ } ,
307+ } ;
308+ }
0 commit comments