mirror of
https://github.com/BradNut/svelteKitForBeginners
synced 2025-09-08 17:40:24 +00:00
Clean up endpoints to use externalized methods in prisma ts. Fix delete by adding method to svelte config.
This commit is contained in:
parent
3f83a29883
commit
b6bf451b37
7 changed files with 227 additions and 168 deletions
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"cSpell.words": [
|
||||
"sveltejs"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,35 +1,13 @@
|
|||
import type { RequestHandler } from "@sveltejs/kit";
|
||||
import prisma from "$root/lib/prisma";
|
||||
import { timePosted } from "$root/lib/date";
|
||||
import type { RequestHandler } from '@sveltejs/kit'
|
||||
|
||||
import {
|
||||
createTweet,
|
||||
getTweets,
|
||||
removeTweet
|
||||
} from '$root/utils/prisma'
|
||||
|
||||
export const get: RequestHandler = async () => {
|
||||
const data = await prisma.tweet.findMany({
|
||||
include: { user: true },
|
||||
orderBy: { posted: 'desc' }
|
||||
})
|
||||
|
||||
const liked = await prisma.liked.findMany({
|
||||
where: { userId: 1 },
|
||||
select: { tweetId: true }
|
||||
})
|
||||
|
||||
const likedTweets = Object.keys(liked).map(
|
||||
key => liked[key].tweetId
|
||||
)
|
||||
|
||||
const tweets = data.map(tweet => {
|
||||
return {
|
||||
id: tweet.id,
|
||||
content: tweet.content,
|
||||
likes: tweet.likes,
|
||||
posted: timePosted(tweet.posted),
|
||||
url: tweet.url,
|
||||
avatar: tweet.user.avatar,
|
||||
handle: tweet.user.handle,
|
||||
name: tweet.user.name,
|
||||
liked: likedTweets.includes(tweet.id)
|
||||
}
|
||||
})
|
||||
const tweets = await getTweets()
|
||||
|
||||
if (!tweets) {
|
||||
return { status: 400 }
|
||||
|
|
@ -43,26 +21,16 @@ export const get: RequestHandler = async () => {
|
|||
}
|
||||
|
||||
export const post: RequestHandler = async ({ request }) => {
|
||||
const form = await request.formData()
|
||||
const tweet = String(form.get('tweet'))
|
||||
|
||||
if (tweet.length > 140) {
|
||||
return {
|
||||
status: 400,
|
||||
body: 'Maximum Tweet length exceeded.',
|
||||
headers: { location: '/home' }
|
||||
}
|
||||
}
|
||||
|
||||
await prisma.tweet.create({
|
||||
data: {
|
||||
posted: new Date(),
|
||||
url: Math.random().toString(16).slice(2),
|
||||
content: tweet,
|
||||
likes: 0,
|
||||
user: { connect: { id: 1 } }
|
||||
}
|
||||
})
|
||||
await createTweet(request)
|
||||
|
||||
return {}
|
||||
}
|
||||
|
||||
export const del: RequestHandler = async ({ request }) => {
|
||||
await removeTweet(request)
|
||||
|
||||
return {
|
||||
status: 303,
|
||||
headers: { location: '/home' }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,52 +1,14 @@
|
|||
import prisma from "$root/lib/prisma";
|
||||
import type { RequestHandler } from "@sveltejs/kit";
|
||||
import type { RequestHandler } from '@sveltejs/kit'
|
||||
|
||||
import { likeTweet } from '$root/utils/prisma'
|
||||
|
||||
export const post: RequestHandler = async ({ request }) => {
|
||||
const form = await request.formData()
|
||||
const id = +form.get('id')
|
||||
|
||||
const liked = await prisma.liked.count({
|
||||
where: { tweetId: id }
|
||||
})
|
||||
|
||||
if (liked === 1) {
|
||||
await prisma.liked.delete({ where: { tweetId: id } })
|
||||
|
||||
const count = await prisma.tweet.findUnique({
|
||||
where: { id },
|
||||
select: { likes: true }
|
||||
})
|
||||
|
||||
await prisma.tweet.update({
|
||||
where: { id },
|
||||
data: { likes: count.likes -= 1 }
|
||||
})
|
||||
|
||||
return {
|
||||
status: 303,
|
||||
headers: { location: '/home' }
|
||||
}
|
||||
}
|
||||
|
||||
await prisma.liked.create({
|
||||
data: {
|
||||
tweetId: id,
|
||||
user: { connect: { id: 1 } }
|
||||
}
|
||||
})
|
||||
|
||||
const count = await prisma.tweet.findUnique({
|
||||
where: { id },
|
||||
select: { likes: true }
|
||||
})
|
||||
|
||||
await prisma.tweet.update({
|
||||
where: { id },
|
||||
data: { likes: (count.likes += 1) }
|
||||
})
|
||||
await likeTweet(request)
|
||||
|
||||
return {
|
||||
status: 303,
|
||||
headers: { location: '/home' }
|
||||
headers: {
|
||||
location: '/home'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,48 +1,12 @@
|
|||
import type { RequestHandler } from "@sveltejs/kit";
|
||||
|
||||
import prisma from "$root/lib/prisma";
|
||||
import { timePosted } from "$root/lib/date";
|
||||
import type { RequestHandler } from '@sveltejs/kit'
|
||||
import { getUserProfile } from '$root/utils/prisma'
|
||||
|
||||
export const get: RequestHandler = async ({ params }) => {
|
||||
const profile = await prisma.user.findFirst({
|
||||
where: { name: params.user }
|
||||
})
|
||||
|
||||
const tweets = await prisma.tweet.findMany({
|
||||
where: { user: { id: 1 } },
|
||||
include: { user: true },
|
||||
orderBy: { posted: 'desc' }
|
||||
})
|
||||
|
||||
const liked = await prisma.liked.findMany({
|
||||
where: { userId: 1 },
|
||||
select: { tweetId: true }
|
||||
})
|
||||
|
||||
const likedTweets = Object.keys(liked).map(
|
||||
key => liked[key].tweetId
|
||||
)
|
||||
|
||||
if (!profile || !tweets || tweets.length === 0) {
|
||||
return { status: 404 }
|
||||
}
|
||||
|
||||
const userTweets = tweets.map(tweet => {
|
||||
return {
|
||||
id: tweet.id,
|
||||
content: tweet.content,
|
||||
likes: tweet.likes,
|
||||
posted: timePosted(tweet.posted),
|
||||
url: tweet.url,
|
||||
avatar: tweet.user.avatar,
|
||||
handle: tweet.user.handle,
|
||||
name: tweet.user.name,
|
||||
liked: likedTweets.includes(tweet.id)
|
||||
}
|
||||
})
|
||||
const { profile, tweets } = await getUserProfile(params)
|
||||
|
||||
return {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
status: 200,
|
||||
body: { profile, tweets: userTweets }
|
||||
body: { profile, tweets }
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +1,16 @@
|
|||
import { timePosted } from "$root/lib/date";
|
||||
import prisma from "$root/lib/prisma";
|
||||
import type { RequestHandler } from "@sveltejs/kit";
|
||||
import type { RequestHandler } from '@sveltejs/kit'
|
||||
|
||||
import { getTweet } from '$root/utils/prisma'
|
||||
|
||||
export const get: RequestHandler = async ({ params }) => {
|
||||
const tweet = await prisma.tweet.findFirst({
|
||||
where: { url: params.tweetId },
|
||||
include: { user: true }
|
||||
})
|
||||
const tweet = await getTweet(params)
|
||||
|
||||
const liked = await prisma.liked.findMany({
|
||||
where: { userId: 1 },
|
||||
select: { tweetId: true }
|
||||
})
|
||||
|
||||
const likedTweets = Object.keys(liked).map(
|
||||
key => liked[key].tweetId
|
||||
)
|
||||
|
||||
const userTweet = {
|
||||
id: tweet.id,
|
||||
content: tweet.content,
|
||||
likes: tweet.likes,
|
||||
posted: timePosted(tweet.posted),
|
||||
url: tweet.url,
|
||||
avatar: tweet.user.avatar,
|
||||
handle: tweet.user.handle,
|
||||
name: tweet.user.name,
|
||||
liked: likedTweets.includes(tweet.id)
|
||||
if (!tweet) {
|
||||
return { status: 400 }
|
||||
}
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
body: { tweet: userTweet }
|
||||
body: { tweet }
|
||||
}
|
||||
}
|
||||
179
src/utils/prisma.ts
Normal file
179
src/utils/prisma.ts
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
import prisma from '$root/lib/prisma'
|
||||
import { timePosted } from '$root/lib/date'
|
||||
|
||||
export async function getTweets() {
|
||||
const tweets = await prisma.tweet.findMany({
|
||||
include: { user: true },
|
||||
orderBy: { posted: 'desc' }
|
||||
})
|
||||
|
||||
const likedTweets = await getLikedTweets()
|
||||
|
||||
return tweets.map((tweet) => {
|
||||
return {
|
||||
id: tweet.id,
|
||||
content: tweet.content,
|
||||
likes: tweet.likes,
|
||||
posted: timePosted(tweet.posted),
|
||||
url: tweet.url,
|
||||
avatar: tweet.user.avatar,
|
||||
handle: tweet.user.handle,
|
||||
name: tweet.user.name,
|
||||
liked: likedTweets.includes(tweet.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export async function getTweet(
|
||||
params: Record<string, string>
|
||||
) {
|
||||
const tweet = await prisma.tweet.findFirst({
|
||||
where: { url: params.tweetId },
|
||||
include: { user: true }
|
||||
})
|
||||
|
||||
const likedTweets = await getLikedTweets()
|
||||
|
||||
return {
|
||||
id: tweet.id,
|
||||
content: tweet.content,
|
||||
likes: tweet.likes,
|
||||
posted: timePosted(tweet.posted),
|
||||
url: tweet.url,
|
||||
avatar: tweet.user.avatar,
|
||||
handle: tweet.user.handle,
|
||||
name: tweet.user.name,
|
||||
liked: likedTweets.includes(tweet.id)
|
||||
}
|
||||
}
|
||||
|
||||
export async function getLikedTweets() {
|
||||
const liked = await prisma.liked.findMany({
|
||||
where: { userId: 1 },
|
||||
select: { tweetId: true }
|
||||
})
|
||||
|
||||
const likedTweets = Object.keys(liked).map(
|
||||
(key) => liked[key].tweetId
|
||||
)
|
||||
|
||||
return likedTweets
|
||||
}
|
||||
|
||||
export async function createTweet(request: Request) {
|
||||
const form = await request.formData()
|
||||
const tweet = String(form.get('tweet'))
|
||||
|
||||
if (tweet.length > 140) {
|
||||
return {
|
||||
status: 400,
|
||||
body: 'Maximum Tweet length exceeded.',
|
||||
headers: { location: '/home' }
|
||||
}
|
||||
}
|
||||
|
||||
// you can get the user from the session
|
||||
await prisma.tweet.create({
|
||||
data: {
|
||||
posted: new Date(),
|
||||
url: Math.random().toString(16).slice(2),
|
||||
content: tweet,
|
||||
likes: 0,
|
||||
user: { connect: { id: 1 } }
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export async function removeTweet(request: Request) {
|
||||
const form = await request.formData()
|
||||
const tweetId = +form.get('id')
|
||||
await prisma.tweet.delete({ where: { id: tweetId } })
|
||||
}
|
||||
|
||||
export async function likeTweet(request: Request) {
|
||||
const form = await request.formData()
|
||||
const id = +form.get('id')
|
||||
|
||||
// verify if tweet is already liked
|
||||
const liked = await prisma.liked.count({
|
||||
where: { tweetId: id }
|
||||
})
|
||||
|
||||
if (liked === 1) {
|
||||
// if tweet is already liked unlike it
|
||||
await prisma.liked.delete({ where: { tweetId: id } })
|
||||
|
||||
// update the likes count
|
||||
const count = await prisma.tweet.findUnique({
|
||||
where: { id },
|
||||
select: { likes: true }
|
||||
})
|
||||
|
||||
await prisma.tweet.update({
|
||||
where: { id },
|
||||
data: { likes: (count.likes -= 1) }
|
||||
})
|
||||
|
||||
return {
|
||||
status: 303,
|
||||
headers: {
|
||||
location: '/home'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add liked record
|
||||
await prisma.liked.create({
|
||||
data: {
|
||||
tweetId: id,
|
||||
user: { connect: { id: 1 } }
|
||||
}
|
||||
})
|
||||
|
||||
// get the current like count and update it
|
||||
const count = await prisma.tweet.findUnique({
|
||||
where: { id },
|
||||
select: { likes: true }
|
||||
})
|
||||
|
||||
await prisma.tweet.update({
|
||||
where: { id },
|
||||
data: { likes: (count.likes += 1) }
|
||||
})
|
||||
}
|
||||
|
||||
export async function getUserProfile(
|
||||
params: Record<string, string>
|
||||
) {
|
||||
const profile = await prisma.user.findFirst({
|
||||
where: { name: params.user }
|
||||
})
|
||||
|
||||
const tweets = await prisma.tweet.findMany({
|
||||
where: { user: { id: 1 } },
|
||||
include: { user: true },
|
||||
orderBy: { posted: 'desc' }
|
||||
})
|
||||
|
||||
const likedTweets = await getLikedTweets()
|
||||
|
||||
if (!profile || !tweets || tweets.length === 0) {
|
||||
return { status: 404 }
|
||||
}
|
||||
|
||||
const userTweets = tweets.map((tweet) => {
|
||||
return {
|
||||
id: tweet.id,
|
||||
content: tweet.content,
|
||||
likes: tweet.likes,
|
||||
posted: timePosted(tweet.posted),
|
||||
url: tweet.url,
|
||||
avatar: tweet.user.avatar,
|
||||
handle: tweet.user.handle,
|
||||
name: tweet.user.name,
|
||||
liked: likedTweets.includes(tweet.id)
|
||||
}
|
||||
})
|
||||
|
||||
return { profile, tweets: userTweets }
|
||||
}
|
||||
|
|
@ -16,7 +16,8 @@ const config = {
|
|||
$root: path.resolve('./src')
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
methodOverride: { allowed: ['DELETE'] }
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue