progress init

This commit is contained in:
Omer Sabic 2024-04-26 18:40:30 +02:00
parent 08fff603b5
commit 6b47ffaf8c
6 changed files with 87 additions and 44 deletions

View File

@ -17,13 +17,13 @@ export const sessions = pgTable("sessions", {
expires_at: timestamp("expires_at") expires_at: timestamp("expires_at")
}) })
export const site = pgTable("sites", { export const sites = pgTable("sites", {
id: uuid("id").defaultRandom().primaryKey(), id: uuid("id").defaultRandom().primaryKey(),
user_id: uuid("user_id").references(() => users.id), user_id: uuid("user_id").references(() => users.id),
name: text("name") name: text("name")
}) })
export const article = pgTable("articles", { export const articles = pgTable("articles", {
id: uuid("id").defaultRandom().primaryKey(), id: uuid("id").defaultRandom().primaryKey(),
site_id: uuid("site_id").references(() => site.id), site_id: uuid("site_id").references(() => site.id),
content: text("content"), content: text("content"),

View File

@ -1,5 +1,5 @@
import { initDb } from "./db/index.js"; import { initDb } from "./db/index.js";
import { channelRoutes, authRoutes, videoRoutes, meRoutes } from "./routes/index.js"; import { channelRoutes, authRoutes, videoRoutes, meRoutes, blogRoutes } from "./routes/index.js";
import { env, Logger, Redis } from "./utils/index.js"; import { env, Logger, Redis } from "./utils/index.js";
import fastify from "fastify"; import fastify from "fastify";
import { middleware } from "./modules/middleware.js"; import { middleware } from "./modules/middleware.js";
@ -67,6 +67,10 @@ export const main = async () => {
prefix: `/me` prefix: `/me`
}); });
server.register(blogRoutes, {
prefix: `/blog`
});
server.get("/hello", (req, res) => { server.get("/hello", (req, res) => {
res.send({message: "world", cookies: req.cookies}); res.send({message: "world", cookies: req.cookies});
}) })

View File

@ -5,7 +5,7 @@ import { db } from "../db/index.js";
import { sessions } from "../db/schemas.js"; import { sessions } from "../db/schemas.js";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
const middleware = fp( export const middleware = fp(
/** /**
* @param {FastifyInstance} fastify * @param {FastifyInstance} fastify
* @param {unknown} _options * @param {unknown} _options
@ -17,31 +17,33 @@ const middleware = fp(
}); });
}); });
const authMiddleware = fp( export const authMiddlewareFn = async (request, response) => {
async (fastify, _options) => { try {
fastify.addHook("preValidation", async (request, response) => { // if (!request.headers.authorization || !request.headers.authorization.startsWith("Bearer")) {
try { if (!request.cookies.token) {
// if (!request.headers.authorization || !request.headers.authorization.startsWith("Bearer")) { response.status(401).send({ success: false, message: "Missing authentication token" });
if(!request.cookies.token) { return false;
response.status(401).send({ success: false, message: "Missing authentication token" }); }
return; // const token = request.headers.authorization.split(" ")[1];
} const token = request.cookies.token;
// const token = request.headers.authorization.split(" ")[1];
const token = request.cookies.token;
const session = await db.select().from(sessions).where(eq(sessions.id, token)); const session = await db.select().from(sessions).where(eq(sessions.id, token));
if(session.length == 0) { if (session.length == 0) {
response.status(401).send({ success: false, message: "Invalid authentication token" }); response.status(401).send({ success: false, message: "Invalid authentication token" });
return; return false;
} }
// console.log(token); // console.log(token);
// console.log(session); // console.log(session);
request.session = session[0]; request.session = session[0];
} catch (e) { return true;
console.log(e); } catch (e) {
} console.log(e);
}); }
}
export const authMiddleware = fp(
async (fastify, _options) => {
fastify.addHook("preValidation", authMiddlewareFn);
} }
) )
export { middleware, authMiddleware };

View File

@ -1,10 +1,7 @@
import sget from 'simple-get';
import { createSession as createSession } from '../utils/token.js'; import { createSession as createSession } from '../utils/token.js';
import { google } from 'googleapis';
import { getChannelInfo, getUserInfo } from '../utils/youtube.js'; import { getChannelInfo, getUserInfo } from '../utils/youtube.js';
import { db } from '../db/index.js'; import { db } from '../db/index.js';
import { users as usersTable } from '../db/schemas.js'; import { users as usersTable } from '../db/schemas.js';
import { userInfo } from 'os';
import { eq } from 'drizzle-orm'; import { eq } from 'drizzle-orm';
import { env } from '../utils/env.js'; import { env } from '../utils/env.js';
@ -55,11 +52,11 @@ export const authRoutes = (fastify, _, done) => {
}); });
response.setCookie("token", session_id, { response.setCookie("token", session_id, {
httpOnly: true, httpOnly: false,
path: "/", path: "/",
// sameSite: false, sameSite: false,
maxAge: 1000 * 60 * 60 * 24 * 7, maxAge: 1000 * 60 * 60 * 24 * 7,
domain: "api.omersabic.com" domain: ".omersabic.com"
}).redirect(env.FRONTEND_URL); }).redirect(env.FRONTEND_URL);
// response.send({ // response.send({
// token: session_id // token: session_id

View File

@ -1,5 +1,8 @@
import { authMiddleware } from "../modules/middleware.js"; import { eq } from "drizzle-orm";
import { db } from "../db/index.js";
import { authMiddleware, authMiddlewareFn } from "../modules/middleware.js";
import { getAccessToken, getChannelInfo } from "../utils/youtube.js"; import { getAccessToken, getChannelInfo } from "../utils/youtube.js";
import { articles as articlesTable, sites } from "../db/schemas.js";
/** /**
* *
@ -7,27 +10,63 @@ import { getAccessToken, getChannelInfo } from "../utils/youtube.js";
* @param {unknown} _ * @param {unknown} _
* @param {() => void} done * @param {() => void} done
*/ */
export const channelRoutes = (fastify, _, done) => { export const blogRoutes = (fastify, _, done) => {
fastify.register(authMiddleware);
fastify.get("/", async (request, response) => { fastify.get("/", async (request, response) => {
try { try {
const mine = request.query.mine || true; const mine = request.query.mine != 'false' || true;
const blog_id = request.query const blog_id = request.query.blog_id;
if(mine && request) if(!mine && !blog_id) {
response.send({
success: false,
message: "Request can either have \"mine\" set to true or provide a blog_id"
})
}
let clause;
const access_token = await getAccessToken(fastify, request); if(mine) {
if(!(await authMiddlewareFn(request, response))) return;
clause = eq(sites.user_id, request.session.user_id);
}
const channel = await getChannelInfo(access_token); if(mine == false) {
clause = eq(sites.user_id, request.query.blog_id);
}
// const access_token = await getAccessToken(fastify, request);
// const channel = await getChannelInfo(access_token);
const articles = await db.select().from(articlesTable).leftJoin(sites, articlesTable.site_id == sites.id).where(clause);
response.send({ response.send({
success: true, success: true,
channel articles
}); });
} catch (e) { } catch (e) {
console.log(e); console.log(e);
} }
}); });
fastify.post("/create", {
schema: {
body: {
youtube_url: {
type: "string"
},
length: {
type: ["string", null],
enum: ["short", "medium", "long"]
},
format: {
type: ["string", null]
}
}
}
}, async (req, reply) => {
reply.send()
})
fastify.register(authMiddleware);
done(); done();
}; };

View File

@ -2,3 +2,4 @@ export * from "./channels.js";
export * from "./auth.js"; export * from "./auth.js";
export * from "./videos.js"; export * from "./videos.js";
export * from "./me.js"; export * from "./me.js";
export * from "./blog.js"