| 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 } |
| ); |
| } |
| } |