From 09d07ec0dd367582d806c0de07dd9d7366a8cbcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=B1=EA=B2=BD?= Date: Tue, 22 Sep 2026 09:58:27 +0900 Subject: [PATCH] =?UTF-8?q?[fix]=20solution:=20Threads=20OAuth=20=EC=BD=9C?= =?UTF-8?q?=EB=B0=B1=20=ED=95=A8=EC=88=98=EB=AA=85=EC=9D=B4=20React=20useC?= =?UTF-8?q?allback=EA=B3=BC=20=EC=B6=A9=EB=8F=8C=20=E2=80=94=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=EC=8B=A4=ED=8C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit solution-site 빌드가 TS2440(Import declaration conflicts with local declaration of 'useCallback')로 실패했다. FastAPI 라우트 핸들러 함수명이 `callback`이라 orval이 만든 React Query 훅 이름이 `useCallback`이 됐고, 같은 파일에서 import한 React의 useCallback과 이름이 겹쳤다. - router/v1/social/oauth.py: 함수명 callback → oauth_callback - 백엔드 재빌드 후 npm run orval 로 재생성 → useOauthCallback, callbackParams.ts → oauthCallbackParams.ts docker compose build solution-site 로 재검증, 정상 빌드 확인 --- solution/backend/router/v1/social/oauth.py | 2 +- .../frontend/src/api/generated/model/index.ts | 2 +- ...llbackParams.ts => oauthCallbackParams.ts} | 2 +- .../frontend/src/api/generated/site/site.ts | 4 +- .../src/api/generated/social/social.ts | 78 +++++++++---------- 5 files changed, 43 insertions(+), 45 deletions(-) rename solution/frontend/src/api/generated/model/{callbackParams.ts => oauthCallbackParams.ts} (88%) diff --git a/solution/backend/router/v1/social/oauth.py b/solution/backend/router/v1/social/oauth.py index 6592a0e..f09c96e 100644 --- a/solution/backend/router/v1/social/oauth.py +++ b/solution/backend/router/v1/social/oauth.py @@ -31,7 +31,7 @@ async def connect(response: Response, user: UserInfo = Depends(IsValidAccessToke @router.get("/callback") -async def callback( +async def oauth_callback( request: Request, state: str = Query("", max_length=2048), code: str = Query("", max_length=4096), diff --git a/solution/frontend/src/api/generated/model/index.ts b/solution/frontend/src/api/generated/model/index.ts index 4c79567..273a6d6 100644 --- a/solution/frontend/src/api/generated/model/index.ts +++ b/solution/frontend/src/api/generated/model/index.ts @@ -11,7 +11,6 @@ export * from "./auditCheckData"; export * from "./auditCheckDataRecommendation"; export * from "./authProvider"; export * from "./buildStatus"; -export * from "./callbackParams"; export * from "./checkSlugParams"; export * from "./decision"; export * from "./errorInfo"; @@ -107,6 +106,7 @@ export * from "./mySiteDataSiteId"; export * from "./mySiteDataStatus"; export * from "./mySiteDataTemplateId"; export * from "./mySiteDataThumbnailUrl"; +export * from "./oauthCallbackParams"; export * from "./placeCandidate"; export * from "./placeCandidateAddress"; export * from "./placeCandidateCategoryName"; diff --git a/solution/frontend/src/api/generated/model/callbackParams.ts b/solution/frontend/src/api/generated/model/oauthCallbackParams.ts similarity index 88% rename from solution/frontend/src/api/generated/model/callbackParams.ts rename to solution/frontend/src/api/generated/model/oauthCallbackParams.ts index 4e39e44..3256389 100644 --- a/solution/frontend/src/api/generated/model/callbackParams.ts +++ b/solution/frontend/src/api/generated/model/oauthCallbackParams.ts @@ -5,7 +5,7 @@ * OpenAPI spec version: 0.1.0 */ -export type CallbackParams = { +export type OauthCallbackParams = { /** * @maxLength 2048 */ diff --git a/solution/frontend/src/api/generated/site/site.ts b/solution/frontend/src/api/generated/site/site.ts index 41f3376..1f94ae5 100644 --- a/solution/frontend/src/api/generated/site/site.ts +++ b/solution/frontend/src/api/generated/site/site.ts @@ -2825,7 +2825,7 @@ export const useApproveMyPost = < return useMutation(mutationOptions, queryClient); }; /** - * @summary 지금 발송하기 — 아침 9시 스윕을 기다리지 않고 이 업장의 오늘 몫을 바로 보낸다 + * @summary 승인 알림보내기 — 아침 9시 스윕을 기다리지 않고 이 업장의 오늘 몫을 바로 보낸다 */ export const sendMyPostsNow = ( placeId: string, @@ -2883,7 +2883,7 @@ export type SendMyPostsNowMutationResult = NonNullable< export type SendMyPostsNowMutationError = HTTPValidationError; /** - * @summary 지금 발송하기 — 아침 9시 스윕을 기다리지 않고 이 업장의 오늘 몫을 바로 보낸다 + * @summary 승인 알림보내기 — 아침 9시 스윕을 기다리지 않고 이 업장의 오늘 몫을 바로 보낸다 */ export const useSendMyPostsNow = < TError = HTTPValidationError, diff --git a/solution/frontend/src/api/generated/social/social.ts b/solution/frontend/src/api/generated/social/social.ts index 7d19f19..c1c35c8 100644 --- a/solution/frontend/src/api/generated/social/social.ts +++ b/solution/frontend/src/api/generated/social/social.ts @@ -20,14 +20,12 @@ import type { UseQueryResult, } from "@tanstack/react-query"; -import { useCallback } from "react"; - import type { ApprovalParams, - CallbackParams, Decision, HTTPValidationError, LinkDecision, + OauthCallbackParams, TestPost, } from ".././model"; @@ -994,10 +992,10 @@ export const useConnect = ( return useMutation(mutationOptions, queryClient); }; /** - * @summary Callback + * @summary Oauth Callback */ -export const callback = ( - params?: CallbackParams, +export const oauthCallback = ( + params?: OauthCallbackParams, options?: SecondParameter, signal?: AbortSignal, ) => { @@ -1007,56 +1005,56 @@ export const callback = ( ); }; -export const getCallbackQueryKey = (params?: CallbackParams) => { +export const getOauthCallbackQueryKey = (params?: OauthCallbackParams) => { return [`/v1/social/oauth/callback`, ...(params ? [params] : [])] as const; }; -export const getCallbackQueryOptions = < - TData = Awaited>, +export const getOauthCallbackQueryOptions = < + TData = Awaited>, TError = HTTPValidationError, >( - params?: CallbackParams, + params?: OauthCallbackParams, options?: { query?: Partial< - UseQueryOptions>, TError, TData> + UseQueryOptions>, TError, TData> >; request?: SecondParameter; }, ) => { const { query: queryOptions, request: requestOptions } = options ?? {}; - const queryKey = queryOptions?.queryKey ?? getCallbackQueryKey(params); + const queryKey = queryOptions?.queryKey ?? getOauthCallbackQueryKey(params); - const queryFn: QueryFunction>> = ({ + const queryFn: QueryFunction>> = ({ signal, - }) => callback(params, requestOptions, signal); + }) => oauthCallback(params, requestOptions, signal); return { queryKey, queryFn, ...queryOptions } as UseQueryOptions< - Awaited>, + Awaited>, TError, TData > & { queryKey: DataTag }; }; -export type CallbackQueryResult = NonNullable< - Awaited> +export type OauthCallbackQueryResult = NonNullable< + Awaited> >; -export type CallbackQueryError = HTTPValidationError; +export type OauthCallbackQueryError = HTTPValidationError; -export function useCallback< - TData = Awaited>, +export function useOauthCallback< + TData = Awaited>, TError = HTTPValidationError, >( - params: undefined | CallbackParams, + params: undefined | OauthCallbackParams, options: { query: Partial< - UseQueryOptions>, TError, TData> + UseQueryOptions>, TError, TData> > & Pick< DefinedInitialDataOptions< - Awaited>, + Awaited>, TError, - Awaited> + Awaited> >, "initialData" >; @@ -1066,20 +1064,20 @@ export function useCallback< ): DefinedUseQueryResult & { queryKey: DataTag; }; -export function useCallback< - TData = Awaited>, +export function useOauthCallback< + TData = Awaited>, TError = HTTPValidationError, >( - params?: CallbackParams, + params?: OauthCallbackParams, options?: { query?: Partial< - UseQueryOptions>, TError, TData> + UseQueryOptions>, TError, TData> > & Pick< UndefinedInitialDataOptions< - Awaited>, + Awaited>, TError, - Awaited> + Awaited> >, "initialData" >; @@ -1089,14 +1087,14 @@ export function useCallback< ): UseQueryResult & { queryKey: DataTag; }; -export function useCallback< - TData = Awaited>, +export function useOauthCallback< + TData = Awaited>, TError = HTTPValidationError, >( - params?: CallbackParams, + params?: OauthCallbackParams, options?: { query?: Partial< - UseQueryOptions>, TError, TData> + UseQueryOptions>, TError, TData> >; request?: SecondParameter; }, @@ -1105,17 +1103,17 @@ export function useCallback< queryKey: DataTag; }; /** - * @summary Callback + * @summary Oauth Callback */ -export function useCallback< - TData = Awaited>, +export function useOauthCallback< + TData = Awaited>, TError = HTTPValidationError, >( - params?: CallbackParams, + params?: OauthCallbackParams, options?: { query?: Partial< - UseQueryOptions>, TError, TData> + UseQueryOptions>, TError, TData> >; request?: SecondParameter; }, @@ -1123,7 +1121,7 @@ export function useCallback< ): UseQueryResult & { queryKey: DataTag; } { - const queryOptions = getCallbackQueryOptions(params, options); + const queryOptions = getOauthCallbackQueryOptions(params, options); const query = useQuery(queryOptions, queryClient) as UseQueryResult< TData,