From 4291eeacbca3ea46eabd82c9f7fb239dc89c9cd5 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 21 Feb 2025 12:02:20 +0100 Subject: [PATCH] session based posting --- src/app/ThemeProvider.tsx | 9 ----- src/app/api/account/route.ts | 2 +- src/app/api/database.ts | 2 +- src/app/api/posts/post.ts | 13 +++++-- src/app/api/posts/route.ts | 63 +++++++++++++++++++++++++++++---- src/app/calendar/page.tsx | 5 +-- src/app/calendar/postDialog.tsx | 10 +++--- src/app/layout.tsx | 4 +-- src/utils.ts | 34 +++++++++++++----- 9 files changed, 106 insertions(+), 36 deletions(-) delete mode 100644 src/app/ThemeProvider.tsx diff --git a/src/app/ThemeProvider.tsx b/src/app/ThemeProvider.tsx deleted file mode 100644 index d64dfab..0000000 --- a/src/app/ThemeProvider.tsx +++ /dev/null @@ -1,9 +0,0 @@ -'use client'; - -import * as React from 'react'; -import { ThemeProvider as NextThemesProvider } from 'next-themes'; -import { type ThemeProviderProps } from 'next-themes'; - -export function ThemeProvider({ children, ...props }: ThemeProviderProps) { - return {children}; -} diff --git a/src/app/api/account/route.ts b/src/app/api/account/route.ts index ce14249..9c628ab 100644 --- a/src/app/api/account/route.ts +++ b/src/app/api/account/route.ts @@ -28,7 +28,7 @@ export async function POST(req: NextRequest) { { status: 409 } ); - await database.users.insertOne({ email, password, name, platforms: [] }); + await database.users.insertOne({ email, password, name, platforms: {} }); const sessionId = (await database.sessions.insertOne({ user: email })) .insertedId; diff --git a/src/app/api/database.ts b/src/app/api/database.ts index 1fde5dc..393ceb5 100644 --- a/src/app/api/database.ts +++ b/src/app/api/database.ts @@ -1,6 +1,6 @@ import { MongoClient } from 'mongodb'; import config from './env'; -import { Schedule, Session, User } from '@/utils'; +import { Schedule, ScheduleRequest, Session, User } from '@/utils'; const client = new MongoClient(config.mongoUrl); diff --git a/src/app/api/posts/post.ts b/src/app/api/posts/post.ts index 9ff672c..3957a11 100644 --- a/src/app/api/posts/post.ts +++ b/src/app/api/posts/post.ts @@ -1,14 +1,21 @@ import { TwitterApi } from 'twitter-api-v2'; import config from '@/app/api/env'; import { inspect } from 'util'; -import { PostRequest } from '@/utils'; +import { Post } from '@/utils'; import database from '../database'; import { format } from 'date-fns'; import cron from 'node-cron'; +import { ObjectId } from 'mongodb'; -export default async function post({ platforms, content }: PostRequest) { +export default async function post({ platforms, content, account }: Post) { try { - for (const platform of platforms) { + const user = await database.users.findOne({ + _id: new ObjectId(account), + }); + + if (!user) return; + for (const platformKey of platforms) { + const platform = user.platforms[platformKey]; switch (platform.platform) { // X / Twitter case 'x': diff --git a/src/app/api/posts/route.ts b/src/app/api/posts/route.ts index 3572152..fa3c30d 100644 --- a/src/app/api/posts/route.ts +++ b/src/app/api/posts/route.ts @@ -1,14 +1,39 @@ import { NextResponse, NextRequest } from 'next/server'; import database from '../database'; -import { PostRequest, Schedule } from '@/utils'; +import { PostRequest, ScheduleRequest } from '@/utils'; import post from './post'; import { ObjectId } from 'mongodb'; -import { use } from 'react'; export async function POST(req: NextRequest) { - const request: PostRequest = await req.json(); + const { sessionId, content, platforms }: PostRequest = await req.json(); - post(request); + console.log(sessionId); + + if (typeof sessionId !== 'string') + return NextResponse.json( + { + message: 'Invalid structure, required param `id=`', + }, + { status: 400 } + ); + + const session = await database.sessions.findOne({ + _id: new ObjectId(sessionId), + }); + + if (!session) + return NextResponse.json( + { + message: 'Invalid session', + }, + { status: 404 } + ); + + post({ + account: session.user, + content, + platforms, + }); return NextResponse.json( { @@ -19,9 +44,35 @@ export async function POST(req: NextRequest) { } export async function PUT(req: NextRequest) { - const request: Schedule = await req.json(); + const { sessionId, scheduled, content, platforms }: ScheduleRequest = + await req.json(); - database.schedules.insertOne(request); + if (typeof sessionId !== 'string') + return NextResponse.json( + { + message: 'Invalid structure, required param `id=`', + }, + { status: 400 } + ); + + const session = await database.sessions.findOne({ + _id: new ObjectId(sessionId), + }); + + if (!session) + return NextResponse.json( + { + message: 'Invalid session', + }, + { status: 404 } + ); + + database.schedules.insertOne({ + account: session.user, + scheduled, + content, + platforms, + }); return NextResponse.json( { diff --git a/src/app/calendar/page.tsx b/src/app/calendar/page.tsx index ac6f20f..584023b 100644 --- a/src/app/calendar/page.tsx +++ b/src/app/calendar/page.tsx @@ -22,7 +22,7 @@ import { format, parse } from 'date-fns'; import PostDialog, { today } from './postDialog'; import axios from 'axios'; import Cookies from 'js-cookie'; -import { Schedule } from '@/utils'; +import { ScheduleRequest } from '@/utils'; function closestChild(children: any, clientX: number, clientY: number) { let closestElement = null; @@ -59,7 +59,7 @@ function CalendarApp() { useEffect(() => { axios.get(`/api/posts/?id=${sessionId}`).then((response) => { for (const [id, sched] of ( - response.data.schedules as Schedule[] + response.data.schedules as ScheduleRequest[] ).entries()) { const date = parse( sched.scheduled, @@ -160,6 +160,7 @@ function CalendarApp() { setEventCount(eventCount + 1); }} eventId={eventCount} + sessionId={sessionId} /> diff --git a/src/app/calendar/postDialog.tsx b/src/app/calendar/postDialog.tsx index fa25a01..54de687 100644 --- a/src/app/calendar/postDialog.tsx +++ b/src/app/calendar/postDialog.tsx @@ -25,7 +25,7 @@ import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { useState } from 'react'; import axios from 'axios'; -import { Schedule } from '@/utils'; +import { PostRequest, ScheduleRequest } from '@/utils'; type PostDialogProps = { newPostDialogOpen: boolean; @@ -34,6 +34,7 @@ type PostDialogProps = { setDate: (d: Date) => void; eventId: number; setEvents: (e: CalendarEventExternal) => void; + sessionId: string; }; export const today = new Date(); @@ -46,6 +47,7 @@ export default function PostDialog({ setDate, setEvents: addEvent, eventId, + sessionId, }: PostDialogProps) { const [content, setContent] = useState(''); @@ -133,10 +135,10 @@ export default function PostDialog({ }); axios.put('http://localhost:3000/api/posts', { scheduled: format(date, 'y-MM-dd hh:mm'), - account: '', - platforms: [], + sessionId, + platforms: ['andjksds'], content, - } satisfies Schedule); + } satisfies ScheduleRequest); setNewPostDialogOpen(false); }} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 61e1427..c7a0eb0 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,8 +1,9 @@ import type { Metadata } from 'next'; import { cn } from '@/lib/utils'; import './globals.css'; -import { ThemeProvider } from './ThemeProvider'; import { Toaster } from '@/components/ui/toaster'; +import { ThemeProvider, useTheme } from 'next-themes'; +import ThemeToggle from '@/components/themeToggle'; export const metadata: Metadata = { title: 'Create Next App', @@ -24,7 +25,6 @@ export default function RootLayout({ > diff --git a/src/utils.ts b/src/utils.ts index b9e32f2..eee2168 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,20 @@ -import { ObjectId } from 'mongodb'; +/* +Request types +*/ + +export interface PostRequest { + sessionId: string; + content: string; + platforms: string[]; +} + +export interface ScheduleRequest extends PostRequest { + scheduled: string; +} + +/* +Database types +*/ export type PlatformKind = 'x' | 'linkedin'; @@ -8,20 +24,22 @@ export interface Platform { secret: string; } -export interface PostRequest { - account: string; - content: string; - platforms: Platform[]; -} +export type Platforms = { [key: string]: Platform }; export interface User { name: string; email: string; password: string; - platforms: Platform[]; + platforms: Platforms; } -export interface Schedule extends PostRequest { +export interface Post { + account: string; + content: string; + platforms: string[]; +} + +export interface Schedule extends Post { scheduled: string; }