Spaces:
Running
Running
| import { NextRequest, NextResponse } from "next/server"; | |
| import { RepoDesignation, createRepo, listCommits, spaceInfo, uploadFiles } from "@huggingface/hub"; | |
| import { isAuthenticated } from "@/lib/auth"; | |
| import { Commit, Page } from "@/types"; | |
| import { COLORS } from "@/lib/utils"; | |
| export async function POST( | |
| req: NextRequest, | |
| ) { | |
| const user = await isAuthenticated(); | |
| if (user instanceof NextResponse || !user) { | |
| return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); | |
| } | |
| const { title: titleFromRequest, pages, prompt } = await req.json(); | |
| const title = titleFromRequest ?? "DeepSite Project"; | |
| const formattedTitle = title | |
| .toLowerCase() | |
| .replace(/[^a-z0-9]+/g, "-") | |
| .split("-") | |
| .filter(Boolean) | |
| .join("-") | |
| .slice(0, 96); | |
| const repo: RepoDesignation = { | |
| type: "space", | |
| name: `${user.name}/${formattedTitle}`, | |
| }; | |
| const colorFrom = COLORS[Math.floor(Math.random() * COLORS.length)]; | |
| const colorTo = COLORS[Math.floor(Math.random() * COLORS.length)]; | |
| const README = `--- | |
| title: ${title} | |
| colorFrom: ${colorFrom} | |
| colorTo: ${colorTo} | |
| emoji: 🐳 | |
| sdk: static | |
| pinned: false | |
| tags: | |
| - deepsite-v3 | |
| --- | |
| # Welcome to your new DeepSite project! | |
| This project was created with [DeepSite](https://deepsite.hf.co). | |
| `; | |
| const files: File[] = []; | |
| const readmeFile = new File([README], "README.md", { type: "text/markdown" }); | |
| files.push(readmeFile); | |
| pages.forEach((page: Page) => { | |
| const file = new File([page.html], page.path, { type: "text/html" }); | |
| files.push(file); | |
| }); | |
| try { | |
| const { repoUrl} = await createRepo({ | |
| repo, | |
| accessToken: user.token as string, | |
| }); | |
| const commitTitle = !prompt || prompt.trim() === "" ? "Redesign my website" : prompt; | |
| await uploadFiles({ | |
| repo, | |
| files, | |
| accessToken: user.token as string, | |
| commitTitle | |
| }); | |
| const path = repoUrl.split("/").slice(-2).join("/"); | |
| const commits: Commit[] = []; | |
| for await (const commit of listCommits({ repo, accessToken: user.token as string })) { | |
| if (commit.title.includes("initial commit") || commit.title.includes("image(s)") || commit.title.includes("Promote version")) { | |
| continue; | |
| } | |
| commits.push({ | |
| title: commit.title, | |
| oid: commit.oid, | |
| date: commit.date, | |
| }); | |
| } | |
| const space = await spaceInfo({ | |
| name: repo.name, | |
| accessToken: user.token as string, | |
| }); | |
| let newProject = { | |
| files, | |
| pages, | |
| commits, | |
| project: { | |
| id: space.id, | |
| space_id: space.name, | |
| _updatedAt: space.updatedAt, | |
| } | |
| } | |
| return NextResponse.json({ space: newProject, path, ok: true }, { status: 201 }); | |
| } catch (err: any) { | |
| return NextResponse.json( | |
| { error: err.message, ok: false }, | |
| { status: 500 } | |
| ); | |
| } | |
| } |