diff --git a/src/apis/Admin/api.ts b/src/apis/Admin/api.ts new file mode 100644 index 00000000..48752a1d --- /dev/null +++ b/src/apis/Admin/api.ts @@ -0,0 +1,174 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface VerifyLanguageTestResponse { + id: number; + languageTestType: string; + languageTestScore: string; + verifyStatus: string; + rejectedReason: null; +} + +export type VerifyLanguageTestRequest = Record; + +export interface LanguageTestListResponseSort { + sorted: boolean; + unsorted: boolean; + empty: boolean; +} + +export interface LanguageTestListResponsePageable { + pageNumber: number; + pageSize: number; + sort: LanguageTestListResponsePageableSort; + offset: number; + paged: boolean; + unpaged: boolean; +} + +export interface LanguageTestListResponsePageableSort { + sorted: boolean; + unsorted: boolean; + empty: boolean; +} + +export interface LanguageTestListResponseContentItem { + languageTestScoreStatusResponse: LanguageTestListResponseContentItemLanguageTestScoreStatusResponse; + siteUserResponse: LanguageTestListResponseContentItemSiteUserResponse; +} + +export interface LanguageTestListResponseContentItemSiteUserResponse { + id: number; + nickname: string; + profileImageUrl: string; +} + +export interface LanguageTestListResponseContentItemLanguageTestScoreStatusResponse { + id: number; + languageTestResponse: LanguageTestListResponseContentItemLanguageTestScoreStatusResponseLanguageTestResponse; + verifyStatus: string; + rejectedReason: null; + createdAt: string; + updatedAt: string; +} + +export interface LanguageTestListResponseContentItemLanguageTestScoreStatusResponseLanguageTestResponse { + languageTestType: string; + languageTestScore: string; + languageTestReportUrl: string; +} + +export interface LanguageTestListResponse { + content: LanguageTestListResponseContentItem[]; + pageable: LanguageTestListResponsePageable; + totalElements: number; + totalPages: number; + last: boolean; + size: number; + number: number; + sort: LanguageTestListResponseSort; + numberOfElements: number; + first: boolean; + empty: boolean; +} + +export interface VerifyGpaResponse { + id: number; + gpa: number; + gpaCriteria: number; + verifyStatus: string; + rejectedReason: null; +} + +export type VerifyGpaRequest = Record; + +export interface GpaListResponseSort { + sorted: boolean; + unsorted: boolean; + empty: boolean; +} + +export interface GpaListResponsePageable { + pageNumber: number; + pageSize: number; + sort: GpaListResponsePageableSort; + offset: number; + paged: boolean; + unpaged: boolean; +} + +export interface GpaListResponsePageableSort { + sorted: boolean; + unsorted: boolean; + empty: boolean; +} + +export interface GpaListResponseContentItem { + gpaScoreStatusResponse: GpaListResponseContentItemGpaScoreStatusResponse; + siteUserResponse: GpaListResponseContentItemSiteUserResponse; +} + +export interface GpaListResponseContentItemSiteUserResponse { + id: number; + nickname: string; + profileImageUrl: string; +} + +export interface GpaListResponseContentItemGpaScoreStatusResponse { + id: number; + gpaResponse: GpaListResponseContentItemGpaScoreStatusResponseGpaResponse; + verifyStatus: string; + rejectedReason: null; + createdAt: string; + updatedAt: string; +} + +export interface GpaListResponseContentItemGpaScoreStatusResponseGpaResponse { + gpa: number; + gpaCriteria: number; + gpaReportUrl: string; +} + +export interface GpaListResponse { + content: GpaListResponseContentItem[]; + pageable: GpaListResponsePageable; + totalElements: number; + totalPages: number; + last: boolean; + size: number; + number: number; + sort: GpaListResponseSort; + numberOfElements: number; + first: boolean; + empty: boolean; +} + +export const adminApi = { + putVerifyLanguageTest: async (params: { languageTestScoreId: string | number, data?: VerifyLanguageTestRequest }): Promise => { + const res = await axiosInstance.put( + `/admin/scores/language-tests/${params.languageTestScoreId}`, params?.data + ); + return res.data; + }, + + getLanguageTestList: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/admin/scores/language-tests?page=1&size=10`, { params: params?.params } + ); + return res.data; + }, + + putVerifyGpa: async (params: { gpaScoreId: string | number, data?: VerifyGpaRequest }): Promise => { + const res = await axiosInstance.put( + `/admin/scores/gpas/${params.gpaScoreId}`, params?.data + ); + return res.data; + }, + + getGpaList: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/admin/scores/gpas`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/Admin/getGpaList.ts b/src/apis/Admin/getGpaList.ts new file mode 100644 index 00000000..d3ae89e6 --- /dev/null +++ b/src/apis/Admin/getGpaList.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { adminApi, GpaListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetGpaList = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.Admin.gpaList, params], + queryFn: () => adminApi.getGpaList(params ? { params } : {}), + }); +}; + +export default useGetGpaList; \ No newline at end of file diff --git a/src/apis/Admin/getLanguageTestList.ts b/src/apis/Admin/getLanguageTestList.ts new file mode 100644 index 00000000..6d9325d8 --- /dev/null +++ b/src/apis/Admin/getLanguageTestList.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { adminApi, LanguageTestListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetLanguageTestList = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.Admin.languageTestList, params], + queryFn: () => adminApi.getLanguageTestList(params ? { params } : {}), + }); +}; + +export default useGetLanguageTestList; \ No newline at end of file diff --git a/src/apis/Admin/index.ts b/src/apis/Admin/index.ts new file mode 100644 index 00000000..f85e8506 --- /dev/null +++ b/src/apis/Admin/index.ts @@ -0,0 +1,5 @@ +export { default as api } from './api'; +export { default as getGpaList } from './getGpaList'; +export { default as getLanguageTestList } from './getLanguageTestList'; +export { default as putVerifyGpa } from './putVerifyGpa'; +export { default as putVerifyLanguageTest } from './putVerifyLanguageTest'; diff --git a/src/apis/Admin/putVerifyGpa.ts b/src/apis/Admin/putVerifyGpa.ts new file mode 100644 index 00000000..8073d81a --- /dev/null +++ b/src/apis/Admin/putVerifyGpa.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { adminApi, VerifyGpaResponse, VerifyGpaRequest } from "./api"; + +const usePutVerifyGpa = () => { + return useMutation({ + mutationFn: (variables) => adminApi.putVerifyGpa(variables), + }); +}; + +export default usePutVerifyGpa; \ No newline at end of file diff --git a/src/apis/Admin/putVerifyLanguageTest.ts b/src/apis/Admin/putVerifyLanguageTest.ts new file mode 100644 index 00000000..fa37c5e4 --- /dev/null +++ b/src/apis/Admin/putVerifyLanguageTest.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { adminApi, VerifyLanguageTestResponse, VerifyLanguageTestRequest } from "./api"; + +const usePutVerifyLanguageTest = () => { + return useMutation({ + mutationFn: (variables) => adminApi.putVerifyLanguageTest(variables), + }); +}; + +export default usePutVerifyLanguageTest; \ No newline at end of file diff --git a/src/apis/Auth/api.ts b/src/apis/Auth/api.ts new file mode 100644 index 00000000..7d6ac3be --- /dev/null +++ b/src/apis/Auth/api.ts @@ -0,0 +1,112 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export type SignOutResponse = Record; + +export type SignOutRequest = Record; + +export interface AppleAuthResponse { + isRegistered: boolean; + nickname: null; + email: string; + profileImageUrl: null; + signUpToken: string; +} + +export type AppleAuthRequest = Record; + +export interface RefreshTokenResponse { + accessToken: string; +} + +export type RefreshTokenRequest = Record; + +export interface EmailLoginResponse { + accessToken: string; + refreshToken: string; +} + +export type EmailLoginRequest = Record; + +export interface EmailVerificationResponse { + signUpToken: string; +} + +export type EmailVerificationRequest = Record; + +export interface KakaoAuthResponse { + isRegistered: boolean; + nickname: string; + email: string; + profileImageUrl: string; + signUpToken: string; +} + +export type KakaoAuthRequest = Record; + +export type AccountResponse = void; + +export interface SignUpResponse { + accessToken: string; + refreshToken: string; +} + +export type SignUpRequest = Record; + +export const authApi = { + postSignOut: async (params: { data?: SignOutRequest }): Promise => { + const res = await axiosInstance.post( + `/auth/sign-out`, params?.data + ); + return res.data; + }, + + postAppleAuth: async (params: { data?: AppleAuthRequest }): Promise => { + const res = await axiosInstance.post( + `/auth/apple`, params?.data + ); + return res.data; + }, + + postRefreshToken: async (params: { data?: RefreshTokenRequest }): Promise => { + const res = await axiosInstance.post( + `/auth/reissue`, params?.data + ); + return res.data; + }, + + postEmailLogin: async (params: { data?: EmailLoginRequest }): Promise => { + const res = await axiosInstance.post( + `/auth/email/sign-in`, params?.data + ); + return res.data; + }, + + postEmailVerification: async (params: { data?: EmailVerificationRequest }): Promise => { + const res = await axiosInstance.post( + `/auth/email/sign-up`, params?.data + ); + return res.data; + }, + + postKakaoAuth: async (params: { data?: KakaoAuthRequest }): Promise => { + const res = await axiosInstance.post( + `/auth/kakao`, params?.data + ); + return res.data; + }, + + deleteAccount: async (): Promise => { + const res = await axiosInstance.delete( + `/auth/quit` + ); + return res.data; + }, + + postSignUp: async (params: { data?: SignUpRequest }): Promise => { + const res = await axiosInstance.post( + `/auth/sign-up`, params?.data + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/Auth/deleteAccount.ts b/src/apis/Auth/deleteAccount.ts new file mode 100644 index 00000000..00038562 --- /dev/null +++ b/src/apis/Auth/deleteAccount.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, AccountResponse, AccountRequest } from "./api"; + +const useDeleteAccount = () => { + return useMutation({ + mutationFn: (data) => authApi.deleteAccount({ data }), + }); +}; + +export default useDeleteAccount; \ No newline at end of file diff --git a/src/apis/Auth/index.ts b/src/apis/Auth/index.ts new file mode 100644 index 00000000..9520b579 --- /dev/null +++ b/src/apis/Auth/index.ts @@ -0,0 +1,9 @@ +export { default as api } from './api'; +export { default as deleteAccount } from './deleteAccount'; +export { default as postAppleAuth } from './postAppleAuth'; +export { default as postEmailLogin } from './postEmailLogin'; +export { default as postEmailVerification } from './postEmailVerification'; +export { default as postKakaoAuth } from './postKakaoAuth'; +export { default as postRefreshToken } from './postRefreshToken'; +export { default as postSignOut } from './postSignOut'; +export { default as postSignUp } from './postSignUp'; diff --git a/src/apis/Auth/postAppleAuth.ts b/src/apis/Auth/postAppleAuth.ts new file mode 100644 index 00000000..cb30b87b --- /dev/null +++ b/src/apis/Auth/postAppleAuth.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, AppleAuthResponse, AppleAuthRequest } from "./api"; + +const usePostAppleAuth = () => { + return useMutation({ + mutationFn: (data) => authApi.postAppleAuth({ data }), + }); +}; + +export default usePostAppleAuth; \ No newline at end of file diff --git a/src/apis/Auth/postEmailLogin.ts b/src/apis/Auth/postEmailLogin.ts new file mode 100644 index 00000000..d8ef06df --- /dev/null +++ b/src/apis/Auth/postEmailLogin.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, EmailLoginResponse, EmailLoginRequest } from "./api"; + +const usePostEmailLogin = () => { + return useMutation({ + mutationFn: (data) => authApi.postEmailLogin({ data }), + }); +}; + +export default usePostEmailLogin; \ No newline at end of file diff --git a/src/apis/Auth/postEmailVerification.ts b/src/apis/Auth/postEmailVerification.ts new file mode 100644 index 00000000..99aefafe --- /dev/null +++ b/src/apis/Auth/postEmailVerification.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, EmailVerificationResponse, EmailVerificationRequest } from "./api"; + +const usePostEmailVerification = () => { + return useMutation({ + mutationFn: (data) => authApi.postEmailVerification({ data }), + }); +}; + +export default usePostEmailVerification; \ No newline at end of file diff --git a/src/apis/Auth/postKakaoAuth.ts b/src/apis/Auth/postKakaoAuth.ts new file mode 100644 index 00000000..2aaebd97 --- /dev/null +++ b/src/apis/Auth/postKakaoAuth.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, KakaoAuthResponse, KakaoAuthRequest } from "./api"; + +const usePostKakaoAuth = () => { + return useMutation({ + mutationFn: (data) => authApi.postKakaoAuth({ data }), + }); +}; + +export default usePostKakaoAuth; \ No newline at end of file diff --git a/src/apis/Auth/postRefreshToken.ts b/src/apis/Auth/postRefreshToken.ts new file mode 100644 index 00000000..ae86a780 --- /dev/null +++ b/src/apis/Auth/postRefreshToken.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, RefreshTokenResponse, RefreshTokenRequest } from "./api"; + +const usePostRefreshToken = () => { + return useMutation({ + mutationFn: (data) => authApi.postRefreshToken({ data }), + }); +}; + +export default usePostRefreshToken; \ No newline at end of file diff --git a/src/apis/Auth/postSignOut.ts b/src/apis/Auth/postSignOut.ts new file mode 100644 index 00000000..8d31dc93 --- /dev/null +++ b/src/apis/Auth/postSignOut.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, SignOutResponse, SignOutRequest } from "./api"; + +const usePostSignOut = () => { + return useMutation({ + mutationFn: (data) => authApi.postSignOut({ data }), + }); +}; + +export default usePostSignOut; \ No newline at end of file diff --git a/src/apis/Auth/postSignUp.ts b/src/apis/Auth/postSignUp.ts new file mode 100644 index 00000000..eadc9cb8 --- /dev/null +++ b/src/apis/Auth/postSignUp.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { authApi, SignUpResponse, SignUpRequest } from "./api"; + +const usePostSignUp = () => { + return useMutation({ + mutationFn: (data) => authApi.postSignUp({ data }), + }); +}; + +export default usePostSignUp; \ No newline at end of file diff --git a/src/apis/MyPage/api.ts b/src/apis/MyPage/api.ts new file mode 100644 index 00000000..d6f5f956 --- /dev/null +++ b/src/apis/MyPage/api.ts @@ -0,0 +1,56 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export type InterestedRegionCountryResponse = void; + +export type InterestedRegionCountryRequest = Record; + +export type ProfileResponse = Record; + +export type ProfileRequest = Record; + +export interface ProfileResponse { + likedUniversityCount: number; + nickname: string; + profileImageUrl: string; + role: string; + authType: string; + email: string; + likedPostCount: number; + likedMentorCount: number; + interestedCountries: string[]; +} + +export type PasswordResponse = void; + +export type PasswordRequest = Record; + +export const myPageApi = { + patchInterestedRegionCountry: async (params: { data?: InterestedRegionCountryRequest }): Promise => { + const res = await axiosInstance.patch( + `/my/interested-location`, params?.data + ); + return res.data; + }, + + patchProfile: async (params: { data?: ProfileRequest }): Promise => { + const res = await axiosInstance.patch( + `/my`, params?.data + ); + return res.data; + }, + + getProfile: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/my`, { params: params?.params } + ); + return res.data; + }, + + patchPassword: async (params: { data?: PasswordRequest }): Promise => { + const res = await axiosInstance.patch( + `/my/password`, params?.data + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/MyPage/getProfile.ts b/src/apis/MyPage/getProfile.ts new file mode 100644 index 00000000..042c0767 --- /dev/null +++ b/src/apis/MyPage/getProfile.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { myPageApi, ProfileResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetProfile = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.MyPage.profile, params], + queryFn: () => myPageApi.getProfile(params ? { params } : {}), + }); +}; + +export default useGetProfile; \ No newline at end of file diff --git a/src/apis/MyPage/index.ts b/src/apis/MyPage/index.ts new file mode 100644 index 00000000..e8d36f58 --- /dev/null +++ b/src/apis/MyPage/index.ts @@ -0,0 +1,5 @@ +export { default as api } from './api'; +export { default as getProfile } from './getProfile'; +export { default as patchInterestedRegionCountry } from './patchInterestedRegionCountry'; +export { default as patchPassword } from './patchPassword'; +export { default as patchProfile } from './patchProfile'; diff --git a/src/apis/MyPage/patchInterestedRegionCountry.ts b/src/apis/MyPage/patchInterestedRegionCountry.ts new file mode 100644 index 00000000..0ea8b18f --- /dev/null +++ b/src/apis/MyPage/patchInterestedRegionCountry.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { myPageApi, InterestedRegionCountryResponse, InterestedRegionCountryRequest } from "./api"; + +const usePatchInterestedRegionCountry = () => { + return useMutation({ + mutationFn: (data) => myPageApi.patchInterestedRegionCountry({ data }), + }); +}; + +export default usePatchInterestedRegionCountry; \ No newline at end of file diff --git a/src/apis/MyPage/patchPassword.ts b/src/apis/MyPage/patchPassword.ts new file mode 100644 index 00000000..8592b77e --- /dev/null +++ b/src/apis/MyPage/patchPassword.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { myPageApi, PasswordResponse, PasswordRequest } from "./api"; + +const usePatchPassword = () => { + return useMutation({ + mutationFn: (data) => myPageApi.patchPassword({ data }), + }); +}; + +export default usePatchPassword; \ No newline at end of file diff --git a/src/apis/MyPage/patchProfile.ts b/src/apis/MyPage/patchProfile.ts new file mode 100644 index 00000000..20204ad8 --- /dev/null +++ b/src/apis/MyPage/patchProfile.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { myPageApi, ProfileResponse, ProfileRequest } from "./api"; + +const usePatchProfile = () => { + return useMutation({ + mutationFn: (data) => myPageApi.patchProfile({ data }), + }); +}; + +export default usePatchProfile; \ No newline at end of file diff --git a/src/apis/Scores/api.ts b/src/apis/Scores/api.ts new file mode 100644 index 00000000..5b45182c --- /dev/null +++ b/src/apis/Scores/api.ts @@ -0,0 +1,78 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface CreateLanguageTestResponse { + id: number; +} + +export type CreateLanguageTestRequest = Record; + +export interface LanguageTestListResponseLanguageTestScoreStatusResponseListItem { + id: number; + languageTestResponse: LanguageTestListResponseLanguageTestScoreStatusResponseListItemLanguageTestResponse; + verifyStatus: string; + rejectedReason: null; +} + +export interface LanguageTestListResponseLanguageTestScoreStatusResponseListItemLanguageTestResponse { + languageTestType: string; + languageTestScore: string; + languageTestReportUrl: string; +} + +export interface LanguageTestListResponse { + languageTestScoreStatusResponseList: LanguageTestListResponseLanguageTestScoreStatusResponseListItem[]; +} + +export interface CreateGpaResponse { + id: number; +} + +export type CreateGpaRequest = Record; + +export interface GpaListResponseGpaScoreStatusResponseListItem { + id: number; + gpaResponse: GpaListResponseGpaScoreStatusResponseListItemGpaResponse; + verifyStatus: string; + rejectedReason: null; +} + +export interface GpaListResponseGpaScoreStatusResponseListItemGpaResponse { + gpa: number; + gpaCriteria: number; + gpaReportUrl: string; +} + +export interface GpaListResponse { + gpaScoreStatusResponseList: GpaListResponseGpaScoreStatusResponseListItem[]; +} + +export const scoresApi = { + postCreateLanguageTest: async (params: { data?: CreateLanguageTestRequest }): Promise => { + const res = await axiosInstance.post( + `/scores/language-tests`, params?.data + ); + return res.data; + }, + + getLanguageTestList: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/scores/language-tests`, { params: params?.params } + ); + return res.data; + }, + + postCreateGpa: async (params: { data?: CreateGpaRequest }): Promise => { + const res = await axiosInstance.post( + `/scores/gpas`, params?.data + ); + return res.data; + }, + + getGpaList: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/scores/gpas`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/Scores/getGpaList.ts b/src/apis/Scores/getGpaList.ts new file mode 100644 index 00000000..b402a643 --- /dev/null +++ b/src/apis/Scores/getGpaList.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { scoresApi, GpaListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetGpaList = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.Scores.gpaList, params], + queryFn: () => scoresApi.getGpaList(params ? { params } : {}), + }); +}; + +export default useGetGpaList; \ No newline at end of file diff --git a/src/apis/Scores/getLanguageTestList.ts b/src/apis/Scores/getLanguageTestList.ts new file mode 100644 index 00000000..ace30a13 --- /dev/null +++ b/src/apis/Scores/getLanguageTestList.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { scoresApi, LanguageTestListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetLanguageTestList = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.Scores.languageTestList, params], + queryFn: () => scoresApi.getLanguageTestList(params ? { params } : {}), + }); +}; + +export default useGetLanguageTestList; \ No newline at end of file diff --git a/src/apis/Scores/index.ts b/src/apis/Scores/index.ts new file mode 100644 index 00000000..26d8f25a --- /dev/null +++ b/src/apis/Scores/index.ts @@ -0,0 +1,5 @@ +export { default as api } from './api'; +export { default as getGpaList } from './getGpaList'; +export { default as getLanguageTestList } from './getLanguageTestList'; +export { default as postCreateGpa } from './postCreateGpa'; +export { default as postCreateLanguageTest } from './postCreateLanguageTest'; diff --git a/src/apis/Scores/postCreateGpa.ts b/src/apis/Scores/postCreateGpa.ts new file mode 100644 index 00000000..6255a5d0 --- /dev/null +++ b/src/apis/Scores/postCreateGpa.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { scoresApi, CreateGpaResponse, CreateGpaRequest } from "./api"; + +const usePostCreateGpa = () => { + return useMutation({ + mutationFn: (data) => scoresApi.postCreateGpa({ data }), + }); +}; + +export default usePostCreateGpa; \ No newline at end of file diff --git a/src/apis/Scores/postCreateLanguageTest.ts b/src/apis/Scores/postCreateLanguageTest.ts new file mode 100644 index 00000000..b6201433 --- /dev/null +++ b/src/apis/Scores/postCreateLanguageTest.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { scoresApi, CreateLanguageTestResponse, CreateLanguageTestRequest } from "./api"; + +const usePostCreateLanguageTest = () => { + return useMutation({ + mutationFn: (data) => scoresApi.postCreateLanguageTest({ data }), + }); +}; + +export default usePostCreateLanguageTest; \ No newline at end of file diff --git a/src/apis/applications/api.ts b/src/apis/applications/api.ts new file mode 100644 index 00000000..f4879dd1 --- /dev/null +++ b/src/apis/applications/api.ts @@ -0,0 +1,147 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface CompetitorsResponseThirdChoiceItem { + koreanName: string; + studentCapacity: number; + region: string; + country: string; + applicants: CompetitorsResponseThirdChoiceItemApplicantsItem[]; +} + +export interface CompetitorsResponseThirdChoiceItemApplicantsItem { + nicknameForApply: string; + gpa: number; + testType: string; + testScore: string; + isMine: boolean; +} + +export interface CompetitorsResponseSecondChoiceItem { + koreanName: string; + studentCapacity: number; + region: string; + country: string; + applicants: CompetitorsResponseSecondChoiceItemApplicantsItem[]; +} + +export interface CompetitorsResponseSecondChoiceItemApplicantsItem { + nicknameForApply: string; + gpa: number; + testType: string; + testScore: string; + isMine: boolean; +} + +export interface CompetitorsResponseFirstChoiceItem { + koreanName: string; + studentCapacity: number; + region: string; + country: string; + applicants: CompetitorsResponseFirstChoiceItemApplicantsItem[]; +} + +export interface CompetitorsResponseFirstChoiceItemApplicantsItem { + nicknameForApply: string; + gpa: number; + testType: string; + testScore: string; + isMine: boolean; +} + +export interface CompetitorsResponse { + firstChoice: CompetitorsResponseFirstChoiceItem[]; + secondChoice: CompetitorsResponseSecondChoiceItem[]; + thirdChoice: CompetitorsResponseThirdChoiceItem[]; +} + +export interface SubmitApplicationResponseAppliedUniversities { + firstChoiceUniversity: string; + secondChoiceUniversity: string; + thirdChoiceUniversity: string; +} + +export interface SubmitApplicationResponse { + totalApplyCount: number; + applyCount: number; + appliedUniversities: SubmitApplicationResponseAppliedUniversities; +} + +export type SubmitApplicationRequest = Record; + +export interface ApplicantsResponseThirdChoiceItem { + koreanName: string; + studentCapacity: number; + region: string; + country: string; + applicants: ApplicantsResponseThirdChoiceItemApplicantsItem[]; +} + +export interface ApplicantsResponseThirdChoiceItemApplicantsItem { + nicknameForApply: string; + gpa: number; + testType: string; + testScore: string; + isMine: boolean; +} + +export interface ApplicantsResponseSecondChoiceItem { + koreanName: string; + studentCapacity: number; + region: string; + country: string; + applicants: ApplicantsResponseSecondChoiceItemApplicantsItem[]; +} + +export interface ApplicantsResponseSecondChoiceItemApplicantsItem { + nicknameForApply: string; + gpa: number; + testType: string; + testScore: string; + isMine: boolean; +} + +export interface ApplicantsResponseFirstChoiceItem { + koreanName: string; + studentCapacity: number; + region: string; + country: string; + applicants: ApplicantsResponseFirstChoiceItemApplicantsItem[]; +} + +export interface ApplicantsResponseFirstChoiceItemApplicantsItem { + nicknameForApply: string; + gpa: number; + testType: string; + testScore: string; + isMine: boolean; +} + +export interface ApplicantsResponse { + firstChoice: ApplicantsResponseFirstChoiceItem[]; + secondChoice: ApplicantsResponseSecondChoiceItem[]; + thirdChoice: ApplicantsResponseThirdChoiceItem[]; +} + +export const applicationsApi = { + getCompetitors: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/applications/competitors`, { params: params?.params } + ); + return res.data; + }, + + postSubmitApplication: async (params: { data?: SubmitApplicationRequest }): Promise => { + const res = await axiosInstance.post( + `/applications`, params?.data + ); + return res.data; + }, + + getApplicants: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/applications`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/applications/getApplicants.ts b/src/apis/applications/getApplicants.ts new file mode 100644 index 00000000..2a266ec3 --- /dev/null +++ b/src/apis/applications/getApplicants.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { applicationsApi, ApplicantsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetApplicants = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.applications.applicants, params], + queryFn: () => applicationsApi.getApplicants(params ? { params } : {}), + }); +}; + +export default useGetApplicants; \ No newline at end of file diff --git a/src/apis/applications/getCompetitors.ts b/src/apis/applications/getCompetitors.ts new file mode 100644 index 00000000..4d3ccbc9 --- /dev/null +++ b/src/apis/applications/getCompetitors.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { applicationsApi, CompetitorsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetCompetitors = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.applications.competitors, params], + queryFn: () => applicationsApi.getCompetitors(params ? { params } : {}), + }); +}; + +export default useGetCompetitors; \ No newline at end of file diff --git a/src/apis/applications/index.ts b/src/apis/applications/index.ts new file mode 100644 index 00000000..d75a1a14 --- /dev/null +++ b/src/apis/applications/index.ts @@ -0,0 +1,4 @@ +export { default as api } from './api'; +export { default as getApplicants } from './getApplicants'; +export { default as getCompetitors } from './getCompetitors'; +export { default as postSubmitApplication } from './postSubmitApplication'; diff --git a/src/apis/applications/postSubmitApplication.ts b/src/apis/applications/postSubmitApplication.ts new file mode 100644 index 00000000..5434d6ee --- /dev/null +++ b/src/apis/applications/postSubmitApplication.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { applicationsApi, SubmitApplicationResponse, SubmitApplicationRequest } from "./api"; + +const usePostSubmitApplication = () => { + return useMutation({ + mutationFn: (data) => applicationsApi.postSubmitApplication({ data }), + }); +}; + +export default usePostSubmitApplication; \ No newline at end of file diff --git a/src/apis/chat/api.ts b/src/apis/chat/api.ts new file mode 100644 index 00000000..3041ff33 --- /dev/null +++ b/src/apis/chat/api.ts @@ -0,0 +1,65 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface ChatMessagesResponseContentItem { + id: number; + content: string; + senderId: number; + createdAt: string; + attachments: ChatMessagesResponseContentItemAttachmentsItem[]; +} + +export interface ChatMessagesResponseContentItemAttachmentsItem { + id: number; + isImage: boolean; + url: string; + thumbnailUrl: string | null; + createdAt: string; +} + +export interface ChatMessagesResponse { + nextPageNumber: number; + content: ChatMessagesResponseContentItem[]; +} + +export type ChatRoomsResponse = void; + +export type ReadChatRoomResponse = void; + +export type ReadChatRoomRequest = Record; + +export interface ChatPartnerResponse { + partnerId: number; + nickname: string; + profileUrl: string; +} + +export const chatApi = { + getChatMessages: async (params: { roomId: string | number, defaultSize: string | number, defaultPage: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/chats/rooms/${params.roomId}?size=${params.defaultSize}&page=${params.defaultPage}`, { params: params?.params } + ); + return res.data; + }, + + getChatRooms: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/chats/rooms`, { params: params?.params } + ); + return res.data; + }, + + putReadChatRoom: async (params: { roomId: string | number, data?: ReadChatRoomRequest }): Promise => { + const res = await axiosInstance.put( + `//chats/rooms/${params.roomId}/read`, params?.data + ); + return res.data; + }, + + getChatPartner: async (params: { roomId: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/chats/rooms/${params.roomId}/partner`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/chat/getChatMessages.ts b/src/apis/chat/getChatMessages.ts new file mode 100644 index 00000000..2cf05b68 --- /dev/null +++ b/src/apis/chat/getChatMessages.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { chatApi, ChatMessagesResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetChatMessages = (roomId: string | number, defaultSize: string | number, defaultPage: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.chat.chatMessages, roomId, defaultSize, defaultPage, params], + queryFn: () => chatApi.getChatMessages({ roomId, defaultSize, defaultPage, params }), + enabled: !!roomId && !!defaultSize && !!defaultPage, + }); +}; + +export default useGetChatMessages; \ No newline at end of file diff --git a/src/apis/chat/getChatPartner.ts b/src/apis/chat/getChatPartner.ts new file mode 100644 index 00000000..ab3ab0c0 --- /dev/null +++ b/src/apis/chat/getChatPartner.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { chatApi, ChatPartnerResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetChatPartner = (roomId: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.chat.chatPartner, roomId, params], + queryFn: () => chatApi.getChatPartner({ roomId, params }), + enabled: !!roomId, + }); +}; + +export default useGetChatPartner; \ No newline at end of file diff --git a/src/apis/chat/getChatRooms.ts b/src/apis/chat/getChatRooms.ts new file mode 100644 index 00000000..b2c6c0c4 --- /dev/null +++ b/src/apis/chat/getChatRooms.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { chatApi, ChatRoomsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetChatRooms = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.chat.chatRooms, params], + queryFn: () => chatApi.getChatRooms(params ? { params } : {}), + }); +}; + +export default useGetChatRooms; \ No newline at end of file diff --git a/src/apis/chat/index.ts b/src/apis/chat/index.ts new file mode 100644 index 00000000..296cdee9 --- /dev/null +++ b/src/apis/chat/index.ts @@ -0,0 +1,5 @@ +export { default as api } from './api'; +export { default as getChatMessages } from './getChatMessages'; +export { default as getChatPartner } from './getChatPartner'; +export { default as getChatRooms } from './getChatRooms'; +export { default as putReadChatRoom } from './putReadChatRoom'; diff --git a/src/apis/chat/putReadChatRoom.ts b/src/apis/chat/putReadChatRoom.ts new file mode 100644 index 00000000..02af78df --- /dev/null +++ b/src/apis/chat/putReadChatRoom.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { chatApi, ReadChatRoomResponse, ReadChatRoomRequest } from "./api"; + +const usePutReadChatRoom = () => { + return useMutation({ + mutationFn: (variables) => chatApi.putReadChatRoom(variables), + }); +}; + +export default usePutReadChatRoom; \ No newline at end of file diff --git a/src/apis/community/api.ts b/src/apis/community/api.ts new file mode 100644 index 00000000..52eaec57 --- /dev/null +++ b/src/apis/community/api.ts @@ -0,0 +1,197 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface BoardListResponse { + 0: string; + 1: string; + 2: string; + 3: string; +} + +export interface BoardResponseItem { + id: number; + title: string; + content: string; + likeCount: number; + commentCount: number; + createdAt: string; + updatedAt: string; + postCategory: string; + postThumbnailUrl: null | string; +} + +export interface BoardResponse { + 0: BoardResponse0; + 1: BoardResponse1; + 2: BoardResponse2; + 3: BoardResponse3; +} + +export interface CommentResponse { + id: number; +} + +export interface UpdateCommentResponse { + id: number; +} + +export type UpdateCommentRequest = Record; + +export interface CreateCommentResponse { + id: number; +} + +export type CreateCommentRequest = Record; + +export interface PostResponse { + id: number; +} + +export interface UpdatePostResponse { + id: number; +} + +export type UpdatePostRequest = Record; + +export interface CreatePostResponse { + id: number; +} + +export type CreatePostRequest = Record; + +export interface PostDetailResponsePostFindPostImageResponsesItem { + id: number; + imageUrl: string; +} + +export interface PostDetailResponsePostFindCommentResponsesItem { + id: number; + parentId: null | number; + content: string; + isOwner: boolean; + createdAt: string; + updatedAt: string; + postFindSiteUserResponse: PostDetailResponsePostFindCommentResponsesItemPostFindSiteUserResponse; +} + +export interface PostDetailResponsePostFindCommentResponsesItemPostFindSiteUserResponse { + id: number; + nickname: string; + profileImageUrl: string; +} + +export interface PostDetailResponsePostFindSiteUserResponse { + id: number; + nickname: string; + profileImageUrl: string; +} + +export interface PostDetailResponsePostFindBoardResponse { + code: string; + koreanName: string; +} + +export interface PostDetailResponse { + id: number; + title: string; + content: string; + isQuestion: boolean; + likeCount: number; + viewCount: number; + commentCount: number; + postCategory: string; + isOwner: boolean; + isLiked: boolean; + createdAt: string; + updatedAt: string; + postFindBoardResponse: PostDetailResponsePostFindBoardResponse; + postFindSiteUserResponse: PostDetailResponsePostFindSiteUserResponse; + postFindCommentResponses: PostDetailResponsePostFindCommentResponsesItem[]; + postFindPostImageResponses: PostDetailResponsePostFindPostImageResponsesItem[]; +} + +export interface LikePostResponse { + likeCount: number; + isLiked: boolean; +} + +export type LikePostRequest = Record; + +export const communityApi = { + getBoardList: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/boards`, { params: params?.params } + ); + return res.data; + }, + + getBoard: async (params: { boardCode: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/boards/${params.boardCode}`, { params: params?.params } + ); + return res.data; + }, + + deleteComment: async (params: { commentId: string | number }): Promise => { + const res = await axiosInstance.delete( + `/comments/${params.commentId}` + ); + return res.data; + }, + + patchUpdateComment: async (params: { commentId: string | number, data?: UpdateCommentRequest }): Promise => { + const res = await axiosInstance.patch( + `/comments/${params.commentId}`, params?.data + ); + return res.data; + }, + + postCreateComment: async (params: { data?: CreateCommentRequest }): Promise => { + const res = await axiosInstance.post( + `/comments`, params?.data + ); + return res.data; + }, + + deletePost: async (params: { postId: string | number }): Promise => { + const res = await axiosInstance.delete( + `/posts/${params.postId}` + ); + return res.data; + }, + + patchUpdatePost: async (params: { postId: string | number, data?: UpdatePostRequest }): Promise => { + const res = await axiosInstance.patch( + `/posts/${params.postId}`, params?.data + ); + return res.data; + }, + + postCreatePost: async (params: { data?: CreatePostRequest }): Promise => { + const res = await axiosInstance.post( + `/posts`, params?.data + ); + return res.data; + }, + + getPostDetail: async (params: { postId: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/posts/${params.postId}`, { params: params?.params } + ); + return res.data; + }, + + postLikePost: async (params: { postId: string | number, data?: LikePostRequest }): Promise => { + const res = await axiosInstance.post( + `/posts/${params.postId}/like`, params?.data + ); + return res.data; + }, + + deleteLikePost: async (params: { postId: string | number }): Promise => { + const res = await axiosInstance.delete( + `/posts/${params.postId}/like` + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/community/deleteComment.ts b/src/apis/community/deleteComment.ts new file mode 100644 index 00000000..6bea8c7e --- /dev/null +++ b/src/apis/community/deleteComment.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, CommentResponse, CommentRequest } from "./api"; + +const useDeleteComment = () => { + return useMutation({ + mutationFn: (variables) => communityApi.deleteComment(variables), + }); +}; + +export default useDeleteComment; \ No newline at end of file diff --git a/src/apis/community/deleteLikePost.ts b/src/apis/community/deleteLikePost.ts new file mode 100644 index 00000000..63036f50 --- /dev/null +++ b/src/apis/community/deleteLikePost.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, LikePostResponse, LikePostRequest } from "./api"; + +const useDeleteLikePost = () => { + return useMutation({ + mutationFn: (variables) => communityApi.deleteLikePost(variables), + }); +}; + +export default useDeleteLikePost; \ No newline at end of file diff --git a/src/apis/community/deletePost.ts b/src/apis/community/deletePost.ts new file mode 100644 index 00000000..1b194b65 --- /dev/null +++ b/src/apis/community/deletePost.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, PostResponse, PostRequest } from "./api"; + +const useDeletePost = () => { + return useMutation({ + mutationFn: (variables) => communityApi.deletePost(variables), + }); +}; + +export default useDeletePost; \ No newline at end of file diff --git a/src/apis/community/getBoard.ts b/src/apis/community/getBoard.ts new file mode 100644 index 00000000..1ea2869d --- /dev/null +++ b/src/apis/community/getBoard.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { communityApi, BoardResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetBoard = (boardCode: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.community.board, boardCode, params], + queryFn: () => communityApi.getBoard({ boardCode, params }), + enabled: !!boardCode, + }); +}; + +export default useGetBoard; \ No newline at end of file diff --git a/src/apis/community/getBoardList.ts b/src/apis/community/getBoardList.ts new file mode 100644 index 00000000..bcb0d65b --- /dev/null +++ b/src/apis/community/getBoardList.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { communityApi, BoardListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetBoardList = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.community.boardList, params], + queryFn: () => communityApi.getBoardList(params ? { params } : {}), + }); +}; + +export default useGetBoardList; \ No newline at end of file diff --git a/src/apis/community/getPostDetail.ts b/src/apis/community/getPostDetail.ts new file mode 100644 index 00000000..ba5cc61a --- /dev/null +++ b/src/apis/community/getPostDetail.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { communityApi, PostDetailResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetPostDetail = (postId: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.community.postDetail, postId, params], + queryFn: () => communityApi.getPostDetail({ postId, params }), + enabled: !!postId, + }); +}; + +export default useGetPostDetail; \ No newline at end of file diff --git a/src/apis/community/index.ts b/src/apis/community/index.ts new file mode 100644 index 00000000..92bf85d4 --- /dev/null +++ b/src/apis/community/index.ts @@ -0,0 +1,12 @@ +export { default as api } from './api'; +export { default as deleteComment } from './deleteComment'; +export { default as deleteLikePost } from './deleteLikePost'; +export { default as deletePost } from './deletePost'; +export { default as getBoard } from './getBoard'; +export { default as getBoardList } from './getBoardList'; +export { default as getPostDetail } from './getPostDetail'; +export { default as patchUpdateComment } from './patchUpdateComment'; +export { default as patchUpdatePost } from './patchUpdatePost'; +export { default as postCreateComment } from './postCreateComment'; +export { default as postCreatePost } from './postCreatePost'; +export { default as postLikePost } from './postLikePost'; diff --git a/src/apis/community/patchUpdateComment.ts b/src/apis/community/patchUpdateComment.ts new file mode 100644 index 00000000..3a0fbfe6 --- /dev/null +++ b/src/apis/community/patchUpdateComment.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, UpdateCommentResponse, UpdateCommentRequest } from "./api"; + +const usePatchUpdateComment = () => { + return useMutation({ + mutationFn: (variables) => communityApi.patchUpdateComment(variables), + }); +}; + +export default usePatchUpdateComment; \ No newline at end of file diff --git a/src/apis/community/patchUpdatePost.ts b/src/apis/community/patchUpdatePost.ts new file mode 100644 index 00000000..acbdf578 --- /dev/null +++ b/src/apis/community/patchUpdatePost.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, UpdatePostResponse, UpdatePostRequest } from "./api"; + +const usePatchUpdatePost = () => { + return useMutation({ + mutationFn: (variables) => communityApi.patchUpdatePost(variables), + }); +}; + +export default usePatchUpdatePost; \ No newline at end of file diff --git a/src/apis/community/postCreateComment.ts b/src/apis/community/postCreateComment.ts new file mode 100644 index 00000000..215cd41e --- /dev/null +++ b/src/apis/community/postCreateComment.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, CreateCommentResponse, CreateCommentRequest } from "./api"; + +const usePostCreateComment = () => { + return useMutation({ + mutationFn: (data) => communityApi.postCreateComment({ data }), + }); +}; + +export default usePostCreateComment; \ No newline at end of file diff --git a/src/apis/community/postCreatePost.ts b/src/apis/community/postCreatePost.ts new file mode 100644 index 00000000..e83b02c4 --- /dev/null +++ b/src/apis/community/postCreatePost.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, CreatePostResponse, CreatePostRequest } from "./api"; + +const usePostCreatePost = () => { + return useMutation({ + mutationFn: (data) => communityApi.postCreatePost({ data }), + }); +}; + +export default usePostCreatePost; \ No newline at end of file diff --git a/src/apis/community/postLikePost.ts b/src/apis/community/postLikePost.ts new file mode 100644 index 00000000..f88f4c4c --- /dev/null +++ b/src/apis/community/postLikePost.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { communityApi, LikePostResponse, LikePostRequest } from "./api"; + +const usePostLikePost = () => { + return useMutation({ + mutationFn: (variables) => communityApi.postLikePost(variables), + }); +}; + +export default usePostLikePost; \ No newline at end of file diff --git a/src/apis/image-upload/api.ts b/src/apis/image-upload/api.ts new file mode 100644 index 00000000..a2024dda --- /dev/null +++ b/src/apis/image-upload/api.ts @@ -0,0 +1,67 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export type SlackNotificationResponse = void; + +export type SlackNotificationRequest = Record; + +export interface UploadLanguageTestReportResponse { + fileUrl: string; +} + +export type UploadLanguageTestReportRequest = Record; + +export interface UploadProfileImageResponse { + fileUrl: string; +} + +export type UploadProfileImageRequest = Record; + +export interface UploadProfileImageBeforeSignupResponse { + fileUrl: string; +} + +export type UploadProfileImageBeforeSignupRequest = Record; + +export interface UploadGpaReportResponse { + fileUrl: string; +} + +export type UploadGpaReportRequest = Record; + +export const imageUploadApi = { + postSlackNotification: async (params: { data?: SlackNotificationRequest }): Promise => { + const res = await axiosInstance.post( + `https://hooks.slack.com/services/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`, params?.data + ); + return res.data; + }, + + postUploadLanguageTestReport: async (params: { data?: UploadLanguageTestReportRequest }): Promise => { + const res = await axiosInstance.post( + `/file/language-test`, params?.data + ); + return res.data; + }, + + postUploadProfileImage: async (params: { data?: UploadProfileImageRequest }): Promise => { + const res = await axiosInstance.post( + `/file/profile/post`, params?.data + ); + return res.data; + }, + + postUploadProfileImageBeforeSignup: async (params: { data?: UploadProfileImageBeforeSignupRequest }): Promise => { + const res = await axiosInstance.post( + `/file/profile/pre`, params?.data + ); + return res.data; + }, + + postUploadGpaReport: async (params: { data?: UploadGpaReportRequest }): Promise => { + const res = await axiosInstance.post( + `/file/gpa`, params?.data + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/image-upload/index.ts b/src/apis/image-upload/index.ts new file mode 100644 index 00000000..c0c7bfb9 --- /dev/null +++ b/src/apis/image-upload/index.ts @@ -0,0 +1,6 @@ +export { default as api } from './api'; +export { default as postSlackNotification } from './postSlackNotification'; +export { default as postUploadGpaReport } from './postUploadGpaReport'; +export { default as postUploadLanguageTestReport } from './postUploadLanguageTestReport'; +export { default as postUploadProfileImage } from './postUploadProfileImage'; +export { default as postUploadProfileImageBeforeSignup } from './postUploadProfileImageBeforeSignup'; diff --git a/src/apis/image-upload/postSlackNotification.ts b/src/apis/image-upload/postSlackNotification.ts new file mode 100644 index 00000000..c973ec12 --- /dev/null +++ b/src/apis/image-upload/postSlackNotification.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { imageUploadApi, SlackNotificationResponse, SlackNotificationRequest } from "./api"; + +const usePostSlackNotification = () => { + return useMutation({ + mutationFn: (data) => imageUploadApi.postSlackNotification({ data }), + }); +}; + +export default usePostSlackNotification; \ No newline at end of file diff --git a/src/apis/image-upload/postUploadGpaReport.ts b/src/apis/image-upload/postUploadGpaReport.ts new file mode 100644 index 00000000..06ed6ece --- /dev/null +++ b/src/apis/image-upload/postUploadGpaReport.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { imageUploadApi, UploadGpaReportResponse, UploadGpaReportRequest } from "./api"; + +const usePostUploadGpaReport = () => { + return useMutation({ + mutationFn: (data) => imageUploadApi.postUploadGpaReport({ data }), + }); +}; + +export default usePostUploadGpaReport; \ No newline at end of file diff --git a/src/apis/image-upload/postUploadLanguageTestReport.ts b/src/apis/image-upload/postUploadLanguageTestReport.ts new file mode 100644 index 00000000..7b36f675 --- /dev/null +++ b/src/apis/image-upload/postUploadLanguageTestReport.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { imageUploadApi, UploadLanguageTestReportResponse, UploadLanguageTestReportRequest } from "./api"; + +const usePostUploadLanguageTestReport = () => { + return useMutation({ + mutationFn: (data) => imageUploadApi.postUploadLanguageTestReport({ data }), + }); +}; + +export default usePostUploadLanguageTestReport; \ No newline at end of file diff --git a/src/apis/image-upload/postUploadProfileImage.ts b/src/apis/image-upload/postUploadProfileImage.ts new file mode 100644 index 00000000..72db4ae2 --- /dev/null +++ b/src/apis/image-upload/postUploadProfileImage.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { imageUploadApi, UploadProfileImageResponse, UploadProfileImageRequest } from "./api"; + +const usePostUploadProfileImage = () => { + return useMutation({ + mutationFn: (data) => imageUploadApi.postUploadProfileImage({ data }), + }); +}; + +export default usePostUploadProfileImage; \ No newline at end of file diff --git a/src/apis/image-upload/postUploadProfileImageBeforeSignup.ts b/src/apis/image-upload/postUploadProfileImageBeforeSignup.ts new file mode 100644 index 00000000..edf2b95c --- /dev/null +++ b/src/apis/image-upload/postUploadProfileImageBeforeSignup.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { imageUploadApi, UploadProfileImageBeforeSignupResponse, UploadProfileImageBeforeSignupRequest } from "./api"; + +const usePostUploadProfileImageBeforeSignup = () => { + return useMutation({ + mutationFn: (data) => imageUploadApi.postUploadProfileImageBeforeSignup({ data }), + }); +}; + +export default usePostUploadProfileImageBeforeSignup; \ No newline at end of file diff --git a/src/apis/kakao-api/api.ts b/src/apis/kakao-api/api.ts new file mode 100644 index 00000000..51eda46d --- /dev/null +++ b/src/apis/kakao-api/api.ts @@ -0,0 +1,33 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export type KakaoUserIdsResponse = void; + +export type KakaoUnlinkResponse = void; + +export type KakaoUnlinkRequest = Record; + +export type KakaoInfoResponse = void; + +export const kakaoApiApi = { + getKakaoUserIds: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `https://kapi.kakao.com/v1/user/ids?order=dsc`, { params: params?.params } + ); + return res.data; + }, + + postKakaoUnlink: async (params: { data?: KakaoUnlinkRequest }): Promise => { + const res = await axiosInstance.post( + `https://kapi.kakao.com/v1/user/unlink?target_id_type=user_id&target_id=3715136239`, params?.data + ); + return res.data; + }, + + getKakaoInfo: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `https://kapi.kakao.com/v2/user/me?property_keys=["kakao_account.email"]&target_id_type=user_id&target_id=3715136239`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/kakao-api/getKakaoInfo.ts b/src/apis/kakao-api/getKakaoInfo.ts new file mode 100644 index 00000000..92c82449 --- /dev/null +++ b/src/apis/kakao-api/getKakaoInfo.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { kakaoApiApi, KakaoInfoResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetKakaoInfo = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys['kakao-api'].kakaoInfo, params], + queryFn: () => kakaoApiApi.getKakaoInfo(params ? { params } : {}), + }); +}; + +export default useGetKakaoInfo; \ No newline at end of file diff --git a/src/apis/kakao-api/getKakaoUserIds.ts b/src/apis/kakao-api/getKakaoUserIds.ts new file mode 100644 index 00000000..dc85cac5 --- /dev/null +++ b/src/apis/kakao-api/getKakaoUserIds.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { kakaoApiApi, KakaoUserIdsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetKakaoUserIds = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys['kakao-api'].kakaoUserIds, params], + queryFn: () => kakaoApiApi.getKakaoUserIds(params ? { params } : {}), + }); +}; + +export default useGetKakaoUserIds; \ No newline at end of file diff --git a/src/apis/kakao-api/index.ts b/src/apis/kakao-api/index.ts new file mode 100644 index 00000000..fd15422d --- /dev/null +++ b/src/apis/kakao-api/index.ts @@ -0,0 +1,4 @@ +export { default as api } from './api'; +export { default as getKakaoInfo } from './getKakaoInfo'; +export { default as getKakaoUserIds } from './getKakaoUserIds'; +export { default as postKakaoUnlink } from './postKakaoUnlink'; diff --git a/src/apis/kakao-api/postKakaoUnlink.ts b/src/apis/kakao-api/postKakaoUnlink.ts new file mode 100644 index 00000000..c20d19d0 --- /dev/null +++ b/src/apis/kakao-api/postKakaoUnlink.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { kakaoApiApi, KakaoUnlinkResponse, KakaoUnlinkRequest } from "./api"; + +const usePostKakaoUnlink = () => { + return useMutation({ + mutationFn: (data) => kakaoApiApi.postKakaoUnlink({ data }), + }); +}; + +export default usePostKakaoUnlink; \ No newline at end of file diff --git a/src/apis/mentor/api.ts b/src/apis/mentor/api.ts new file mode 100644 index 00000000..1a11d710 --- /dev/null +++ b/src/apis/mentor/api.ts @@ -0,0 +1,230 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface MatchedMentorsResponseContentItem { + id: number; + roomId: number; + nickname: string; + profileImageUrl: string; + country: string; + universityName: string; + term: string; + menteeCount: number; + hasBadge: boolean; + introduction: string; + channels: MatchedMentorsResponseContentItemChannelsItem[]; + isApplied: boolean; +} + +export interface MatchedMentorsResponseContentItemChannelsItem { + type: string; + url: string; +} + +export interface MatchedMentorsResponse { + content: MatchedMentorsResponseContentItem[]; + nextPageNumber: number; +} + +export interface ApplyMentoringResponse { + mentoringId: number; +} + +export type ApplyMentoringRequest = Record; + +export interface ConfirmMentoringResponse { + checkedMentoringIds: number[]; +} + +export type ConfirmMentoringRequest = Record; + +export interface AppliedMentoringsResponseContentItem { + mentoringId: number; + profileImageUrl: null; + nickname: string; + isChecked: boolean; + createdAt: string; + chatRoomId: number; +} + +export interface AppliedMentoringsResponse { + content: AppliedMentoringsResponseContentItem[]; + nextPageNumber: number; +} + +export interface MentorListResponseContentItem { + id: number; + profileImageUrl: string; + nickname: string; + country: string; + universityName: string; + term: string; + menteeCount: number; + hasBadge: boolean; + introduction: string; + channels: MentorListResponseContentItemChannelsItem[]; + isApplied: boolean; +} + +export interface MentorListResponseContentItemChannelsItem { + type: string; + url: string; +} + +export interface MentorListResponse { + nextPageNumber: number; + content: MentorListResponseContentItem[]; +} + +export interface MentorDetailResponseChannelsItem { + type: string; + url: string; +} + +export interface MentorDetailResponse { + id: number; + profileImageUrl: string; + nickname: string; + country: string; + universityName: string; + term: string; + menteeCount: number; + hasBadge: boolean; + introduction: string; + channels: MentorDetailResponseChannelsItem[]; + passTip: string; + isApplied: boolean; +} + +export interface MyMentorPageResponseChannelsItem { + type: string; + url: string; +} + +export interface MyMentorPageResponse { + id: number; + profileImageUrl: null; + nickname: string; + country: string; + universityName: string; + term: string; + menteeCount: number; + hasBadge: boolean; + introduction: string; + passTip: string; + channels: MyMentorPageResponseChannelsItem[]; +} + +export type UpdateMyMentorPageResponse = Record; + +export type UpdateMyMentorPageRequest = Record; + +export interface MentoringStatusResponse { + mentoringId: number; +} + +export type MentoringStatusRequest = Record; + +export interface ReceivedMentoringsResponseContentItem { + mentoringId: number; + profileImageUrl: null; + nickname: string; + isChecked: boolean; + verifyStatus: string; + createdAt: string; +} + +export interface ReceivedMentoringsResponse { + content: ReceivedMentoringsResponseContentItem[]; + nextPageNumber: number; +} + +export interface UnconfirmedMentoringCountResponse { + uncheckedCount: number; +} + +export const mentorApi = { + getMatchedMentors: async (params: { defaultSize: string | number, defaultPage: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/mentee/mentorings/matched-mentors?size=${params.defaultSize}&page=${params.defaultPage}`, { params: params?.params } + ); + return res.data; + }, + + postApplyMentoring: async (params: { data?: ApplyMentoringRequest }): Promise => { + const res = await axiosInstance.post( + `/mentee/mentorings`, params?.data + ); + return res.data; + }, + + patchConfirmMentoring: async (params: { data?: ConfirmMentoringRequest }): Promise => { + const res = await axiosInstance.patch( + `/mentee/mentorings/check`, params?.data + ); + return res.data; + }, + + getAppliedMentorings: async (params: { verifyStatus: string | number, defaultSize: string | number, defaultPage: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/mentee/mentorings?verify-status=${params.verifyStatus}&size=${params.defaultSize}&page=${params.defaultPage}`, { params: params?.params } + ); + return res.data; + }, + + getMentorList: async (params: { defaultSize: string | number, defaultPage: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/mentors?region=미주권&size=${params.defaultSize}&page=${params.defaultPage}`, { params: params?.params } + ); + return res.data; + }, + + getMentorDetail: async (params: { mentorId: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/mentors/${params.mentorId}`, { params: params?.params } + ); + return res.data; + }, + + getMyMentorPage: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/mentor/my`, { params: params?.params } + ); + return res.data; + }, + + putUpdateMyMentorPage: async (params: { data?: UpdateMyMentorPageRequest }): Promise => { + const res = await axiosInstance.put( + `/mentor/my`, params?.data + ); + return res.data; + }, + + patchMentoringStatus: async (params: { mentoringId: string | number, data?: MentoringStatusRequest }): Promise => { + const res = await axiosInstance.patch( + `/mentor/mentorings/${params.mentoringId}`, params?.data + ); + return res.data; + }, + + patchConfirmMentoring: async (params: { data?: ConfirmMentoringRequest }): Promise => { + const res = await axiosInstance.patch( + `/mentor/mentorings/check`, params?.data + ); + return res.data; + }, + + getReceivedMentorings: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/mentor/mentorings`, { params: params?.params } + ); + return res.data; + }, + + getUnconfirmedMentoringCount: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/mentor/mentorings/check`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/mentor/getAppliedMentorings.ts b/src/apis/mentor/getAppliedMentorings.ts new file mode 100644 index 00000000..54a9d70b --- /dev/null +++ b/src/apis/mentor/getAppliedMentorings.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { mentorApi, AppliedMentoringsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetAppliedMentorings = (verifyStatus: string | number, defaultSize: string | number, defaultPage: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.mentor.appliedMentorings, verifyStatus, defaultSize, defaultPage, params], + queryFn: () => mentorApi.getAppliedMentorings({ verifyStatus, defaultSize, defaultPage, params }), + enabled: !!verifyStatus && !!defaultSize && !!defaultPage, + }); +}; + +export default useGetAppliedMentorings; \ No newline at end of file diff --git a/src/apis/mentor/getMatchedMentors.ts b/src/apis/mentor/getMatchedMentors.ts new file mode 100644 index 00000000..40ff31b9 --- /dev/null +++ b/src/apis/mentor/getMatchedMentors.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { mentorApi, MatchedMentorsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetMatchedMentors = (defaultSize: string | number, defaultPage: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.mentor.matchedMentors, defaultSize, defaultPage, params], + queryFn: () => mentorApi.getMatchedMentors({ defaultSize, defaultPage, params }), + enabled: !!defaultSize && !!defaultPage, + }); +}; + +export default useGetMatchedMentors; \ No newline at end of file diff --git a/src/apis/mentor/getMentorDetail.ts b/src/apis/mentor/getMentorDetail.ts new file mode 100644 index 00000000..88f22b9e --- /dev/null +++ b/src/apis/mentor/getMentorDetail.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { mentorApi, MentorDetailResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetMentorDetail = (mentorId: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.mentor.mentorDetail, mentorId, params], + queryFn: () => mentorApi.getMentorDetail({ mentorId, params }), + enabled: !!mentorId, + }); +}; + +export default useGetMentorDetail; \ No newline at end of file diff --git a/src/apis/mentor/getMentorList.ts b/src/apis/mentor/getMentorList.ts new file mode 100644 index 00000000..465458c0 --- /dev/null +++ b/src/apis/mentor/getMentorList.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { mentorApi, MentorListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetMentorList = (defaultSize: string | number, defaultPage: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.mentor.mentorList, defaultSize, defaultPage, params], + queryFn: () => mentorApi.getMentorList({ defaultSize, defaultPage, params }), + enabled: !!defaultSize && !!defaultPage, + }); +}; + +export default useGetMentorList; \ No newline at end of file diff --git a/src/apis/mentor/getMyMentorPage.ts b/src/apis/mentor/getMyMentorPage.ts new file mode 100644 index 00000000..db6d1b42 --- /dev/null +++ b/src/apis/mentor/getMyMentorPage.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { mentorApi, MyMentorPageResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetMyMentorPage = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.mentor.myMentorPage, params], + queryFn: () => mentorApi.getMyMentorPage(params ? { params } : {}), + }); +}; + +export default useGetMyMentorPage; \ No newline at end of file diff --git a/src/apis/mentor/getReceivedMentorings.ts b/src/apis/mentor/getReceivedMentorings.ts new file mode 100644 index 00000000..81d875cf --- /dev/null +++ b/src/apis/mentor/getReceivedMentorings.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { mentorApi, ReceivedMentoringsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetReceivedMentorings = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.mentor.receivedMentorings, params], + queryFn: () => mentorApi.getReceivedMentorings(params ? { params } : {}), + }); +}; + +export default useGetReceivedMentorings; \ No newline at end of file diff --git a/src/apis/mentor/getUnconfirmedMentoringCount.ts b/src/apis/mentor/getUnconfirmedMentoringCount.ts new file mode 100644 index 00000000..7c3b9c1b --- /dev/null +++ b/src/apis/mentor/getUnconfirmedMentoringCount.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { mentorApi, UnconfirmedMentoringCountResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetUnconfirmedMentoringCount = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.mentor.unconfirmedMentoringCount, params], + queryFn: () => mentorApi.getUnconfirmedMentoringCount(params ? { params } : {}), + }); +}; + +export default useGetUnconfirmedMentoringCount; \ No newline at end of file diff --git a/src/apis/mentor/index.ts b/src/apis/mentor/index.ts new file mode 100644 index 00000000..30ed84bc --- /dev/null +++ b/src/apis/mentor/index.ts @@ -0,0 +1,12 @@ +export { default as api } from './api'; +export { default as getAppliedMentorings } from './getAppliedMentorings'; +export { default as getMatchedMentors } from './getMatchedMentors'; +export { default as getMentorDetail } from './getMentorDetail'; +export { default as getMentorList } from './getMentorList'; +export { default as getMyMentorPage } from './getMyMentorPage'; +export { default as getReceivedMentorings } from './getReceivedMentorings'; +export { default as getUnconfirmedMentoringCount } from './getUnconfirmedMentoringCount'; +export { default as patchConfirmMentoring } from './patchConfirmMentoring'; +export { default as patchMentoringStatus } from './patchMentoringStatus'; +export { default as postApplyMentoring } from './postApplyMentoring'; +export { default as putUpdateMyMentorPage } from './putUpdateMyMentorPage'; diff --git a/src/apis/mentor/legacy/patchConfirmMentoring.ts b/src/apis/mentor/legacy/patchConfirmMentoring.ts new file mode 100644 index 00000000..43e07f3f --- /dev/null +++ b/src/apis/mentor/legacy/patchConfirmMentoring.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { mentorApi, ConfirmMentoringResponse, ConfirmMentoringRequest } from "./api"; + +const usePatchConfirmMentoring = () => { + return useMutation({ + mutationFn: (data) => mentorApi.patchConfirmMentoring({ data }), + }); +}; + +export default usePatchConfirmMentoring; \ No newline at end of file diff --git a/src/apis/mentor/patchConfirmMentoring.ts b/src/apis/mentor/patchConfirmMentoring.ts new file mode 100644 index 00000000..43e07f3f --- /dev/null +++ b/src/apis/mentor/patchConfirmMentoring.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { mentorApi, ConfirmMentoringResponse, ConfirmMentoringRequest } from "./api"; + +const usePatchConfirmMentoring = () => { + return useMutation({ + mutationFn: (data) => mentorApi.patchConfirmMentoring({ data }), + }); +}; + +export default usePatchConfirmMentoring; \ No newline at end of file diff --git a/src/apis/mentor/patchMentoringStatus.ts b/src/apis/mentor/patchMentoringStatus.ts new file mode 100644 index 00000000..eec04d74 --- /dev/null +++ b/src/apis/mentor/patchMentoringStatus.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { mentorApi, MentoringStatusResponse, MentoringStatusRequest } from "./api"; + +const usePatchMentoringStatus = () => { + return useMutation({ + mutationFn: (variables) => mentorApi.patchMentoringStatus(variables), + }); +}; + +export default usePatchMentoringStatus; \ No newline at end of file diff --git a/src/apis/mentor/postApplyMentoring.ts b/src/apis/mentor/postApplyMentoring.ts new file mode 100644 index 00000000..f5a54e52 --- /dev/null +++ b/src/apis/mentor/postApplyMentoring.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { mentorApi, ApplyMentoringResponse, ApplyMentoringRequest } from "./api"; + +const usePostApplyMentoring = () => { + return useMutation({ + mutationFn: (data) => mentorApi.postApplyMentoring({ data }), + }); +}; + +export default usePostApplyMentoring; \ No newline at end of file diff --git a/src/apis/mentor/putUpdateMyMentorPage.ts b/src/apis/mentor/putUpdateMyMentorPage.ts new file mode 100644 index 00000000..a3cd5a31 --- /dev/null +++ b/src/apis/mentor/putUpdateMyMentorPage.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { mentorApi, UpdateMyMentorPageResponse, UpdateMyMentorPageRequest } from "./api"; + +const usePutUpdateMyMentorPage = () => { + return useMutation({ + mutationFn: (data) => mentorApi.putUpdateMyMentorPage({ data }), + }); +}; + +export default usePutUpdateMyMentorPage; \ No newline at end of file diff --git a/src/apis/news/api.ts b/src/apis/news/api.ts new file mode 100644 index 00000000..13a68b0b --- /dev/null +++ b/src/apis/news/api.ts @@ -0,0 +1,79 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface NewsListResponseNewsResponseListItem { + id: number; + title: string; + description: string; + url: string; + thumbnailUrl: string; + updatedAt: string; +} + +export interface NewsListResponse { + newsResponseList: NewsListResponseNewsResponseListItem[]; +} + +export interface NewsResponse { + id: number; +} + +export interface UpdateNewsResponse { + id: number; +} + +export type UpdateNewsRequest = Record; + +export type LikeNewsResponse = void; + +export type LikeNewsRequest = Record; + +export interface CreateNewsResponse { + id: number; +} + +export type CreateNewsRequest = Record; + +export const newsApi = { + getNewsList: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/news?author-id=6`, { params: params?.params } + ); + return res.data; + }, + + deleteNews: async (params: { newsId: string | number }): Promise => { + const res = await axiosInstance.delete( + `/news/${params.newsId}` + ); + return res.data; + }, + + putUpdateNews: async (params: { newsId: string | number, data?: UpdateNewsRequest }): Promise => { + const res = await axiosInstance.put( + `/news/${params.newsId}`, params?.data + ); + return res.data; + }, + + postLikeNews: async (params: { newsId: string | number, data?: LikeNewsRequest }): Promise => { + const res = await axiosInstance.post( + `/news/${params.newsId}/like`, params?.data + ); + return res.data; + }, + + deleteLikeNews: async (params: { newsId: string | number }): Promise => { + const res = await axiosInstance.delete( + `/news/${params.newsId}/like` + ); + return res.data; + }, + + postCreateNews: async (params: { data?: CreateNewsRequest }): Promise => { + const res = await axiosInstance.post( + `/news`, params?.data + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/news/deleteLikeNews.ts b/src/apis/news/deleteLikeNews.ts new file mode 100644 index 00000000..9e0ad49c --- /dev/null +++ b/src/apis/news/deleteLikeNews.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { newsApi, LikeNewsResponse, LikeNewsRequest } from "./api"; + +const useDeleteLikeNews = () => { + return useMutation({ + mutationFn: (variables) => newsApi.deleteLikeNews(variables), + }); +}; + +export default useDeleteLikeNews; \ No newline at end of file diff --git a/src/apis/news/deleteNews.ts b/src/apis/news/deleteNews.ts new file mode 100644 index 00000000..854b6392 --- /dev/null +++ b/src/apis/news/deleteNews.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { newsApi, NewsResponse, NewsRequest } from "./api"; + +const useDeleteNews = () => { + return useMutation({ + mutationFn: (variables) => newsApi.deleteNews(variables), + }); +}; + +export default useDeleteNews; \ No newline at end of file diff --git a/src/apis/news/getNewsList.ts b/src/apis/news/getNewsList.ts new file mode 100644 index 00000000..bd2f587d --- /dev/null +++ b/src/apis/news/getNewsList.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { newsApi, NewsListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetNewsList = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.news.newsList, params], + queryFn: () => newsApi.getNewsList(params ? { params } : {}), + }); +}; + +export default useGetNewsList; \ No newline at end of file diff --git a/src/apis/news/index.ts b/src/apis/news/index.ts new file mode 100644 index 00000000..95d2c987 --- /dev/null +++ b/src/apis/news/index.ts @@ -0,0 +1,7 @@ +export { default as api } from './api'; +export { default as deleteLikeNews } from './deleteLikeNews'; +export { default as deleteNews } from './deleteNews'; +export { default as getNewsList } from './getNewsList'; +export { default as postCreateNews } from './postCreateNews'; +export { default as postLikeNews } from './postLikeNews'; +export { default as putUpdateNews } from './putUpdateNews'; diff --git a/src/apis/news/postCreateNews.ts b/src/apis/news/postCreateNews.ts new file mode 100644 index 00000000..075351f2 --- /dev/null +++ b/src/apis/news/postCreateNews.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { newsApi, CreateNewsResponse, CreateNewsRequest } from "./api"; + +const usePostCreateNews = () => { + return useMutation({ + mutationFn: (data) => newsApi.postCreateNews({ data }), + }); +}; + +export default usePostCreateNews; \ No newline at end of file diff --git a/src/apis/news/postLikeNews.ts b/src/apis/news/postLikeNews.ts new file mode 100644 index 00000000..9aaf4c53 --- /dev/null +++ b/src/apis/news/postLikeNews.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { newsApi, LikeNewsResponse, LikeNewsRequest } from "./api"; + +const usePostLikeNews = () => { + return useMutation({ + mutationFn: (variables) => newsApi.postLikeNews(variables), + }); +}; + +export default usePostLikeNews; \ No newline at end of file diff --git a/src/apis/news/putUpdateNews.ts b/src/apis/news/putUpdateNews.ts new file mode 100644 index 00000000..d7fedea7 --- /dev/null +++ b/src/apis/news/putUpdateNews.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { newsApi, UpdateNewsResponse, UpdateNewsRequest } from "./api"; + +const usePutUpdateNews = () => { + return useMutation({ + mutationFn: (variables) => newsApi.putUpdateNews(variables), + }); +}; + +export default usePutUpdateNews; \ No newline at end of file diff --git a/src/apis/queryKeys.ts b/src/apis/queryKeys.ts new file mode 100644 index 00000000..2a1d2c8b --- /dev/null +++ b/src/apis/queryKeys.ts @@ -0,0 +1,132 @@ +/** + * React Query Keys + * Bruno 폴더 구조를 기반으로 자동 생성됨 + */ + +export const QueryKeys = { + Auth: { + folder: 'Auth.folder' as const, + signOut: 'Auth.signOut' as const, + appleAuth: 'Auth.appleAuth' as const, + refreshToken: 'Auth.refreshToken' as const, + emailLogin: 'Auth.emailLogin' as const, + emailVerification: 'Auth.emailVerification' as const, + kakaoAuth: 'Auth.kakaoAuth' as const, + account: 'Auth.account' as const, + signUp: 'Auth.signUp' as const, + }, + news: { + folder: 'news.folder' as const, + newsList: 'news.newsList' as const, + news: 'news.news' as const, + updateNews: 'news.updateNews' as const, + likeNews: 'news.likeNews' as const, + createNews: 'news.createNews' as const, + }, + reports: { + folder: 'reports.folder' as const, + report: 'reports.report' as const, + }, + chat: { + folder: 'chat.folder' as const, + chatMessages: 'chat.chatMessages' as const, + chatRooms: 'chat.chatRooms' as const, + readChatRoom: 'chat.readChatRoom' as const, + chatPartner: 'chat.chatPartner' as const, + }, + universities: { + folder: 'universities.folder' as const, + recommendedUniversities: 'universities.recommendedUniversities' as const, + wishList: 'universities.wishList' as const, + wish: 'universities.wish' as const, + addWish: 'universities.addWish' as const, + isWish: 'universities.isWish' as const, + universityDetail: 'universities.universityDetail' as const, + searchText: 'universities.searchText' as const, + searchFilter: 'universities.searchFilter' as const, + byRegionCountry: 'universities.byRegionCountry' as const, + }, + MyPage: { + folder: 'MyPage.folder' as const, + interestedRegionCountry: 'MyPage.interestedRegionCountry' as const, + profile: 'MyPage.profile' as const, + password: 'MyPage.password' as const, + }, + applications: { + folder: 'applications.folder' as const, + competitors: 'applications.competitors' as const, + submitApplication: 'applications.submitApplication' as const, + applicants: 'applications.applicants' as const, + }, + community: { + folder: 'community.folder' as const, + boardList: 'community.boardList' as const, + board: 'community.board' as const, + comment: 'community.comment' as const, + updateComment: 'community.updateComment' as const, + createComment: 'community.createComment' as const, + post: 'community.post' as const, + updatePost: 'community.updatePost' as const, + createPost: 'community.createPost' as const, + postDetail: 'community.postDetail' as const, + likePost: 'community.likePost' as const, + }, + Scores: { + folder: 'Scores.folder' as const, + createLanguageTest: 'Scores.createLanguageTest' as const, + languageTestList: 'Scores.languageTestList' as const, + createGpa: 'Scores.createGpa' as const, + gpaList: 'Scores.gpaList' as const, + }, + Admin: { + folder: 'Admin.folder' as const, + verifyLanguageTest: 'Admin.verifyLanguageTest' as const, + languageTestList: 'Admin.languageTestList' as const, + verifyGpa: 'Admin.verifyGpa' as const, + gpaList: 'Admin.gpaList' as const, + }, + users: { + folder: 'users.folder' as const, + nicknameExists: 'users.nicknameExists' as const, + blockUser: 'users.blockUser' as const, + unblockUser: 'users.unblockUser' as const, + blockedUsers: 'users.blockedUsers' as const, + }, + mentor: { + folder: 'mentor.folder' as const, + matchedMentors: 'mentor.matchedMentors' as const, + applyMentoring: 'mentor.applyMentoring' as const, + confirmMentoring: 'mentor.confirmMentoring' as const, + appliedMentorings: 'mentor.appliedMentorings' as const, + mentorList: 'mentor.mentorList' as const, + mentorDetail: 'mentor.mentorDetail' as const, + myMentorPage: 'mentor.myMentorPage' as const, + updateMyMentorPage: 'mentor.updateMyMentorPage' as const, + mentoringStatus: 'mentor.mentoringStatus' as const, + receivedMentorings: 'mentor.receivedMentorings' as const, + unconfirmedMentoringCount: 'mentor.unconfirmedMentoringCount' as const, + }, + 'kakao-api': { + folder: 'kakao-api.folder' as const, + kakaoUserIds: 'kakao-api.kakaoUserIds' as const, + kakaoUnlink: 'kakao-api.kakaoUnlink' as const, + kakaoInfo: 'kakao-api.kakaoInfo' as const, + }, + 'collection.bru': { + collection: 'collection.bru.collection' as const, + }, + environments: { + dev: 'environments.dev' as const, + local: 'environments.local' as const, + }, + 'image-upload': { + folder: 'image-upload.folder' as const, + slackNotification: 'image-upload.slackNotification' as const, + uploadLanguageTestReport: 'image-upload.uploadLanguageTestReport' as const, + uploadProfileImage: 'image-upload.uploadProfileImage' as const, + uploadProfileImageBeforeSignup: 'image-upload.uploadProfileImageBeforeSignup' as const, + uploadGpaReport: 'image-upload.uploadGpaReport' as const, + }, +} as const; + +export type QueryKey = typeof QueryKeys[keyof typeof QueryKeys]; \ No newline at end of file diff --git a/src/apis/reports/api.ts b/src/apis/reports/api.ts new file mode 100644 index 00000000..39bd649c --- /dev/null +++ b/src/apis/reports/api.ts @@ -0,0 +1,15 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export type ReportResponse = Record; + +export type ReportRequest = Record; + +export const reportsApi = { + postReport: async (params: { data?: ReportRequest }): Promise => { + const res = await axiosInstance.post( + `/reports`, params?.data + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/reports/index.ts b/src/apis/reports/index.ts new file mode 100644 index 00000000..b2658a40 --- /dev/null +++ b/src/apis/reports/index.ts @@ -0,0 +1,2 @@ +export { default as api } from './api'; +export { default as postReport } from './postReport'; diff --git a/src/apis/reports/postReport.ts b/src/apis/reports/postReport.ts new file mode 100644 index 00000000..76fd804f --- /dev/null +++ b/src/apis/reports/postReport.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { reportsApi, ReportResponse, ReportRequest } from "./api"; + +const usePostReport = () => { + return useMutation({ + mutationFn: (data) => reportsApi.postReport({ data }), + }); +}; + +export default usePostReport; \ No newline at end of file diff --git a/src/apis/universities/api.ts b/src/apis/universities/api.ts new file mode 100644 index 00000000..c11d4141 --- /dev/null +++ b/src/apis/universities/api.ts @@ -0,0 +1,196 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface RecommendedUniversitiesResponseRecommendedUniversitiesItem { + id: number; + term: string; + koreanName: string; + region: string; + country: string; + logoImageUrl: string; + backgroundImageUrl: string; + studentCapacity: number; + languageRequirements: RecommendedUniversitiesResponseRecommendedUniversitiesItemLanguageRequirementsItem[]; +} + +export interface RecommendedUniversitiesResponseRecommendedUniversitiesItemLanguageRequirementsItem { + languageTestType: string; + minScore: string; +} + +export interface RecommendedUniversitiesResponse { + recommendedUniversities: RecommendedUniversitiesResponseRecommendedUniversitiesItem[]; +} + +export interface WishListResponseItem { + id: number; + term: string; + koreanName: string; + region: string; + country: string; + logoImageUrl: string; + backgroundImageUrl: string; + studentCapacity: number; + languageRequirements: WishListResponseItemLanguageRequirementsItem[]; +} + +export interface WishListResponseItemLanguageRequirementsItem { + languageTestType: string; + minScore: string; +} + +export interface WishListResponse { + 0: WishListResponse0; + 1: WishListResponse1; +} + +export type WishResponse = void; + +export type AddWishResponse = void; + +export type AddWishRequest = Record; + +export type IsWishResponse = void; + +export interface UniversityDetailResponseLanguageRequirementsItem { + languageTestType: string; + minScore: string; +} + +export interface UniversityDetailResponse { + id: number; + term: string; + koreanName: string; + englishName: string; + formatName: string; + region: string; + country: string; + homepageUrl: string; + logoImageUrl: string; + backgroundImageUrl: string; + detailsForLocal: string; + studentCapacity: number; + tuitionFeeType: string; + semesterAvailableForDispatch: string; + languageRequirements: UniversityDetailResponseLanguageRequirementsItem[]; + detailsForLanguage: string; + gpaRequirement: string; + gpaRequirementCriteria: string; + semesterRequirement: string; + detailsForApply: null; + detailsForMajor: string; + detailsForAccommodation: null; + detailsForEnglishCourse: null; + details: string; + accommodationUrl: string; + englishCourseUrl: string; +} + +export interface SearchTextResponseUnivApplyInfoPreviewsItem { + id: number; + term: string; + koreanName: string; + region: string; + country: string; + logoImageUrl: string; + backgroundImageUrl: string; + studentCapacity: number; + languageRequirements: SearchTextResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem[]; +} + +export interface SearchTextResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem { + languageTestType: string; + minScore: string; +} + +export interface SearchTextResponse { + univApplyInfoPreviews: SearchTextResponseUnivApplyInfoPreviewsItem[]; +} + +export interface SearchFilterResponseUnivApplyInfoPreviewsItem { + id: number; + term: string; + koreanName: string; + region: string; + country: string; + logoImageUrl: string; + backgroundImageUrl: string; + studentCapacity: number; + languageRequirements: SearchFilterResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem[]; +} + +export interface SearchFilterResponseUnivApplyInfoPreviewsItemLanguageRequirementsItem { + languageTestType: string; + minScore: string; +} + +export interface SearchFilterResponse { + univApplyInfoPreviews: SearchFilterResponseUnivApplyInfoPreviewsItem[]; +} + +export type ByRegionCountryResponse = void; + +export const universitiesApi = { + getRecommendedUniversities: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/univ-apply-infos/recommend`, { params: params?.params } + ); + return res.data; + }, + + getWishList: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/univ-apply-infos/like`, { params: params?.params } + ); + return res.data; + }, + + deleteWish: async (params: { univApplyInfoId: string | number }): Promise => { + const res = await axiosInstance.delete( + `/univ-apply-infos/${params.univApplyInfoId}/like` + ); + return res.data; + }, + + postAddWish: async (params: { univApplyInfoId: string | number, data?: AddWishRequest }): Promise => { + const res = await axiosInstance.post( + `/univ-apply-infos/${params.univApplyInfoId}/like`, params?.data + ); + return res.data; + }, + + getIsWish: async (params: { univApplyInfoId: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/univ-apply-infos/${params.univApplyInfoId}/like`, { params: params?.params } + ); + return res.data; + }, + + getUniversityDetail: async (params: { univApplyInfoId: string | number, params?: Record }): Promise => { + const res = await axiosInstance.get( + `/univ-apply-infos/${params.univApplyInfoId}`, { params: params?.params } + ); + return res.data; + }, + + getSearchText: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/univ-apply-infos/search/text?value=괌`, { params: params?.params } + ); + return res.data; + }, + + getSearchFilter: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/univ-apply-infos/search/filter`, { params: params?.params } + ); + return res.data; + }, + + getByRegionCountry: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/universities/search`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/universities/deleteWish.ts b/src/apis/universities/deleteWish.ts new file mode 100644 index 00000000..e4c88b1f --- /dev/null +++ b/src/apis/universities/deleteWish.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { universitiesApi, WishResponse, WishRequest } from "./api"; + +const useDeleteWish = () => { + return useMutation({ + mutationFn: (variables) => universitiesApi.deleteWish(variables), + }); +}; + +export default useDeleteWish; \ No newline at end of file diff --git a/src/apis/universities/getByRegionCountry.ts b/src/apis/universities/getByRegionCountry.ts new file mode 100644 index 00000000..baa84596 --- /dev/null +++ b/src/apis/universities/getByRegionCountry.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { universitiesApi, ByRegionCountryResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetByRegionCountry = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.universities.byRegionCountry, params], + queryFn: () => universitiesApi.getByRegionCountry(params ? { params } : {}), + }); +}; + +export default useGetByRegionCountry; \ No newline at end of file diff --git a/src/apis/universities/getIsWish.ts b/src/apis/universities/getIsWish.ts new file mode 100644 index 00000000..567a0887 --- /dev/null +++ b/src/apis/universities/getIsWish.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { universitiesApi, IsWishResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetIsWish = (univApplyInfoId: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.universities.isWish, univApplyInfoId, params], + queryFn: () => universitiesApi.getIsWish({ univApplyInfoId, params }), + enabled: !!univApplyInfoId, + }); +}; + +export default useGetIsWish; \ No newline at end of file diff --git a/src/apis/universities/getRecommendedUniversities.ts b/src/apis/universities/getRecommendedUniversities.ts new file mode 100644 index 00000000..014e50e7 --- /dev/null +++ b/src/apis/universities/getRecommendedUniversities.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { universitiesApi, RecommendedUniversitiesResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetRecommendedUniversities = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.universities.recommendedUniversities, params], + queryFn: () => universitiesApi.getRecommendedUniversities(params ? { params } : {}), + }); +}; + +export default useGetRecommendedUniversities; \ No newline at end of file diff --git a/src/apis/universities/getSearchFilter.ts b/src/apis/universities/getSearchFilter.ts new file mode 100644 index 00000000..34befa8e --- /dev/null +++ b/src/apis/universities/getSearchFilter.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { universitiesApi, SearchFilterResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetSearchFilter = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.universities.searchFilter, params], + queryFn: () => universitiesApi.getSearchFilter(params ? { params } : {}), + }); +}; + +export default useGetSearchFilter; \ No newline at end of file diff --git a/src/apis/universities/getSearchText.ts b/src/apis/universities/getSearchText.ts new file mode 100644 index 00000000..30967c5e --- /dev/null +++ b/src/apis/universities/getSearchText.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { universitiesApi, SearchTextResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetSearchText = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.universities.searchText, params], + queryFn: () => universitiesApi.getSearchText(params ? { params } : {}), + }); +}; + +export default useGetSearchText; \ No newline at end of file diff --git a/src/apis/universities/getUniversityDetail.ts b/src/apis/universities/getUniversityDetail.ts new file mode 100644 index 00000000..f5601ea6 --- /dev/null +++ b/src/apis/universities/getUniversityDetail.ts @@ -0,0 +1,14 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { universitiesApi, UniversityDetailResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetUniversityDetail = (univApplyInfoId: string | number, params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.universities.universityDetail, univApplyInfoId, params], + queryFn: () => universitiesApi.getUniversityDetail({ univApplyInfoId, params }), + enabled: !!univApplyInfoId, + }); +}; + +export default useGetUniversityDetail; \ No newline at end of file diff --git a/src/apis/universities/getWishList.ts b/src/apis/universities/getWishList.ts new file mode 100644 index 00000000..5c9f238e --- /dev/null +++ b/src/apis/universities/getWishList.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { universitiesApi, WishListResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetWishList = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.universities.wishList, params], + queryFn: () => universitiesApi.getWishList(params ? { params } : {}), + }); +}; + +export default useGetWishList; \ No newline at end of file diff --git a/src/apis/universities/index.ts b/src/apis/universities/index.ts new file mode 100644 index 00000000..c49c3b22 --- /dev/null +++ b/src/apis/universities/index.ts @@ -0,0 +1,10 @@ +export { default as api } from './api'; +export { default as deleteWish } from './deleteWish'; +export { default as getByRegionCountry } from './getByRegionCountry'; +export { default as getIsWish } from './getIsWish'; +export { default as getRecommendedUniversities } from './getRecommendedUniversities'; +export { default as getSearchFilter } from './getSearchFilter'; +export { default as getSearchText } from './getSearchText'; +export { default as getUniversityDetail } from './getUniversityDetail'; +export { default as getWishList } from './getWishList'; +export { default as postAddWish } from './postAddWish'; diff --git a/src/apis/universities/postAddWish.ts b/src/apis/universities/postAddWish.ts new file mode 100644 index 00000000..92cf94e3 --- /dev/null +++ b/src/apis/universities/postAddWish.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { universitiesApi, AddWishResponse, AddWishRequest } from "./api"; + +const usePostAddWish = () => { + return useMutation({ + mutationFn: (variables) => universitiesApi.postAddWish(variables), + }); +}; + +export default usePostAddWish; \ No newline at end of file diff --git a/src/apis/users/api.ts b/src/apis/users/api.ts new file mode 100644 index 00000000..e9c4b789 --- /dev/null +++ b/src/apis/users/api.ts @@ -0,0 +1,54 @@ +import { axiosInstance } from "@/utils/axiosInstance"; + +export interface NicknameExistsResponse { + exists: boolean; +} + +export type BlockUserResponse = void; + +export type BlockUserRequest = Record; + +export type UnblockUserResponse = void; + +export interface BlockedUsersResponseContentItem { + id: number; + blockedId: number; + nickname: string; + createdAt: string; +} + +export interface BlockedUsersResponse { + content: BlockedUsersResponseContentItem[]; + nextPageNumber: number; +} + +export const usersApi = { + getNicknameExists: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/users/exists?nickname=abc`, { params: params?.params } + ); + return res.data; + }, + + postBlockUser: async (params: { blockedId: string | number, data?: BlockUserRequest }): Promise => { + const res = await axiosInstance.post( + `/users/block/${params.blockedId}`, params?.data + ); + return res.data; + }, + + deleteUnblockUser: async (params: { blockedId: string | number }): Promise => { + const res = await axiosInstance.delete( + `/users/block/${params.blockedId}` + ); + return res.data; + }, + + getBlockedUsers: async (params: { params?: Record }): Promise => { + const res = await axiosInstance.get( + `/users/blocks`, { params: params?.params } + ); + return res.data; + }, + +}; \ No newline at end of file diff --git a/src/apis/users/deleteUnblockUser.ts b/src/apis/users/deleteUnblockUser.ts new file mode 100644 index 00000000..385dd097 --- /dev/null +++ b/src/apis/users/deleteUnblockUser.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { usersApi, UnblockUserResponse, UnblockUserRequest } from "./api"; + +const useDeleteUnblockUser = () => { + return useMutation({ + mutationFn: (variables) => usersApi.deleteUnblockUser(variables), + }); +}; + +export default useDeleteUnblockUser; \ No newline at end of file diff --git a/src/apis/users/getBlockedUsers.ts b/src/apis/users/getBlockedUsers.ts new file mode 100644 index 00000000..1681e5dd --- /dev/null +++ b/src/apis/users/getBlockedUsers.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { usersApi, BlockedUsersResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetBlockedUsers = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.users.blockedUsers, params], + queryFn: () => usersApi.getBlockedUsers(params ? { params } : {}), + }); +}; + +export default useGetBlockedUsers; \ No newline at end of file diff --git a/src/apis/users/getNicknameExists.ts b/src/apis/users/getNicknameExists.ts new file mode 100644 index 00000000..7793059c --- /dev/null +++ b/src/apis/users/getNicknameExists.ts @@ -0,0 +1,13 @@ +import { AxiosError } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { usersApi, NicknameExistsResponse } from "./api"; +import { QueryKeys } from "../queryKeys"; + +const useGetNicknameExists = (params?: Record) => { + return useQuery({ + queryKey: [QueryKeys.users.nicknameExists, params], + queryFn: () => usersApi.getNicknameExists(params ? { params } : {}), + }); +}; + +export default useGetNicknameExists; \ No newline at end of file diff --git a/src/apis/users/index.ts b/src/apis/users/index.ts new file mode 100644 index 00000000..2656ee5d --- /dev/null +++ b/src/apis/users/index.ts @@ -0,0 +1,5 @@ +export { default as api } from './api'; +export { default as deleteUnblockUser } from './deleteUnblockUser'; +export { default as getBlockedUsers } from './getBlockedUsers'; +export { default as getNicknameExists } from './getNicknameExists'; +export { default as postBlockUser } from './postBlockUser'; diff --git a/src/apis/users/postBlockUser.ts b/src/apis/users/postBlockUser.ts new file mode 100644 index 00000000..11b44fe8 --- /dev/null +++ b/src/apis/users/postBlockUser.ts @@ -0,0 +1,11 @@ +import { AxiosError } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { usersApi, BlockUserResponse, BlockUserRequest } from "./api"; + +const usePostBlockUser = () => { + return useMutation({ + mutationFn: (variables) => usersApi.postBlockUser(variables), + }); +}; + +export default usePostBlockUser; \ No newline at end of file