CoastalCommitsPastes/client/lib/gist/transform.ts
2022-11-14 18:39:42 -08:00

68 lines
1.5 KiB
TypeScript

import { Gist } from "./types"
import * as crypto from "crypto"
import type { Post } from "@lib/server/prisma"
import { getHtmlFromFile } from "@lib/server/get-html-from-drift-file"
import { prisma } from "@lib/server/prisma"
export type AdditionalPostInformation = Pick<
Post,
"visibility" | "password" | "expiresAt"
> & {
userId: string
}
export async function createPostFromGist(
{ userId, visibility, password, expiresAt }: AdditionalPostInformation,
gist: Gist
): Promise<Post> {
const files = Object.values(gist.files)
const [title, description] = gist.description.split("\n", 1)
if (files.length === 0) {
throw new Error("The gist did not have any files")
}
const newPost = await prisma.post.create({
data: {
title,
description,
visibility,
password,
expiresAt,
createdAt: new Date(gist.created_at),
author: {
connect: {
id: userId
}
},
files: {
createMany: {
data: await Promise.all(
files.map(async (file) => {
const content = await file.content()
const html = await getHtmlFromFile({
content,
title: file.filename
})
return {
title: file.filename,
content: content,
sha: crypto
.createHash("sha256")
.update(content)
.digest("hex")
.toString(),
// TODO: shouldn't need this cast
html: html as string,
userId: userId
}
})
)
}
}
}
})
return newPost
}