Import drizzle replacing prisma

Signed-off-by: Arthur DANJOU <arthurdanjou@outlook.fr>
This commit is contained in:
2024-04-20 00:03:10 +02:00
parent a7f0a635ec
commit c6ba8c791b
108 changed files with 2367 additions and 1554 deletions

View File

@@ -0,0 +1,4 @@
export default defineEventHandler(async (event) => {
const config = useRuntimeConfig(event)
return await $fetch(`https://api.lanyard.rest/v1/users/${config.discordUserId}`)
})

View File

@@ -0,0 +1,5 @@
export default defineEventHandler(async () => {
return useDB().query.announcements.findFirst({
orderBy: (announcement, {asc}) => [asc(announcement.createdAt)]
})
})

View File

@@ -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 useDB().insert(tables.posts).values({
slug
}).onConflictDoUpdate({
target: tables.posts.id,
set: {
views: sql`${tables.posts.views}
+ 1`
}
})
})

View File

@@ -0,0 +1,20 @@
export default defineEventHandler(async (event) => {
const { favorite, category } = getQuery(event)
const bookmarks = await useDB().query.bookmarks
.findMany({
orderBy: [asc(tables.talents.id)],
with: {
bookmarkCategories: {
with: {
category: true
}
}
}
})
return bookmarks.filter(bookmark =>
(category === 'all' || bookmark.bookmarkCategories.some(cat => cat.category.slug === category))
&& (favorite === 'false' || bookmark.favorite)
)
})

View File

@@ -0,0 +1,4 @@
export default defineEventHandler(async (event) => {
const { type } = getQuery<{ type: 'talent' | 'bookmark' }>(event)
return useDB().select().from(tables.categories).where(eq(tables.categories.type, type))
})

13
server/api/like.put.ts Normal file
View File

@@ -0,0 +1,13 @@
import { z } from 'zod'
const PostSchema = z.object({ slug: z.string() }).parse
export default defineEventHandler(async (event) => {
const { slug } = await readValidatedBody(event, PostSchema)
return useDB().update(tables.posts)
.set({
likes: sql`${tables.posts.likes}
+ 1`
})
.where(eq(tables.posts.slug, slug))
})

View File

@@ -0,0 +1,22 @@
export default defineEventHandler(async () => {
const maintenance = await useDB().query.maintenances.findFirst({
orderBy: [asc(tables.maintenances.createdAt)]
})
let enabled = true
// eslint-disable-next-line node/prefer-global/process
if (process.env.NODE_ENV === 'development') {
enabled = false
}
else {
const today = new Date()
enabled = !!maintenance
&& maintenance.enabled
&& new Date(maintenance.beginAt).getTime() < today.getTime()
&& new Date(maintenance.endAt).getTime() > today.getTime()
}
return {
enabled,
maintenance
}
})

View File

@@ -0,0 +1,13 @@
import { z } from 'zod'
const MessageValidator = z.object({
id: z.number()
}).parse
export default defineEventHandler(async (event) => {
const { id } = await readValidatedBody(event, MessageValidator)
const { user } = await requireUserSession(event)
if (!user.admin)
throw createError({ statusCode: 400, message: 'You need the permission to delete a message!' })
return useDB().delete(tables.guestbookMessages).where(eq(tables.guestbookMessages.id, id))
})

View File

@@ -0,0 +1,30 @@
import { z } from 'zod'
const MessageValidator = z.object({
message: z.string()
}).parse
export default defineEventHandler(async (event) => {
const { message } = await readValidatedBody(event, MessageValidator)
const { user } = await requireUserSession(event)
const config = useRuntimeConfig(event)
await sendDiscordWebhookMessage(config, {
title: 'New guestbook message ✨',
description: `**${user.username}** has signed the book : "*${message}*"`,
color: 15893567
})
return useDB().insert(tables.guestbookMessages)
.values({
message,
email: user.email,
username: user.username,
image: user.picture
})
.onConflictDoUpdate({
target: tables.guestbookMessages.email,
set: {
message
}
})
})

View File

@@ -0,0 +1,3 @@
export default defineEventHandler(async () => {
return useDB().select().from(tables.guestbookMessages).orderBy(asc(tables.guestbookMessages.createdAt))
})

15
server/api/stats.get.ts Normal file
View File

@@ -0,0 +1,15 @@
export default defineCachedEventHandler(async (event) => {
const config = useRuntimeConfig(event)
const coding = await $fetch(`https://wakatime.com/share/${config.wakatimeUserId}/${config.wakatimeCodig}.json`)
const editors = await $fetch(`https://wakatime.com/share/${config.wakatimeUserId}/${config.wakatimeEditors}.json`)
const os = await $fetch(`https://wakatime.com/share/${config.wakatimeUserId}/${config.wakatimeOs}.json`)
const languages = await $fetch(`https://wakatime.com/share/${config.wakatimeUserId}/${config.wakatimeLanguages}.json`)
return {
coding,
editors,
os,
languages
}
}, {
maxAge: 60 * 60 * 3 // 3 hours,
})

View File

@@ -0,0 +1,34 @@
import { z } from 'zod'
const SuggestionValidator = z.object({
content: z.string()
}).parse
export default defineEventHandler(async (event) => {
const { content } = await readValidatedBody(event, SuggestionValidator)
const { user } = await requireUserSession(event)
const config = useRuntimeConfig(event)
await sendDiscordWebhookMessage(config, {
title: 'New suggestion ✨',
description: `**${user.username}** has requested **${content}** for the talents page.`,
color: 15237114
})
return useDB().insert(tables.suggestions)
.values({
email: user.email,
content
})
.onConflictDoUpdate({
target: tables.suggestions.email,
set: {
content
},
setWhere: sql`${tables.suggestions.email}
=
${user.email}`
}).returning({
content: tables.suggestions.content
})
})

20
server/api/talents.get.ts Normal file
View File

@@ -0,0 +1,20 @@
export default defineEventHandler(async (event) => {
const { favorite, category } = getQuery(event)
const talents = await useDB().query.talents
.findMany({
orderBy: [asc(tables.talents.id)],
with: {
talentCategories: {
with: {
category: true
}
}
}
})
return talents.filter(talent =>
(category === 'all' || talent.talentCategories.some(cat => cat.category.slug === category))
&& (favorite === 'false' || talent.favorite)
)
})

13
server/api/view.put.ts Normal file
View File

@@ -0,0 +1,13 @@
import { z } from 'zod'
const PostSchema = z.object({ slug: z.string() }).parse
export default defineEventHandler(async (event) => {
const { slug } = await readValidatedBody(event, PostSchema)
return useDB().update(tables.posts)
.set({
views: sql`${tables.posts.views}
+ 1`
})
.where(eq(tables.posts.slug, slug))
})