Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 15 additions & 18 deletions src/apis/auth/index.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,24 @@
import axiosClientHelper from '@/utils/network/axiosClientHelper';
import { LoginFormData, LoginResponse, loginResponseSchema, PutPasswordFormData } from './types';
import { isAxiosError } from 'axios';
import { isError } from 'es-toolkit/compat';
import { safeResponse } from '@/utils/network/safeResponse';

export const login = async (loginFormData: LoginFormData): LoginResponse => {
try {
const response = await axiosClientHelper.post('/auth/login', loginFormData);
/**
* login
* https://sp-taskify-api.vercel.app/docs/#/Auth/Login
*/
export const login = async (loginFormData: LoginFormData) => {
const response = await axiosClientHelper.post<LoginResponse>('/auth/login', loginFormData);
return safeResponse(response.data, loginResponseSchema);
};

const result = loginResponseSchema.safeParse(response.data);
if (!result.success) {
throw new Error('서버에서 받은 데이터가 예상과 다릅니다.');
}
return response.data;
} catch (error) {
if (isAxiosError(error)) return error.response?.data;
return { message: isError(error) ? error.message : String(error) };
}
export const logout = async () => {
await axiosClientHelper.post<void>('/auth/logout');
};

/**
* password 수정
* https://sp-taskify-api.vercel.app/docs/#/Auth/ChangePassword
*/
export const putPassword = async (putPasswordFormData: PutPasswordFormData) => {
await axiosClientHelper.put<void>('/auth/password', putPasswordFormData);
};

export const logout = async () => {
await axiosClientHelper.post<void>('/auth/logout');
};
31 changes: 31 additions & 0 deletions src/apis/auth/queries.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { login, logout, putPassword } from '.';
import { LoginFormData, PutPasswordFormData } from './types';

export const useLogin = () => {
return useMutation({
mutationFn: (loginFormData: LoginFormData) => {
return login(loginFormData);
},
});
};

export const usePutPassword = () => {
return useMutation({
mutationFn: (putPasswordFormData: PutPasswordFormData) => {
return putPassword(putPasswordFormData);
},
});
};

export const useLogout = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => {
return logout();
},
onSuccess: () => {
queryClient.invalidateQueries();
},
});
};
55 changes: 34 additions & 21 deletions src/apis/cards/index.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
import axiosClientHelper from '@/utils/network/axiosClientHelper';
import { Card, CardRequest, cardSchema, CardsResponse, cardsResponseSchema, GetCardsParams } from './types';
import { Column } from '../columns/types';
import { safeResponse } from '@/utils/network/safeResponse';

const RESPONSE_INVALID_MESSAGE = '서버에서 받은 데이터가 예상과 다릅니다';

/**
* card 생성
* https://sp-taskify-api.vercel.app/docs/#/Cards/Create
*/
export const postCard = async (cardRequest: CardRequest) => {
const response = await axiosClientHelper.post<Card>('/cards', cardRequest);
const result = cardSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, cardSchema);
};

/**
* cards 목록 조회
* https://sp-taskify-api.vercel.app/docs/#/Cards/Find
*/
export const getCards = async (params: GetCardsParams) => {
const { cursorId, size, columnId } = params;
const response = await axiosClientHelper.get<CardsResponse>('/cards', {
Expand All @@ -20,32 +25,40 @@ export const getCards = async (params: GetCardsParams) => {
...(cursorId && { cursorId }),
},
});
const result = cardsResponseSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, cardsResponseSchema);
};

/**
* card 상세 조회
* https://sp-taskify-api.vercel.app/docs/#/Cards/Get
*/
export const getCard = async (cardId: number) => {
const response = await axiosClientHelper.get<Card>(`/cards/${cardId}`);
return safeResponse(response.data, cardSchema);
};

/**
* card 수정
* https://sp-taskify-api.vercel.app/docs/#/Cards/Update
*/
export const putCard = async (cardId: number, cardRequest: CardRequest) => {
const response = await axiosClientHelper.put<Card>(`/cards/${cardId}`, cardRequest);
const result = cardSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, cardSchema);
};

/**
* card 드래그 이동
* https://sp-taskify-api.vercel.app/docs/#/Cards/Update
*/
export const moveCard = async (cardId: Card['id'], columnId: Column['id']) => {
const response = await axiosClientHelper.put<Card>(`/cards/${cardId}`, { columnId });
const result = cardSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
};

export const getCard = async (cardId: number) => {
const response = await axiosClientHelper.get<Card>(`/cards/${cardId}`);
const result = cardSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, cardSchema);
};

/**
* card 삭제
* https://sp-taskify-api.vercel.app/docs/#/Cards/Delete
*/
export const deleteCard = async (cardId: number) => {
await axiosClientHelper.delete<void>(`/cards/${cardId}`);
};
File renamed without changes.
41 changes: 25 additions & 16 deletions src/apis/columns/index.ts
Original file line number Diff line number Diff line change
@@ -1,47 +1,56 @@
import axiosClientHelper from '@/utils/network/axiosClientHelper';
import { CardImageForm, CardImageResponse, cardImageResponseSchema, Column, ColumnForm, columnSchema, ColumnsResponse, columnsResponseSchema, GetColumnsParams } from './types';
import { safeResponse } from '@/utils/network/safeResponse';

const RESPONSE_INVALID_MESSAGE = '서버에서 받은 데이터가 예상과 다릅니다';

/**
* column 생성
* https://sp-taskify-api.vercel.app/docs/#/Columns/Create
*/
export const postColumn = async (dashboardId: number, columnForm: ColumnForm) => {
const response = await axiosClientHelper.post<Column>('/columns', {
...columnForm,
dashboardId,
});
const result = columnSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, columnSchema);
};

/**
* columns 목록 조회
* https://sp-taskify-api.vercel.app/docs/#/Columns/Find
*/
export const getColumns = async (params: GetColumnsParams) => {
const response = await axiosClientHelper.get<ColumnsResponse>('/columns', {
params,
});

const result = columnsResponseSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, columnsResponseSchema);
};

/**
* column 수정
* https://sp-taskify-api.vercel.app/docs/#/Columns/Update
*/
export const putColumn = async (columnId: number, columnForm: ColumnForm) => {
const response = await axiosClientHelper.put<Column>(`/columns/${columnId}`, columnForm);
const result = columnSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, columnSchema);
};

/**
* column 삭제
* https://sp-taskify-api.vercel.app/docs/#/Columns/Delete
*/
export const deleteColumn = async (columnId: number) => {
await axiosClientHelper.delete<void>(`/columns/${columnId}`);
};

/**
* card image 생성
* https://sp-taskify-api.vercel.app/docs/#/Columns/UploadImage
*/
export const postCardImage = async (columnId: number, cardImageForm: CardImageForm) => {
const response = await axiosClientHelper.post<CardImageResponse>(`/columns/${columnId}/card-image`, cardImageForm, {
headers: {
'Content-Type': 'multipart/form-data',
},
});

const result = cardImageResponseSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, cardImageResponseSchema);
};
File renamed without changes.
31 changes: 20 additions & 11 deletions src/apis/comments/index.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,38 @@
import axiosClientHelper from '@/utils/network/axiosClientHelper';
import { Comment, CommentForm, commentSchema, CommentsResponse, commentsResponseSchema, GetCommentsParams, PutCommentForm } from './types';
import { safeResponse } from '@/utils/network/safeResponse';

const RESPONSE_INVALID_MESSAGE = '서버에서 받은 데이터가 예상과 다릅니다';

/**
* comment 생성
* https://sp-taskify-api.vercel.app/docs/#/Comments/Create
*/
export const postComment = async (commentForm: CommentForm) => {
const response = await axiosClientHelper.post<Comment>('/comments', commentForm);
const result = commentSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, commentSchema);
};

/**
* comments 목록 조회
* https://sp-taskify-api.vercel.app/docs/#/Columns/Find
*/
export const getComments = async (params: GetCommentsParams) => {
const response = await axiosClientHelper.get<CommentsResponse>('/comments', { params });
const result = commentsResponseSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, commentsResponseSchema);
};

/**
* comment 수정
* https://sp-taskify-api.vercel.app/docs/#/Columns/Update
*/
export const putComment = async (commentId: number, putCommentForm: PutCommentForm) => {
const response = await axiosClientHelper.put<Comment>(`/comments/${commentId}`, putCommentForm);
const result = commentSchema.safeParse(response.data);
if (!result.success) throw new Error(RESPONSE_INVALID_MESSAGE);
return result.data;
return safeResponse(response.data, commentsResponseSchema);
};

/**
* comment 삭제
* https://sp-taskify-api.vercel.app/docs/#/Columns/Delete
*/
export const deleteComment = async (commentId: number) => {
await axiosClientHelper.delete<void>(`/comments/${commentId}`);
};
File renamed without changes.
48 changes: 20 additions & 28 deletions src/apis/dashboards/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ import {
} from './types';
import { safeResponse } from '@/utils/network/safeResponse';

/**
* dashboard 생성
* https://sp-taskify-api.vercel.app/docs/#/Dashboards/Create
*/
export const createDashboard = async (params: CreateDashboardRequest) => {
const response = await axiosClientHelper.post<Dashboard>('/dashboards', params);
return safeResponse(response.data, dashboardSchema);
};

/**
* dashboards 목록 조회
* https://sp-taskify-api.vercel.app/docs/#/Dashboards/Find
Expand All @@ -31,7 +40,6 @@ export const getDashboards = async (params: GetDashboardsRequest) => {
navigationMethod,
},
});

return safeResponse(response.data, dashboardsSchema);
};

Expand All @@ -41,18 +49,6 @@ export const getDashboards = async (params: GetDashboardsRequest) => {
*/
export const getDashboardDetails = async (id: Dashboard['id']) => {
const response = await axiosClientHelper.get<Dashboard>(`/dashboards/${id}`);

return safeResponse(response.data, dashboardSchema);
};

/**
* dashboard 생성
* https://sp-taskify-api.vercel.app/docs/#/Dashboards/Create
*/

export const createDashboard = async (params: CreateDashboardRequest) => {
const response = await axiosClientHelper.post<Dashboard>('/dashboards', params);

return safeResponse(response.data, dashboardSchema);
};

Expand All @@ -63,7 +59,6 @@ export const createDashboard = async (params: CreateDashboardRequest) => {
export const updateDashboard = async (params: UpdateDashboardRequest) => {
const { id, ...reset } = params;
const response = await axiosClientHelper.put<Dashboard>(`/dashboards/${id}`, reset);

return safeResponse(response.data, dashboardSchema);
};

Expand All @@ -76,6 +71,16 @@ export const deleteDashboard = async (id: Dashboard['id']) => {
return response.data;
};

/**
* dashboard 초대
* https://sp-taskify-api.vercel.app/docs/#/Dashboards/CreateInvitation
*/
export const inviteDashboard = async (params: InviteDashboardRequest) => {
const { id, email } = params;
const response = await axiosClientHelper.post<DashboardInvitation>(`/dashboards/${id}/invitations`, { email });
return safeResponse(response.data, dashboardInvitationSchema);
};

/**
* dashboard 초대 불러오기
* https://sp-taskify-api.vercel.app/docs/#/Dashboards/GetInvitations
Expand All @@ -88,27 +93,14 @@ export const getDashboardInvitations = async (params: GetDashboardInvitationsReq
size,
},
});

return safeResponse(response.data, dashboardInvitationsSchema);
};

/**
* dashboard 초대
* https://sp-taskify-api.vercel.app/docs/#/Dashboards/CreateInvitation
*/
export const inviteDashboard = async (params: InviteDashboardRequest) => {
const { id, email } = params;
const response = await axiosClientHelper.post<DashboardInvitation>(`/dashboards/${id}/invitations`, { email });

return safeResponse(response.data, dashboardInvitationSchema);
};

/**
* dashboard 초대 취소
* https://sp-taskify-api.vercel.app/docs/#/Dashboards/DeleteInvitation
*/
export const cancelDashboardInvitation = async (params: CancelInviteDashboardRequest) => {
const { dashboardId, invitationId } = params;
const response = await axiosClientHelper.delete<void>(`/dashboards/${dashboardId}/invitations/${invitationId}`);
return response.data;
await axiosClientHelper.delete<void>(`/dashboards/${dashboardId}/invitations/${invitationId}`);
};
File renamed without changes.
2 changes: 0 additions & 2 deletions src/apis/invitations/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ export const getMyInvitations = async (params: GetMyInvitationsRequest) => {
...(cursorId && { cursorId }), //cursorId가 있을경우에만(빈값 보내면 오류)
},
});

return safeResponse(response.data, myInvitationsSchema);
};

Expand All @@ -27,6 +26,5 @@ export const getMyInvitations = async (params: GetMyInvitationsRequest) => {
export const respondToInvitation = async (params: RespondToInvitationRequest) => {
const { invitationId, inviteAccepted } = params;
const response = await axiosClientHelper.put<DashboardInvitation>(`/invitations/${invitationId}`, { inviteAccepted });

return safeResponse(response.data, dashboardInvitationSchema);
};
File renamed without changes.
Loading