Entry endpoints

This commit is contained in:
2024-10-11 01:30:52 -03:00
parent 9a245129e7
commit ce6cf91c77
7 changed files with 190 additions and 9 deletions

View File

@@ -1,5 +1,11 @@
import { postRouter } from "@/server/api/routers/post";
import { createCallerFactory, createTRPCRouter } from "@/server/api/trpc";
import * as cloudinary from "cloudinary";
import { entryRouter } from "./routers/entry";
cloudinary.v2.config({
secure: true,
});
/**
* This is the primary router for your server.
@@ -8,6 +14,7 @@ import { createCallerFactory, createTRPCRouter } from "@/server/api/trpc";
*/
export const appRouter = createTRPCRouter({
post: postRouter,
entry: entryRouter,
});
// export type definition of API

View File

@@ -0,0 +1,106 @@
import { z } from "zod";
import { createTRPCRouter, publicProcedure } from "@/server/api/trpc";
import {
generateEntryUniqueKey,
makeImageSpooky,
uploadImage,
} from "@/server/utils";
export type Entry = {
type: "artist" | "album";
name: string;
image: string;
};
export const entryRouter = createTRPCRouter({
get: publicProcedure
.input(
z.object({
type: z.enum(["artist", "album"]),
name: z.string().min(1),
image: z.string().min(1),
}),
)
.query(async ({ ctx, input }) => {
const key = generateEntryUniqueKey(input);
const existingEntry = await ctx.db.spookyImage.findFirst({
where: {
key,
},
});
return existingEntry;
}),
generate: publicProcedure
.input(
z.object({
entry: z.object({
type: z.enum(["artist", "album"]),
name: z.string().min(1),
image: z.string().min(1),
}),
}),
)
.mutation(async ({ ctx, input }) => {
const key = generateEntryUniqueKey(input.entry);
try {
const uploadedImage = await uploadImage(input.entry.image);
if (!uploadedImage || typeof uploadedImage !== "string") {
throw new Error("Failed to upload image");
}
const spookyImage = makeImageSpooky(uploadedImage);
if (!spookyImage || typeof spookyImage !== "string") {
throw new Error("Failed to make image spooky");
}
await ctx.db.generatedImage.upsert({
where: {
key,
},
update: {},
create: {
key,
value: spookyImage,
},
});
return spookyImage;
} catch (error) {
console.error(error);
return error;
}
}),
save: publicProcedure
.input(
z.object({
entry: z.object({
type: z.enum(["artist", "album"]),
name: z.string().min(1),
image: z.string().min(1),
}),
}),
)
.mutation(async ({ ctx, input }) => {
const key = generateEntryUniqueKey(input.entry);
try {
const generatedImage = await ctx.db.generatedImage.findFirst({
where: {
key,
},
});
if (!generatedImage) {
throw new Error("No generated image found");
}
const entry = await ctx.db.spookyImage.create({
data: {
key,
value: generatedImage.value,
},
});
return entry;
} catch (error) {
console.error(error);
return error;
}
}),
});

37
src/server/utils/index.ts Normal file
View File

@@ -0,0 +1,37 @@
import * as cloudinary from "cloudinary";
import { Entry } from "../api/routers/entry";
export const generateEntryUniqueKey = (entry: Entry): string => {
return `${entry.type}:${entry.name.trim().toLowerCase().replace(/\s/g, "-")}`;
};
export const uploadImage = async (
imagePath: string,
): Promise<string | unknown> => {
const options = {
use_filename: true,
unique_filename: false,
overwrite: true,
};
try {
const result = await cloudinary.v2.uploader.upload(imagePath, options);
console.log(result);
return result.public_id;
} catch (error) {
console.error(error);
return error;
}
};
export const makeImageSpooky = (publicId: string) => {
const options = { effect: "gen_background_replace" };
try {
const result = cloudinary.v2.image(publicId, { ...options });
console.log(result);
return result;
} catch (error) {
console.error(error);
}
};