diff --git a/src/auth.d.ts b/src/auth.d.ts new file mode 100644 index 0000000..de80c14 --- /dev/null +++ b/src/auth.d.ts @@ -0,0 +1,7 @@ +declare module '#auth-utils' { + interface UserSession { + user: { + username: string + } + } +} diff --git a/src/pages/guestbook.vue b/src/pages/guestbook.vue new file mode 100644 index 0000000..2975b57 --- /dev/null +++ b/src/pages/guestbook.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/server/api/announcement.get.ts b/src/server/api/announcement.get.ts new file mode 100644 index 0000000..5877d67 --- /dev/null +++ b/src/server/api/announcement.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(() => { + return usePrisma().announcement.findFirst({ + orderBy: { + createdAt: 'desc', + }, + }) +}) diff --git a/src/server/api/article.post.ts b/src/server/api/article.post.ts new file mode 100644 index 0000000..ab3d25d --- /dev/null +++ b/src/server/api/article.post.ts @@ -0,0 +1,16 @@ +import { z } from 'zod' + +const PostSchema = z.object({ slug: z.string() }).parse + +export default defineEventHandler(async (event) => { + const { slug } = await readValidatedBody(event, PostSchema) + return usePrisma().post.upsert({ + where: { + slug, + }, + update: {}, + create: { + slug, + }, + }) +}) diff --git a/src/server/api/categories.get.ts b/src/server/api/categories.get.ts new file mode 100644 index 0000000..e044b4c --- /dev/null +++ b/src/server/api/categories.get.ts @@ -0,0 +1,3 @@ +export default defineEventHandler(async () => { + return await usePrisma().category.findMany() +}) diff --git a/src/server/api/like.put.ts b/src/server/api/like.put.ts new file mode 100644 index 0000000..905d715 --- /dev/null +++ b/src/server/api/like.put.ts @@ -0,0 +1,17 @@ +import { z } from 'zod' + +const PostSchema = z.object({ slug: z.string() }).parse + +export default defineEventHandler(async (event) => { + const { slug } = await readValidatedBody(event, PostSchema) + return usePrisma().post.update({ + where: { + slug, + }, + data: { + likes: { + increment: 1, + }, + }, + }) +}) diff --git a/src/server/api/maintenance.get.ts b/src/server/api/maintenance.get.ts new file mode 100644 index 0000000..273a166 --- /dev/null +++ b/src/server/api/maintenance.get.ts @@ -0,0 +1,23 @@ +export default defineEventHandler(async () => { + const maintenance = await usePrisma().maintenance.findFirst({ + orderBy: { + createdAt: 'desc', + }, + }) + let enabled = true + if (process.env.NODE_ENV === 'development') { + enabled = false + } + else { + const today = new Date() + enabled = !!maintenance + && maintenance.enabled + && maintenance.beginAt.getTime() < today.getTime() + && maintenance.endAt.getTime() > today.getTime() + } + + return { + enabled, + maintenance, + } +}) diff --git a/src/server/api/suggestion.post.ts b/src/server/api/suggestion.post.ts new file mode 100644 index 0000000..6957b35 --- /dev/null +++ b/src/server/api/suggestion.post.ts @@ -0,0 +1,11 @@ +import { z } from 'zod' + +const SuggestionValidator = z.object({ + author: z.string().trim(), + content: z.string(), +}).parse + +export default defineEventHandler(async (event) => { + const { author, content } = await getValidatedQuery(event, SuggestionValidator) + const { user } = await requireUserSession(event) +}) diff --git a/src/server/api/talents.get.ts b/src/server/api/talents.get.ts new file mode 100644 index 0000000..b43eb36 --- /dev/null +++ b/src/server/api/talents.get.ts @@ -0,0 +1,47 @@ +export default defineEventHandler(async (event) => { + const { favorite, category } = getQuery(event) + const prisma = usePrisma() + + let whereClause: any + + if (favorite === 'true') { + category === 'all' + ? whereClause = { + favorite: true, + categories: { every: { category: {} } }, + } + : whereClause = { + favorite: true, + categories: { some: { category: { slug: category } } }, + } + } + else { + category === 'all' + ? whereClause = { + categories: { every: { category: {} } }, + } + : whereClause = { + categories: { some: { category: { slug: category } } }, + } + } + + return await prisma.talent.findMany({ + where: whereClause, + orderBy: { + createdAt: 'desc', + }, + include: { + categories: { + include: { + talent: true, + category: true, + }, + orderBy: { + category: { + name: 'asc', + }, + }, + }, + }, + }) +}) diff --git a/src/server/api/view.put.ts b/src/server/api/view.put.ts new file mode 100644 index 0000000..b2d4944 --- /dev/null +++ b/src/server/api/view.put.ts @@ -0,0 +1,17 @@ +import { z } from 'zod' + +const PostSchema = z.object({ slug: z.string() }).parse + +export default defineEventHandler(async (event) => { + const { slug } = await readValidatedBody(event, PostSchema) + return usePrisma().post.update({ + where: { + slug, + }, + data: { + views: { + increment: 1, + }, + }, + }) +}) diff --git a/src/server/utils/prisma.ts b/src/server/utils/prisma.ts new file mode 100644 index 0000000..40583ff --- /dev/null +++ b/src/server/utils/prisma.ts @@ -0,0 +1,13 @@ +import { PrismaClient } from '@prisma/client' + +let prisma: PrismaClient | undefined + +export function usePrisma() { + if (!prisma) { + prisma = new PrismaClient({ + log: ['warn', 'info', 'error'], + }) + } + + return prisma +}