From 0484c1dfc7c0f4990ee15d85e5b6c856f8cdaab6 Mon Sep 17 00:00:00 2001 From: Omer Sabic Date: Fri, 7 Jun 2024 12:39:11 +0200 Subject: [PATCH] aefaeff --- src/db/schemas.js | 2 +- src/routes/auth.js | 93 ++++++++++++++++++++++------------------- src/routes/dashboard.js | 33 ++++++++++++++- src/utils/env.js | 2 +- src/utils/token.js | 8 ++-- 5 files changed, 88 insertions(+), 50 deletions(-) diff --git a/src/db/schemas.js b/src/db/schemas.js index bc93e77..fbd6181 100644 --- a/src/db/schemas.js +++ b/src/db/schemas.js @@ -43,7 +43,7 @@ export const sites = pgTable("sites", { text_color_hex: varchar("text_color_hex", { length: 6 }).default('ffffff').notNull(), title: text("title").default("The best blog in the world!"), subtitle: text("subtitle").default("Some extra info about the best blog in the world!"), - domain: text("domain").default("").unique(), + domain: text("domain").default(null).unique(), use_freebie: boolean("send_freebie").default(false), freebie_name: text("freebie_name").default(""), freebie_url: text("freebie_url").default(""), diff --git a/src/routes/auth.js b/src/routes/auth.js index 0157398..83f0589 100644 --- a/src/routes/auth.js +++ b/src/routes/auth.js @@ -29,55 +29,62 @@ export const authRoutes = (fastify, _, done) => { const [existing_user] = await db.select().from(usersTable).where(eq(usersTable.google_id, user_info.id)); let user; + await db.transaction(async tx => { + try { + if (existing_user) { + user = existing_user; - if (existing_user) { - user = existing_user; + if (token.refresh_token) { + await tx.update(sessions).set({ + refresh_token: token.refresh_token + }).where(eq(sessions.user_id, user.id)); + } + } + else { + const customer = await createCustomer(user_info.email, user_info.name); + [user] = await tx.insert(usersTable).values({ + name: user_info.name, + google_id: user_info.id, + email: user_info.email, + channel_id: channel_info.id, + uploads_playlist_id: channel_info.contentDetails.relatedPlaylists.uploads, + stripe_id: customer.id + }).returning({ id: usersTable.id }); - if (token.refresh_token) { - await db.update(sessions).set({ - refresh_token: token.refresh_token - }).where(eq(sessions.user_id, user.id)); - } - } - else { - const customer = await createCustomer(user_info.email, user_info.name); - [user] = await db.insert(usersTable).values({ - name: user_info.name, - google_id: user_info.id, - email: user_info.email, - channel_id: channel_info.id, - uploads_playlist_id: channel_info.contentDetails.relatedPlaylists.uploads, - stripe_id: customer.id - }).returning({ id: usersTable.id }); + await tx.insert(sites).values({ + name: `${user_info.name}'s Website`, + user_id: user.id + }); - await db.insert(sites).values({ - name: `${user_info.name}'s Website`, - user_id: user.id - }); + if (user.length == 0) { + response.status(400).send({ success: false, message: "Problem when creating user account" }); + return; + } + } + let session_id; + if (token.refresh_token) { + let session_info = await createSession(user.id, { + access_token: token.access_token, + refresh_token: token.refresh_token, + expires_at: new Date(token.expires_at) + }, tx); - if (user.length == 0) { - response.status(400).send({ success: false, message: "Problem when creating user account" }); + session_id = session_info.session_id; + } + else { + let session_info = await tx.select().from(users).leftJoin(sessions, eq(sessions.user_id, users.id)).where(eq(users.google_id, user_info.id)); + if (session_info.length == 0) { + response.status(400).send({ success: false, message: "Problem when creating user account" }); + return; + } + session_id = session_info[0].sessions.id + } + } catch (e) { + console.log(e); + await tx.rollback(); return; } - } - let session_id; - if (token.refresh_token) { - let session_info = await createSession(user.id, { - access_token: token.access_token, - refresh_token: token.refresh_token, - expires_at: new Date(token.expires_at) - }); - - session_id = session_info.session_id; - } - else { - let session_info = await db.select().from(users).leftJoin(sessions, eq(sessions.user_id, users.id)).where(eq(users.google_id, user_info.id)); - if (session_info.length == 0) { - response.status(400).send({ success: false, message: "Problem when creating user account" }); - return; - } - session_id = session_info[0].sessions.id - } + }) // response.setCookie("token", session_id, { // httpOnly: false, diff --git a/src/routes/dashboard.js b/src/routes/dashboard.js index 372b56f..01f87c8 100644 --- a/src/routes/dashboard.js +++ b/src/routes/dashboard.js @@ -1,6 +1,6 @@ /** @typedef {import("fastify").FastifyInstance} FastifyInstance */ -import { desc, eq, getTableColumns, sql } from "drizzle-orm"; +import { and, desc, eq, getTableColumns, sql } from "drizzle-orm"; import { db } from "../db/index.js"; import { articles, articles as articlesTable, signups as signupsTable, sites, users } from "../db/schemas.js"; import { authMiddleware, authMiddlewareFn } from "../modules/middleware.js"; @@ -147,6 +147,37 @@ export const dashboardRoutes = (fastify, _, done) => { return; }); + fastify.delete("/article", { + schema: { + querystring: { + type: "object", + properties: { + id: { + type: "string" + } + }, + required: ["id"] + } + } + }, async (req, reply) => { + const [article] = await db.select(getTableColumns(articles)).from(articles).leftJoin(sites, eq(sites.id, articles.site_id)).where(and(eq(sites.user_id, req.session.user_id), eq(articles.id, req.query.id))); + + if (!article) { + reply.status(404).send({ + success: false, + message: "This article does not exist." + }); + return; + } + + await db.delete(articles).where(eq(articles.id, article.id)); + + reply.send({ + success: true + }); + return; + }); + fastify.post("/create", { schema: { body: { diff --git a/src/utils/env.js b/src/utils/env.js index 39eb005..c8eafa0 100644 --- a/src/utils/env.js +++ b/src/utils/env.js @@ -12,7 +12,7 @@ const envSchema = z.object({ GOOGLE_CLIENT_ID: z.string(), GOOGLE_SECRET: z.string(), OPENAI_TOKEN: z.string(), - CERTS_URL: z.string() + CERTS_URL: z.string().nullable().default(null) }); export const env = envSchema.parse(process.env); diff --git a/src/utils/token.js b/src/utils/token.js index 3d9383e..f88609e 100644 --- a/src/utils/token.js +++ b/src/utils/token.js @@ -12,9 +12,9 @@ import { sessions } from "../db/schemas.js"; export async function createSession(user_id, { access_token, refresh_token, - expires_at -}) { - const [existing_session] = await db.select().from(sessions).where(eq(sessions.user_id, user_id)); + expires_at, +}, tx = db) { + const [existing_session] = await tx.select().from(sessions).where(eq(sessions.user_id, user_id)); if(existing_session) { return { @@ -22,7 +22,7 @@ export async function createSession(user_id, { } } - const token = await db.insert(sessions).values({ + const token = await tx.insert(sessions).values({ user_id, access_token: access_token, refresh_token: refresh_token,