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
72 changes: 72 additions & 0 deletions src/apis/dashboards/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import axiosHelper from '@/utils/network/axiosHelper';
import {
BasePaginationParams,
Dashboard,
DashboardFormType,
DashboardInvitation,
DashboardInvitationResponse,
DashboardsResponse,
GetDashboardsParams,
InviteDashboardType,
updateDashboardType,
} from './types';

// dashboard 목록 조회
export const getDashboards = async ({ cursorId, page, size, navigationMethod }: GetDashboardsParams) => {
const response = await axiosHelper.get<DashboardsResponse>('/dashboards', {
params: {
cursorId,
page: page || 1,
size: size || 10,
navigationMethod,
},
});
return response.data;
};

// dashboard 생성
export const createDashboard = async (data: DashboardFormType) => {
const response = await axiosHelper.post<Dashboard>('/dashboards', data);
return response.data;
};

// dashboard 상세 조회
export const getDashboardDetails = async (id: number) => {
const response = await axiosHelper.get<Dashboard>(`/dashboards/${id}`);
return response.data;
};

// dashboard 수정
export const updateDashboard = async (id: number, data: updateDashboardType) => {
const response = await axiosHelper.put<Dashboard>(`/dashboards/${id}`, data);
return response.data;
};

// dashboard 삭제
export const deleteDashboard = async (id: number) => {
const response = await axiosHelper.delete<void>(`/dashboards/${id}`);
return response.data;
};

// dashboard 초대 불러오기
export const getDashboardInvitations = async (id: number, { page, size }: BasePaginationParams) => {
const response = await axiosHelper.get<DashboardInvitation>(`/dashboards/${id}/invitations`, {
params: {
page: page || 1,
size: size || 10,
},
});
return response.data;
};

// dashboard 초대
export const inviteDashboard = async (id: number, data: InviteDashboardType) => {
const response = await axiosHelper.post<DashboardInvitationResponse>(`/dashboards/${id}/invitations`, data);
return response.data;
};

// dashboard 초대 취소
export const cancelDashboardInvitation = async (id: number, invitationId: number) => {
const response = await axiosHelper.delete<void>(`/dashboards/${id}/invitations/${invitationId}`);
return response.data;
};
70 changes: 70 additions & 0 deletions src/apis/dashboards/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { z } from 'zod';
import { User } from '../users/types';

// base pagination params 타입 (필요시 공용으로 추출)
export type BasePaginationParams = {
page?: number;
size?: number;
};

// dashboard 항목 타입
export type Dashboard = {
id: number;
title: string;
color: string;
createdAt: string;
updatedAt: string;
createdByMe: boolean;
userId: number;
};

// dashboard 리스트 응답 타입
export type DashboardsResponse = {
cursorId: number;
totalCount: number;
dashboards: Dashboard[];
};

// dashboard get params 타입
export type NavigationMethod = 'infiniteScroll' | 'pagination';
export type GetDashboardsParams = BasePaginationParams & {
cursorId?: number;
navigationMethod: NavigationMethod;
};

// dashboard 작성 스키마
export const dashboardFormSchema = z.object({
title: z.string(),
color: z.string(),
});
export type DashboardFormType = z.infer<typeof dashboardFormSchema>;

// dashboard 수정 스키마
export const updateDashboardFormSchema = dashboardFormSchema.partial();
export type updateDashboardType = Partial<DashboardFormType>;

// invitation 타입
export type InvitationUser = Pick<User, 'id' | 'email' | 'nickname'>;
export type InvitationDashboard = Pick<Dashboard, 'id' | 'title'>;
export type DashboardInvitation = {
id: number;
inviter: InvitationUser;
invitee: InvitationUser;
teamId: string;
dashboard: InvitationDashboard;
inviteAccepted: boolean;
createdAt: string;
updatedAt: string;
};

// invitation 리스트 응답 타입
export type DashboardInvitationResponse = {
totalCount: number;
invitations: DashboardInvitation[];
};

// invitation 스키마
export const inviteDashboardFormSchema = z.object({
email: z.string(),
});
export type InviteDashboardType = z.infer<typeof inviteDashboardFormSchema>;