diff --git a/src/app/api/auth/route.ts b/src/app/api/auth/route.ts new file mode 100644 index 0000000..665d3af --- /dev/null +++ b/src/app/api/auth/route.ts @@ -0,0 +1,119 @@ +import { NextResponse, NextRequest } from 'next/server'; +import database from '../../../lib/database'; +import { ObjectId } from 'mongodb'; + +export async function GET(req: NextRequest) { + const sessionId = req.cookies.get('session_id'); + + console.log(sessionId); + + if (!sessionId) + return NextResponse.json( + { + message: 'Session not found', + }, + { status: 401 } + ); + + const user = await database.sessions.findOne({ + _id: new ObjectId(sessionId.value), + }); + + if (!user) + return NextResponse.json( + { + message: 'Invalid session', + }, + { status: 401 } + ); + + return NextResponse.json( + { + message: 'ok', + dashboard: { + engagement: [ + { week: 'Mo', views: 7300 }, + { week: 'Tuesday', views: 18000 }, + { week: 'Wednesday', views: 12000 }, + { week: 'Thursday', views: 12000 }, + { week: 'Friday', views: 23000 }, + { week: 'Saturday', views: 40000 }, + { week: 'Sunday', views: 20000 }, + ], + }, + }, + { status: 200 } + ); +} + +// Account login +// Email exists +// Password is valid +export async function POST(req: NextRequest) { + const { email, password } = await req.json(); + + if (typeof email !== 'string' || typeof password !== 'string') { + return NextResponse.json( + { + message: + "Invalid structure, body requires 'email: string' and 'password: string'", + }, + { status: 400 } + ); + } + + const user = await database.users.findOne({ email }); + + if (!user || user.password !== password) { + return NextResponse.json( + { + message: 'Invalid email or password', + }, + { status: 401 } + ); + } + + const sessionId = new ObjectId(); + await database.sessions.insertOne({ + _id: sessionId, + user: user._id.toString(), + }); + + const response = NextResponse.json( + { + message: 'ok', + }, + { status: 200 } + ); + + response.cookies.set('session_id', sessionId.toString(), { + httpOnly: false, + secure: false, + sameSite: 'lax', + path: '/api', + maxAge: 60 * 60 * 24, // 1 day + }); + + return response; +} + +export async function DELETE(req: NextRequest) { + const sessionId = req.cookies.get('session_id'); + + if (!sessionId) + return NextResponse.json( + { message: 'Session not found' }, + { status: 401 } + ); + + await database.sessions.deleteOne({ _id: new ObjectId(sessionId.value) }); + + const response = NextResponse.json( + { message: 'Session deleted' }, + { status: 200 } + ); + + response.cookies.delete('session_id'); + + return response; +} diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..db9e1ad --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,51 @@ +/* +Request types +*/ + +export interface PostRequest { + content: string; + platforms: string[]; +} + +export interface ScheduleRequest extends PostRequest { + scheduled: string; +} + +export interface ScheduleRemoveRequest { + schedule: string; +} + +/* +Database types +*/ + +export type PlatformKind = 'x' | 'linkedin'; + +export interface Platform { + platform: PlatformKind; + token: string; + secret: string; +} + +export type Platforms = { [key: string]: Platform }; + +export interface User { + name: string; + email: string; + password: string; + platforms: Platforms; +} + +export interface Post { + account: string; + content: string; + platforms: string[]; +} + +export interface Schedule extends Post { + scheduled: string; +} + +export type Session = { user: string }; + +export const DATE_FORMAT = 'y-MM-dd hh:mm';