[Next.js][ํ”„๋กœ์ ํŠธ] ๐Ÿ’šColor Inside (2) - Diary API Route Handler ์ž‘์„ฑ

์šฐ์—ฅยท2024๋…„ 7์›” 24์ผ

Diary ๋“ฑ๋ก API

  • path: /api/diaries
  • HTTP method: POST
export const POST = async (request: NextRequest): Promise<NextResponse> => {
  const supabase = createClient();

  const formData = await request.formData();

  const userId = formData.get('userId') as string;
  const color = formData.get('color') as string;
  const tags = formData.get('tags') as string;
  const content = formData.get('content') as string;
  const img = formData.get('img') as File | null;
  const date = formData.get('date') as string;

  if (!userId || !color || !tags || !content || !date) {
    return NextResponse.json({ error: 'All fields except img are required' }, { status: 400 });
  }

  try {
    const imgURL = img ? await uploadImage(img) : null;

    const parsedTags = JSON.parse(tags);

    const { error: diaryInsertError } = await supabase
      .from('diaries')
      .insert({ userId, color, tags: JSON.stringify(parsedTags), content, img: imgURL, date });

    if (diaryInsertError) {
      console.error('Database Error creating diary:', diaryInsertError);
      return NextResponse.json({ error: 'Database Error: Unable to create diary' }, { status: 500 });
    }

    return NextResponse.json({ message: 'Diary created successfully' }, { status: 201 });
  } catch (error) {
    console.error('Server Error processing POST request:', error);
    return NextResponse.json({ error: 'Server Error: Unable to process POST request' }, { status: 500 });
  }
};

ย 

Diary ์›”๋ณ„ ์กฐํšŒ API

  • path: /api/diaries
  • HTTP method: GET
export const GET = async (request: NextRequest): Promise<NextResponse> => {
  const supabase = createClient();

  const { data: authData, error: authError } = await supabase.auth.getUser();

  if (authError || !authData.user) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  const { searchParams } = new URL(request.url);

  const year = searchParams.get('year') as string;
  const month = searchParams.get('month') as string;

  if (!year || !month) {
    return NextResponse.json({ error: 'Year and month are required' }, { status: 400 });
  }

  try {
    const startDate = new Date(Number(year), Number(month) - 1, 1).toISOString();
    const endDate = new Date(Number(year), Number(month), 1).toISOString();

    const { data, error: diarySelectError } = await supabase
      .from('diaries')
      .select('*')
      .eq('userId', authData.user.id)
      .gte('date', startDate)
      .lt('date', endDate);

    if (diarySelectError) {
      console.error('Error fetching diaries:', diarySelectError);
      return NextResponse.json({ error: 'Database Error: Unable to fetch diaries' }, { status: 500 });
    }

    const diaries: Diary[] = data.map((diary) => ({
      diaryId: diary.diaryId,
      userId: diary.userId,
      color: diary.color,
      tags: JSON.parse(diary.tags),
      content: diary.content,
      img: diary.img,
      date: new Date(diary.date)
    }));

    return NextResponse.json(diaries, { status: 200 });
  } catch (error) {
    console.error('Server Error processing GET request:', error);
    return NextResponse.json({ error: 'Server Error: Unable to process GET request' }, { status: 500 });
  }
};

ย 

Diary ์ผ๋ณ„ ์กฐํšŒ API

  • path: /api/diaries/[id]
  • HTTP method: GET
export const GET = async (request: NextRequest, { params }: { params: { id: string } }): Promise<NextResponse> => {
  const supabase = createClient();

  const diaryId = params.id;

  if (!diaryId) {
    return NextResponse.json({ error: 'Diary ID is required' }, { status: 400 });
  }

  try {
    const { data, error: diarySelectError } = await supabase
      .from('diaries')
      .select('*')
      .eq('diaryId', diaryId)
      .single();

    if (diarySelectError) {
      console.error('Error fetching diary:', diarySelectError);
      return NextResponse.json({ error: 'Database Error: Unable to fetch diary' }, { status: 500 });
    }

    if (!data) {
      return NextResponse.json({ error: 'Diary not found' }, { status: 404 });
    }

    const diary: Diary = {
      diaryId: data.diaryId,
      userId: data.userId,
      color: data.color,
      tags: JSON.parse(data.tags),
      content: data.content,
      img: data.img,
      date: new Date(data.date)
    };

    return NextResponse.json(diary, { status: 200 });
  } catch (error) {
    console.error('Server Error processing GET request:', error);
    return NextResponse.json({ error: 'Server Error: Unable to process GET request' }, { status: 500 });
  }
};

ย 

Diary ์ˆ˜์ • API

  • path: /api/diaries/[id]
  • HTTP method: PATCH
export const PATCH = async (request: NextRequest, { params }: { params: { id: string } }): Promise<NextResponse> => {
  const supabase = createClient();

  const diaryId = params.id;

  if (!diaryId) {
    return NextResponse.json({ error: 'Diary ID is required' }, { status: 400 });
  }

  const formData = await request.formData();

  const color = formData.get('color') as string;
  const tags = formData.get('tags') as string;
  const content = formData.get('content') as string;
  const img = formData.get('img') as File | null;

  if (!color || !tags || !content) {
    return NextResponse.json({ error: 'All fields except img are required' }, { status: 400 });
  }

  try {
    const diaryImg = await fetchDiaryImage(diaryId);

    if (diaryImg) {
      await deleteImage(diaryImg);
    }

    const imgURL = img ? await uploadImage(img) : null;

    const parsedTags = JSON.parse(tags);

    const { error: diaryUpdateError } = await supabase
      .from('diaries')
      .update({ color, tags: parsedTags, content, img: imgURL })
      .eq('diaryId', diaryId);

    if (diaryUpdateError) {
      console.error('Error updating diary:', diaryUpdateError);
      return NextResponse.json({ error: 'Database Error: Unable to update diary' }, { status: 500 });
    }

    return NextResponse.json({ message: 'Diary updated successfully' }, { status: 200 });
  } catch (error) {
    console.error('Server Error processing PATCH request:', error);
    return NextResponse.json({ error: 'Server Error: Unable to process PATCH request' }, { status: 500 });
  }
};

ย 

Diary ์‚ญ์ œ API

  • path: /api/diaries/[id]
  • HTTP method: DELETE
export const DELETE = async (request: NextRequest, { params }: { params: { id: string } }): Promise<NextResponse> => {
  const supabase = createClient();

  const diaryId = params.id;

  if (!diaryId) {
    return NextResponse.json({ error: 'Diary ID is required' }, { status: 400 });
  }

  try {
    const diaryImg = await fetchDiaryImage(diaryId);

    if (diaryImg) {
      await deleteImage(diaryImg);
    }

    const { error: diaryDeleteError } = await supabase.from('diaries').delete().eq('diaryId', diaryId);

    if (diaryDeleteError) {
      console.error('Error deleting diary:', diaryDeleteError);
      return NextResponse.json({ error: 'Database Error: Unable to delete diary' }, { status: 500 });
    }

    return NextResponse.json({ message: 'Diary deleted successfully' }, { status: 200 });
  } catch (error) {
    console.error('Server Error processing DELETE request:', error);
    return NextResponse.json({ error: 'Server Error: Unable to process DELETE request' }, { status: 500 });
  }
};
profile
๐ŸŒธ๐Ÿ˜Š๐ŸŒธ

0๊ฐœ์˜ ๋Œ“๊ธ€