-
Notifications
You must be signed in to change notification settings - Fork 273
/
route.ts
79 lines (67 loc) · 2.21 KB
/
route.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import { respData, respErr } from "@/lib/resp";
import { Cover } from "@/types/cover";
import { ImageGenerateParams } from "openai/resources/images.mjs";
import { currentUser } from "@clerk/nextjs";
import { downloadAndUploadImage } from "@/lib/s3";
import { genUuid } from "@/lib";
import { getOpenAIClient } from "@/services/openai";
import { getUserCredits } from "@/services/order";
import { insertCover } from "@/models/cover";
export async function POST(req: Request) {
const user = await currentUser();
if (!user || !user.emailAddresses || user.emailAddresses.length === 0) {
return respErr("no auth");
}
try {
const { description } = await req.json();
if (!description) {
return respErr("invalid params");
}
const user_email = user.emailAddresses[0].emailAddress;
const user_credits = await getUserCredits(user_email);
if (!user_credits || user_credits.left_credits < 1) {
return respErr("credits not enough");
}
const client = getOpenAIClient();
const llm_name = "dall-e-3";
const img_size = "1024x1792";
const llm_params: ImageGenerateParams = {
prompt: `Generate a brand story image about ${description}`,
model: llm_name,
n: 1,
quality: "hd",
response_format: "url",
size: img_size,
style: "vivid",
};
const created_at = new Date().toISOString();
const res = await client.images.generate(llm_params);
const raw_img_url = res.data[0].url;
if (!raw_img_url) {
return respErr("generate cover failed");
}
const img_name = encodeURIComponent(description);
const s3_img = await downloadAndUploadImage(
raw_img_url,
process.env.AWS_BUCKET || "trysai",
`covers/${img_name}.png`
);
const img_url = s3_img.Location;
const cover: Cover = {
user_email: user_email,
img_description: description,
img_size: img_size,
img_url: img_url,
llm_name: llm_name,
llm_params: JSON.stringify(llm_params),
created_at: created_at,
uuid: genUuid(),
status: 1,
};
await insertCover(cover);
return respData(cover);
} catch (e) {
console.log("gen cover failed: ", e);
return respErr("gen cover failed");
}
}