Skip to content
Snippets Groups Projects
route.ts 8.58 KiB
Newer Older
import { NextResponse } from "next/server"
import { z } from "zod"
import { db } from "@/lib/db"
import { utapi } from "uploadthing/server"
DESKTOP-9FO96TP\hehexd's avatar
DESKTOP-9FO96TP\hehexd committed
/**
 * @swagger
 * /api/gweets:
 *   get:
 *     description: Gives back a List of Gweets
 *     content:
 *      application/json:
 *          schema:
 *     responses:
 *       200:
 *         description: fetched gweets!
 *       500:
DESKTOP-9FO96TP\hehexd's avatar
DESKTOP-9FO96TP\hehexd committed
 *   post:
 *     description: Creates Gweet
 *     responses:
 *       200:
 *         description: Gweet created!
 *       401:
 *         description: Unauthorized
 *       500:
DESKTOP-9FO96TP\hehexd's avatar
DESKTOP-9FO96TP\hehexd committed
 *   delete:
 *     description: Deletes Gweet
 *     responses:
 *       200:
 *         description: deleted!
 *       401:
DESKTOP-9FO96TP\hehexd's avatar
DESKTOP-9FO96TP\hehexd committed
 *       500:
DESKTOP-9FO96TP\hehexd's avatar
DESKTOP-9FO96TP\hehexd committed
 */

export async function GET(request: Request) {
    const { searchParams } = new URL(request.url)

    const type = searchParams.get("type") || undefined
    const id = searchParams.get("id") || undefined

    const cursorQuery = searchParams.get("cursor") || undefined
    const take = Number(searchParams.get("limit")) || 20

    const skip = cursorQuery ? 1 : 0
    const cursor = cursorQuery ? { id: cursorQuery } : undefined

    try {
Yusuf Akgül's avatar
Yusuf Akgül committed
        // if (type === "threads") {
        //     const gweet = await db.gweet.findUnique({
        //         where: {
        //             id,
        //         },
        //     })

        //     let thread = []
        //     if (cursorQuery === undefined) {
        //         if (gweet && gweet.replyToGweetId) thread = await fetchThread(gweet.replyToGweetId)
        //     }

        //     // logic correct TODO get all gweets above comment
Yusuf Akgül's avatar
Yusuf Akgül committed
        //     const prevId = thread.length < 4 ? undefined : thread[thread.length - 1].id
        //     return NextResponse.json({ gweets: thread, prevId }, { status: 200 })
Yusuf Akgül's avatar
Yusuf Akgül committed
        // }

        const gweets = await db.gweet.findMany({
            skip,
            take,
            cursor,

            where: {
                ...(type === "comments" && {
                    replyToGweetId: id,
                }),

                ...(type === "search" && {
Yusuf Akgül's avatar
Yusuf Akgül committed
                    content: {
                        contains: id,
                        mode: "insensitive",
                    },
                }),

                ...(type === "user_gweets" && {
                    author: {
                        username: id,
                    },
                    author: {
                        username: id,
                    },
                ...(type === "user_media" && {
                    author: {
                        username: id,
                    },
                    media: {
                        some: {},
                    },
                }),

Yusuf Akgül's avatar
Yusuf Akgül committed
                author: {
                    select: {
                        id: true,
                        username: true,
                        name: true,
                        image: true,
                    },
                },
                likes: true,
                media: true,
                regweets: true,

                quote: {
                    include: {
                        author: true,
                        media: true,
                    },
                },

Yusuf Akgül's avatar
Yusuf Akgül committed
                comment: {
                    include: {
                        author: {
                            select: {
                                id: true,
                                username: true,
                            },
                        },
                    },
                },
        const nextId = gweets.length < take ? undefined : gweets[gweets.length - 1]?.id
        return NextResponse.json({ gweets, nextId }, { status: 200 })
        return NextResponse.json(error, { status: 500 })
}

export async function POST(request: Request) {
    const { gweet, fileprops } = await request.json()

    const gweetSchema = z
        .object({
            content: z.string().min(1).max(280),
            authorId: z.string().cuid(),
            replyToGweetId: z.string().cuid().optional(),
            quoteGweetId: z.string().cuid().optional(),
        })
        .strict()

    const zodGweet = gweetSchema.safeParse(gweet)

    const mediaSchema = z.array(
        z.object({
            gweetId: z.string().nullable().optional(),
            url: z.string(),
            key: z.string(),
            type: z.string(),
        }).strict()
    )

    if (!zodGweet.success) {
        return NextResponse.json({
            message: "Invalid request body",
            error: zodGweet.error.formErrors,
        }, { status: 400 })
    try {
        const created_gweet = await db.gweet.create({
            data: {
                ...gweet,
            },
        })

        if (fileprops.length > 0) {
            const mediaArray = fileprops.map((fileprop: { fileUrl: string; fileKey: string }) => {
                const media = {
                    gweetId: created_gweet.id,
                    url: fileprop.fileUrl,
                    key: fileprop.fileKey,
                    type: "IMAGE",
                }

                return media
            })

            const zodMedia = mediaSchema.safeParse(mediaArray)

            if (!zodMedia.success) {
                return NextResponse.json({
                    message: "Invalid media body",
                    error: zodMedia.error.formErrors,
                }, { status: 400 })
        return NextResponse.json(created_gweet, { status: 201 })
        return NextResponse.json({
            message: "Something went wrong",
            error: error.message,
        }, { status: error.errorCode || 500 })
}

export async function DELETE(request: Request) {
    const { searchParams } = new URL(request.url)
    const id = searchParams.get("id") as string

    const idSchema = z.string().cuid()
    const zod = idSchema.safeParse(id)

    if (!zod.success) {
        return NextResponse.json(
            {
                message: "Invalid request body",
                error: zod.error.formErrors,
            }, { status: 400 },
        )
    try {
        const checkMedia = await db.media.findMany({
            where: {
                gweetId: id,
            },
        })

        if (checkMedia.length > 0) {
            await utapi.deleteFiles(checkMedia.map((media) => media.key))
        }

        await db.gweet.delete({
            where: {
                id,
            },
        })

        return NextResponse.json({ message: "Gweet deleted" }, { status: 200 })
        return NextResponse.json({
            message: "Something went wrong",
            error: error.message,
        }, { status: error.errorCode || 500 })
Yusuf Akgül's avatar
Yusuf Akgül committed
}

// function to get gweet thread from comment
// async function fetchThread(gweetId: string): Promise<any[]> {
//     let thread = []
//     const gweet = await db.gweet.findUnique({
//         where: {
//             id: gweetId,
//         },
//         include: {
//             author: {
//                 select: {
//                     id: true,
//                     username: true,
//                     name: true,
//                     image: true,
//                 },
//             },
//             likes: true,
//             media: true,
//             regweets: true,

//             quote: {
//                 include: {
//                     author: true,
//                     media: true,
//                 },
//             },

//             allComments: true,
//             allQuotes: true,
//         },
//     })

//     thread.push(gweet)

//     if (gweet?.replyToGweetId) {
//         const replyToGweet = await fetchThread(gweet.replyToGweetId)
//         thread.unshift(...replyToGweet)
//     }

//     return thread
// }