[copy airbnb]12、预订屏幕Reservations screen(用服务器组件加载客人预订)Reservations screen

1、api

src/app/api 的作用是放置与前端组件通讯的接口文件,接口遵循 RESTful 接口模型,方法一般包含两个参数:request和 context,代码一般如下:

import getCurrentUser from "@/app/actions/getCurrentUser";
import { NextResponse } from "next/server";

interface IParams {
  reservationId?: string;
}

export async function DELETE(
  request: Request,
  { params }: { params: IParams }
) {
  const currentUser = await getCurrentUser();
  if (!currentUser) {
    return NextResponse.error();
  }

  const { reservationId } = params;
  if(!reservationId || typeof reservationId !=="string"){
        throw new Error("Invalid ID");
  }

  //预定者本人和房间拥有者可以删除
  const reservation = await prisma?.reservation.deleteMany({
    where:{
        id:reservationId,
        OR:[
            {userId:currentUser.id},
            {listing:{userId:currentUser.id}}
        ]
    }
  })

  return NextResponse.json(reservation);
}
  • DELETE 方法第一个参数是一个 request 对象,一般包含 url、query 参数、params 参数、method 等。
  • DELETE 方法第二个参数是一个 context对象,context 对象在不同的场景下可能包含不同的属性。以下是一些常见的属性和它们的用途:
    • **params**:
      • 包含路径参数。例如,在 /api/resource/[reservationId] 路由中,params 将包含 { reservationId: 'some_id' }
    • **req**:
      • 原始的 Node.js IncomingMessage 对象。包含了关于 HTTP 请求的详细信息。
    • **res**:
      • 原始的 Node.js ServerResponse 对象。用于发送 HTTP 响应。
    • **preview**:
      • 一个布尔值,表示当前请求是否在预览模式下。
    • **previewData**:
      • 预览模式下的数据。如果启用了预览模式,这个属性将包含预览数据。
    • **locale**:
      • 当前请求的语言环境(locale)。在国际化(i18n)配置启用时可用。
    • **defaultLocale**:
      • 默认的语言环境。在国际化(i18n)配置启用时可用。
    • **locales**:
      • 可用的语言环境列表。在国际化(i18n)配置启用时可用。
  • deleteMany对应的 sql 语句是:
    DELETE FROM reservations WHERE id = $1 AND (user_id = $2 OR listing_id IN (SELECT id FROM listings WHERE user_id = $2));
    代表的意思是:预定者本人和房间拥有者可以删除预定项目

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部