| import { NextRequest, NextResponse } from "next/server"; |
| import { createRepo, RepoDesignation, uploadFiles } from "@huggingface/hub"; |
|
|
| import { isAuthenticated } from "@/lib/auth"; |
| import Project from "@/models/Project"; |
| import dbConnect from "@/lib/mongodb"; |
| import { COLORS, getPTag } from "@/lib/utils"; |
| |
| export async function GET() { |
| const user = await isAuthenticated(); |
|
|
| if (user instanceof NextResponse || !user) { |
| return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); |
| } |
|
|
| await dbConnect(); |
|
|
| const projects = await Project.find({ |
| user_id: user?.id, |
| }) |
| .sort({ _createdAt: -1 }) |
| .limit(100) |
| .lean(); |
| if (!projects) { |
| return NextResponse.json( |
| { |
| ok: false, |
| projects: [], |
| }, |
| { status: 404 } |
| ); |
| } |
| return NextResponse.json( |
| { |
| ok: true, |
| projects, |
| }, |
| { status: 200 } |
| ); |
| } |
|
|
| |
| |
| |
| |
| export async function POST(request: NextRequest) { |
| const user = await isAuthenticated(); |
|
|
| if (user instanceof NextResponse || !user) { |
| return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); |
| } |
|
|
| const { title, html, prompts } = await request.json(); |
|
|
| if (!title || !html) { |
| return NextResponse.json( |
| { message: "Title and HTML content are required.", ok: false }, |
| { status: 400 } |
| ); |
| } |
|
|
| await dbConnect(); |
|
|
| try { |
| let readme = ""; |
| let newHtml = html; |
|
|
| const newTitle = title |
| .toLowerCase() |
| .replace(/[^a-z0-9]+/g, "-") |
| .split("-") |
| .filter(Boolean) |
| .join("-") |
| .slice(0, 96); |
|
|
| const repo: RepoDesignation = { |
| type: "space", |
| name: `${user.name}/${newTitle}`, |
| }; |
|
|
| const { repoUrl } = await createRepo({ |
| repo, |
| accessToken: user.token as string, |
| }); |
| const colorFrom = COLORS[Math.floor(Math.random() * COLORS.length)]; |
| const colorTo = COLORS[Math.floor(Math.random() * COLORS.length)]; |
| readme = `--- |
| title: ${newTitle} |
| emoji: 🐳 |
| colorFrom: ${colorFrom} |
| colorTo: ${colorTo} |
| sdk: static |
| pinned: false |
| tags: |
| - deepsite |
| --- |
| |
| Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference`; |
|
|
| newHtml = html.replace(/<\/body>/, `${getPTag(repo.name)}</body>`); |
| const file = new File([newHtml], "index.html", { type: "text/html" }); |
| const readmeFile = new File([readme], "README.md", { |
| type: "text/markdown", |
| }); |
| const files = [file, readmeFile]; |
| await uploadFiles({ |
| repo, |
| files, |
| accessToken: user.token as string, |
| commitTitle: `${prompts[prompts.length - 1]} - Initial Deployment`, |
| }); |
| const path = repoUrl.split("/").slice(-2).join("/"); |
| const project = await Project.create({ |
| user_id: user.id, |
| space_id: path, |
| prompts, |
| }); |
| return NextResponse.json({ project, path, ok: true }, { status: 201 }); |
| |
| } catch (err: any) { |
| return NextResponse.json( |
| { error: err.message, ok: false }, |
| { status: 500 } |
| ); |
| } |
| } |
|
|