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 type { RequestHandler } from '@sveltejs/kit'
|
||||||
import prisma from "$root/lib/prisma";
|
|
||||||
import { timePosted } from "$root/lib/date";
|
import {
|
||||||
|
createTweet,
|
||||||
|
getTweets,
|
||||||
|
removeTweet
|
||||||
|
} from '$root/utils/prisma'
|
||||||
|
|
||||||
export const get: RequestHandler = async () => {
|
export const get: RequestHandler = async () => {
|
||||||
const data = await prisma.tweet.findMany({
|
const tweets = await getTweets()
|
||||||
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)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!tweets) {
|
if (!tweets) {
|
||||||
return { status: 400 }
|
return { status: 400 }
|
||||||
|
|
@ -43,26 +21,16 @@ export const get: RequestHandler = async () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const post: RequestHandler = async ({ request }) => {
|
export const post: RequestHandler = async ({ request }) => {
|
||||||
const form = await request.formData()
|
await createTweet(request)
|
||||||
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 } }
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return {}
|
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 }) => {
|
export const post: RequestHandler = async ({ request }) => {
|
||||||
const form = await request.formData()
|
await likeTweet(request)
|
||||||
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) }
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: 303,
|
status: 303,
|
||||||
headers: { location: '/home' }
|
headers: {
|
||||||
|
location: '/home'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,48 +1,12 @@
|
||||||
import type { RequestHandler } from "@sveltejs/kit";
|
import type { RequestHandler } from '@sveltejs/kit'
|
||||||
|
import { getUserProfile } from '$root/utils/prisma'
|
||||||
import prisma from "$root/lib/prisma";
|
|
||||||
import { timePosted } from "$root/lib/date";
|
|
||||||
|
|
||||||
export const get: RequestHandler = async ({ params }) => {
|
export const get: RequestHandler = async ({ params }) => {
|
||||||
const profile = await prisma.user.findFirst({
|
const { profile, tweets } = await getUserProfile(params)
|
||||||
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)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
status: 200,
|
status: 200,
|
||||||
body: { profile, tweets: userTweets }
|
body: { profile, tweets }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,36 +1,16 @@
|
||||||
import { timePosted } from "$root/lib/date";
|
import type { RequestHandler } from '@sveltejs/kit'
|
||||||
import prisma from "$root/lib/prisma";
|
|
||||||
import type { RequestHandler } from "@sveltejs/kit";
|
import { getTweet } from '$root/utils/prisma'
|
||||||
|
|
||||||
export const get: RequestHandler = async ({ params }) => {
|
export const get: RequestHandler = async ({ params }) => {
|
||||||
const tweet = await prisma.tweet.findFirst({
|
const tweet = await getTweet(params)
|
||||||
where: { url: params.tweetId },
|
|
||||||
include: { user: true }
|
|
||||||
})
|
|
||||||
|
|
||||||
const liked = await prisma.liked.findMany({
|
if (!tweet) {
|
||||||
where: { userId: 1 },
|
return { status: 400 }
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: 200,
|
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')
|
$root: path.resolve('./src')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
methodOverride: { allowed: ['DELETE'] }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue