Progress so far
This commit is contained in:
		
							
								
								
									
										75
									
								
								app/api/account/authorize/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								app/api/account/authorize/route.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
import axios from 'axios'
 | 
			
		||||
import { db } from "@/lib/db"
 | 
			
		||||
import { NextResponse } from "next/server";
 | 
			
		||||
 | 
			
		||||
export async function GET(req: Request) {
 | 
			
		||||
    try {
 | 
			
		||||
        const { searchParams } = new URL(req.url)
 | 
			
		||||
        const code = searchParams.get('code') as string
 | 
			
		||||
        const scope = searchParams.get('scope') as string
 | 
			
		||||
        const state = searchParams.get('state') as string
 | 
			
		||||
 | 
			
		||||
        console.log("CODE:", code)
 | 
			
		||||
        console.log("SCOPE:", scope)
 | 
			
		||||
        console.log("STATE:", state)
 | 
			
		||||
        if (!code || !scope || !state) {
 | 
			
		||||
            return new NextResponse("Bad Request", { status: 400 });
 | 
			
		||||
        }
 | 
			
		||||
        console.log("VERIFY")
 | 
			
		||||
        // Verify state against user id in user table.
 | 
			
		||||
        const user = await db.user.findFirst({
 | 
			
		||||
          where: {
 | 
			
		||||
            id: state
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        console.log("USER", user)
 | 
			
		||||
        if (!user) {
 | 
			
		||||
          return new NextResponse("Bad Request", { status: 400 });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        console.log("FETCH TOKEN")
 | 
			
		||||
        // Post to https://id.twitch.tv/oauth2/token
 | 
			
		||||
        const token: { access_token:string, expires_in:number, refresh_token:string, token_type:string, scope:string[] } = (await axios.post("https://id.twitch.tv/oauth2/token", {
 | 
			
		||||
            client_id: process.env.TWITCH_BOT_CLIENT_ID,
 | 
			
		||||
            client_secret: process.env.TWITCH_BOT_CLIENT_SECRET,
 | 
			
		||||
            code: code,
 | 
			
		||||
            grant_type: "authorization_code",
 | 
			
		||||
            redirect_uri: "https://hermes.goblincaves.com/api/account/authorize"
 | 
			
		||||
        })).data
 | 
			
		||||
        console.log("TOKEN", token)
 | 
			
		||||
 | 
			
		||||
        // Fetch values from token.
 | 
			
		||||
        const { access_token, expires_in, refresh_token, token_type } = token
 | 
			
		||||
        console.log("AT", access_token)
 | 
			
		||||
        console.log("RT", refresh_token)
 | 
			
		||||
        console.log("TT", token_type)
 | 
			
		||||
 | 
			
		||||
        if (!access_token || !refresh_token || token_type !== "bearer") {
 | 
			
		||||
            return new NextResponse("Unauthorized", { status: 401 });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let info = await axios.get("https://api.twitch.tv/helix/users?login=" + user.username, {
 | 
			
		||||
            headers: {
 | 
			
		||||
                "Authorization": "Bearer " + access_token,
 | 
			
		||||
                "Client-Id": process.env.TWITCH_BOT_CLIENT_ID
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        console.log(info.data.data)
 | 
			
		||||
        const broadcasterId = info.data.data[0]['id']
 | 
			
		||||
 | 
			
		||||
        await db.twitchConnection.create({
 | 
			
		||||
          data: {
 | 
			
		||||
            broadcasterId: broadcasterId,
 | 
			
		||||
            accessToken: access_token,
 | 
			
		||||
            refreshToken: refresh_token,
 | 
			
		||||
            userId: state
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
        return new NextResponse("", { status: 200 });
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
        console.log("[ACCOUNT]", error);
 | 
			
		||||
        return new NextResponse("Internal Error", { status: 500 });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								app/api/account/reauthorize/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								app/api/account/reauthorize/route.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
import axios from 'axios'
 | 
			
		||||
import { db } from "@/lib/db"
 | 
			
		||||
import { NextResponse } from "next/server";
 | 
			
		||||
import { GET as authorize } from '../authorize/route'
 | 
			
		||||
 | 
			
		||||
export async function GET(req: Request) {
 | 
			
		||||
    try {
 | 
			
		||||
        // Verify state against user id in user table.
 | 
			
		||||
        const key = await db.apiKey.findFirst({
 | 
			
		||||
          where: {
 | 
			
		||||
            id: req.headers.get('x-api-key') as string
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        console.log("API USER:", key)
 | 
			
		||||
        if (!key) {
 | 
			
		||||
            return new NextResponse("Forbidden", { status: 403 });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const connection = await db.twitchConnection.findFirst({
 | 
			
		||||
          where: {
 | 
			
		||||
            userId: key.userId
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
        if (!connection) {
 | 
			
		||||
            return new NextResponse("Forbidden", { status: 403 });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            const { expires_in }: { client_id:string, login:string, scopes:string[], user_id:string, expires_in:number } = (await axios.get("https://id.twitch.tv/oauth2/validate", {
 | 
			
		||||
              headers: {
 | 
			
		||||
                Authorization: 'OAuth ' + connection.accessToken
 | 
			
		||||
              }
 | 
			
		||||
            })).data;
 | 
			
		||||
            if (expires_in > 3600)
 | 
			
		||||
                return new NextResponse("", { status: 201 });
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.log("Oudated Twitch token.")
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Post to https://id.twitch.tv/oauth2/token
 | 
			
		||||
        const token: { access_token:string, expires_in:number, refresh_token:string, token_type:string, scope:string[] } = (await axios.post("https://id.twitch.tv/oauth2/token", {
 | 
			
		||||
            client_id: process.env.TWITCH_BOT_CLIENT_ID,
 | 
			
		||||
            client_secret: process.env.TWITCH_BOT_CLIENT_SECRET,
 | 
			
		||||
            grant_type: "refresh_token",
 | 
			
		||||
            refresh_token: connection.refreshToken
 | 
			
		||||
        })).data
 | 
			
		||||
 | 
			
		||||
        // Fetch values from token.
 | 
			
		||||
        const { access_token, expires_in, refresh_token, token_type } = token
 | 
			
		||||
        console.log("AT", access_token)
 | 
			
		||||
        console.log("RT", refresh_token)
 | 
			
		||||
        console.log("TT", token_type)
 | 
			
		||||
 | 
			
		||||
        if (!access_token || !refresh_token || token_type !== "bearer") {
 | 
			
		||||
            return new NextResponse("Unauthorized", { status: 401 });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        await db.twitchConnection.update({
 | 
			
		||||
          where: {
 | 
			
		||||
            userId: key.userId
 | 
			
		||||
          },
 | 
			
		||||
          data: {
 | 
			
		||||
            accessToken: access_token
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
        return new NextResponse("", { status: 200 });
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
        console.log("[ACCOUNT]", error);
 | 
			
		||||
        return new NextResponse("Internal Error", { status: 500 });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										67
									
								
								app/api/account/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								app/api/account/route.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
import { db } from "@/lib/db"
 | 
			
		||||
import { NextResponse } from "next/server";
 | 
			
		||||
import { getServerSession } from "next-auth";
 | 
			
		||||
import { generateToken } from "../token/route";
 | 
			
		||||
import fetchUserUsingAPI from "@/lib/validate-api";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export async function GET(req: Request) {
 | 
			
		||||
    try {
 | 
			
		||||
      return NextResponse.json(await fetchUserUsingAPI(req))
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
        console.log("[ACCOUNT]", error);
 | 
			
		||||
        return new NextResponse("Internal Error", { status: 500 });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function POST(req: Request) {
 | 
			
		||||
    try {
 | 
			
		||||
        const session = await getServerSession()
 | 
			
		||||
        const user = session?.user?.name
 | 
			
		||||
        if (!user) {
 | 
			
		||||
            return new NextResponse("Internal Error", { status: 401 })
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        const exist = await db.user.findFirst({
 | 
			
		||||
          where: {
 | 
			
		||||
            username: user.toLowerCase() as string
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
  
 | 
			
		||||
        if (exist) {
 | 
			
		||||
            // const apikey = await db.apiKey.findFirst({
 | 
			
		||||
            //   where: {
 | 
			
		||||
            //     userId: user.toLowerCase() as string
 | 
			
		||||
            //   }
 | 
			
		||||
            // })
 | 
			
		||||
            return {
 | 
			
		||||
              id: exist.id,
 | 
			
		||||
              username: exist.username,
 | 
			
		||||
              //key: apikey?.id as string
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        const newUser = await db.user.create({
 | 
			
		||||
          data: {
 | 
			
		||||
            username: user.toLowerCase() as string,
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // const apikey = await db.apiKey.create({
 | 
			
		||||
        //   data: {
 | 
			
		||||
        //     id: generateToken(),
 | 
			
		||||
        //     label: "Default",
 | 
			
		||||
        //     userId: user.toLowerCase() as string
 | 
			
		||||
        //   }
 | 
			
		||||
        // })
 | 
			
		||||
 | 
			
		||||
        return NextResponse.json({
 | 
			
		||||
          id: newUser.id,
 | 
			
		||||
          username: newUser.username,
 | 
			
		||||
          //key: apikey.id
 | 
			
		||||
        });
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
        console.log("[ACCOUNT]", error);
 | 
			
		||||
        return new NextResponse("Internal Error", { status: 500 });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user