mirror of
https://github.com/ArthurDanjou/artsite.git
synced 2026-01-23 09:51:50 +01:00
Implementing Drizzle to add views and like for post
This commit is contained in:
17
server/api/posts/[slug].post.ts
Normal file
17
server/api/posts/[slug].post.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { useValidatedParams, z } from 'h3-zod'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const { slug } = await useValidatedParams(event, {
|
||||
slug: z.string()
|
||||
})
|
||||
return useDB().insert(tables.posts).values({
|
||||
slug
|
||||
}).onConflictDoUpdate({
|
||||
target: tables.posts.slug,
|
||||
set: {
|
||||
slug,
|
||||
views: sql`${tables.posts.views}
|
||||
+ 1`
|
||||
}
|
||||
}).returning().get()
|
||||
})
|
||||
3
server/api/posts/index.get.ts
Normal file
3
server/api/posts/index.get.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export default defineEventHandler(() => {
|
||||
return useDB().query.posts.findMany()
|
||||
})
|
||||
13
server/api/posts/like/[slug].put.ts
Normal file
13
server/api/posts/like/[slug].put.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { useValidatedParams, z } from 'h3-zod'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const { slug } = await useValidatedParams(event, {
|
||||
slug: z.string()
|
||||
})
|
||||
return useDB().update(tables.posts)
|
||||
.set({
|
||||
likes: sql`${tables.posts.likes}
|
||||
+ 1`
|
||||
})
|
||||
.where(eq(tables.posts.slug, slug))
|
||||
})
|
||||
9
server/database/schema.ts
Normal file
9
server/database/schema.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'
|
||||
import { sql } from 'drizzle-orm'
|
||||
|
||||
export const posts = sqliteTable('posts', {
|
||||
slug: text('slug').primaryKey(),
|
||||
likes: integer('likes').default(0),
|
||||
views: integer('views').default(0),
|
||||
createdAt: text('created_at').default(sql`(CURRENT_DATE)`)
|
||||
})
|
||||
16
server/plugins/migrations.ts
Normal file
16
server/plugins/migrations.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { consola } from 'consola'
|
||||
import { migrate } from 'drizzle-orm/d1/migrator'
|
||||
|
||||
export default defineNitroPlugin(async () => {
|
||||
if (!import.meta.dev) return
|
||||
|
||||
onHubReady(async () => {
|
||||
await migrate(useDB(), { migrationsFolder: 'server/database/migrations' })
|
||||
.then(() => {
|
||||
consola.success('Database migrations done')
|
||||
})
|
||||
.catch((err) => {
|
||||
consola.error('Database migrations failed', err)
|
||||
})
|
||||
})
|
||||
})
|
||||
10
server/utils/db.ts
Normal file
10
server/utils/db.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { drizzle } from 'drizzle-orm/d1'
|
||||
import * as schema from '../database/schema'
|
||||
|
||||
export { sql, eq, and, or, asc, desc, sum } from 'drizzle-orm'
|
||||
|
||||
export const tables = schema
|
||||
|
||||
export function useDB() {
|
||||
return drizzle(hubDatabase(), { schema })
|
||||
}
|
||||
Reference in New Issue
Block a user