diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 89b34a1..9bda814 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -5,7 +5,7 @@ import { ConfigModule } from '@nestjs/config'; import { GraphQLISODateTime, GraphQLModule } from '@nestjs/graphql'; import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { ApolloServerPluginLandingPageLocalDefault } from 'apollo-server-core'; -import { UsersModule } from './users/users.module'; +// import { UsersModule } from './users/users.module'; @Module({ imports: [ @@ -29,7 +29,7 @@ import { UsersModule } from './users/users.module'; resolvers: { DateTime: GraphQLISODateTime }, plugins: [ApolloServerPluginLandingPageLocalDefault()], }), - UsersModule, + // UsersModule, ], controllers: [AppController], providers: [], diff --git a/backend/src/auth/supertokens/supertokens.service.ts b/backend/src/auth/supertokens/supertokens.service.ts index 491c742..d2e4f25 100644 --- a/backend/src/auth/supertokens/supertokens.service.ts +++ b/backend/src/auth/supertokens/supertokens.service.ts @@ -46,15 +46,32 @@ export class SupertokensService { }), ], }), - Session - .init - // { - // jwt: { - // enable: true, - // issuer: `${process.env.APP_URL}/auth/api`, - // }, - // } - (), + Session.init({ + // antiCsrf: "VIA_CUSTOM_HEADER", + jwt: { + enable: true, + issuer: `${process.env.APP_URL}/auth/api`, + }, + override: { + functions: function (originalImplementation) { + return { + ...originalImplementation, + createNewSession: async function (input) { + input.accessTokenPayload = { + ...input.accessTokenPayload, + 'https://hasura.io/jwt/claims': { + 'x-hasura-user-id': input.userId, + 'x-hasura-default-role': 'user', + 'x-hasura-allowed-roles': ['user'], + }, + }; + + return originalImplementation.createNewSession(input); + }, + }; + }, + }, + }), ], }); } diff --git a/backend/src/main.ts b/backend/src/main.ts index 5f6da9a..2c55941 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -2,18 +2,18 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import supertokens from 'supertokens-node'; import { SupertokensExceptionFilter } from './auth/filters/auth.filter'; -import { PrismaService } from 'prisma/prisma.service'; +// import { PrismaService } from 'prisma/prisma.service'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors({ - origin: [process.env.WEBAPP_URL, 'https://studio.apollographql.com'], + origin: [process.env.WEBAPP_URL, 'http://server.home:8081'], allowedHeaders: ['content-type', ...supertokens.getAllCORSHeaders()], credentials: true, }); app.useGlobalFilters(new SupertokensExceptionFilter()); - const prismaService = app.get(PrismaService); - await prismaService.enableShutdownHooks(app); + // const prismaService = app.get(PrismaService); + // await prismaService.enableShutdownHooks(app); await app.listen(process.env.APP_PORT); } diff --git a/backend/src/users/users.resolver.ts b/backend/src/users/users.resolver.ts index 5e1e557..4335303 100644 --- a/backend/src/users/users.resolver.ts +++ b/backend/src/users/users.resolver.ts @@ -6,19 +6,19 @@ import { UsersService } from './users.service'; export class UsersResolver { constructor(private readonly usersService: UsersService) {} - @Mutation('createUser') - create(@Args('createUserInput') createUserInput: Prisma.UserCreateInput) { - return this.usersService.create(createUserInput); - } - @Query('users') - findAll(@Args('params') params?: Prisma.UserFindManyArgs) { - return this.usersService.users(params); - } + // @Mutation('createUser') + // create(@Args('createUserInput') createUserInput: Prisma.UserCreateInput) { + // return this.usersService.create(createUserInput); + // } + // @Query('users') + // findAll(@Args('params') params?: Prisma.UserFindManyArgs) { + // return this.usersService.users(params); + // } - @Query('user') - findOne(@Args('id') id: string) { - return this.usersService.user({ id }); - } + // @Query('user') + // findOne(@Args('id') id: string) { + // return this.usersService.user({ id }); + // } // @Mutation('updateUser') // update(@Args('updateUserInput') updateUserInput: UpdateUserInput) { diff --git a/backend/src/users/users.service.ts b/backend/src/users/users.service.ts index 5e8469d..5a2416d 100644 --- a/backend/src/users/users.service.ts +++ b/backend/src/users/users.service.ts @@ -1,29 +1,29 @@ import { Injectable } from '@nestjs/common'; -import { Prisma, User } from '@prisma/client'; +// import { Prisma, User } from '@prisma/client'; import { PrismaService } from 'prisma/prisma.service'; @Injectable() export class UsersService { constructor(private readonly prismaService: PrismaService) {} - async user(uniqueInput: Prisma.UserWhereUniqueInput) { - return await this.prismaService.user.findUnique({ where: uniqueInput }); - } + // async user(uniqueInput: Prisma.UserWhereUniqueInput) { + // return await this.prismaService.user.findUnique({ where: uniqueInput }); + // } - async users(params?: Prisma.UserFindManyArgs) { - return await this.prismaService.user.findMany(params); - } + // async users(params?: Prisma.UserFindManyArgs) { + // return await this.prismaService.user.findMany(params); + // } - create(createUserInput: Prisma.UserCreateInput) { - return this.prismaService.user.create({ data: createUserInput }); - } + // create(createUserInput: Prisma.UserCreateInput) { + // return this.prismaService.user.create({ data: createUserInput }); + // } - update(id: string, userUpdateInput: Prisma.UserUpdateInput) { - return this.prismaService.user.update({ - where: { id }, - data: userUpdateInput, - }); - } + // update(id: string, userUpdateInput: Prisma.UserUpdateInput) { + // return this.prismaService.user.update({ + // where: { id }, + // data: userUpdateInput, + // }); + // } // remove(id: string) { // return `This action removes a #${id} user`; diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 8f25039..a5fc245 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -11,7 +11,10 @@ SuperTokens.init({ apiBasePath: "/auth/api", appName: "Fluxem", }, - recipeList: [EmailPass.init(), Session.init()], + recipeList: [ + EmailPass.init(), + Session.init(), + ], }); const App: Component = () => { diff --git a/frontend/src/hooks/auth/login.hook.ts b/frontend/src/hooks/auth/login.hook.ts index 2a93c66..554752b 100644 --- a/frontend/src/hooks/auth/login.hook.ts +++ b/frontend/src/hooks/auth/login.hook.ts @@ -2,6 +2,7 @@ import { createSignal } from "solid-js"; import { createStore } from "solid-js/store"; import EmailPassRecipe from "supertokens-web-js/recipe/emailpassword"; +import Session from "supertokens-web-js/recipe/session"; const useLogin = () => { const [loading, setLoading] = createSignal(false); @@ -22,7 +23,7 @@ const useLogin = () => { { id: "password", value: form.password }, ], }); - console.log(login); + console.log(login) } catch (error) { console.error(error); } finally { @@ -30,7 +31,26 @@ const useLogin = () => { } }; - return { handleInput, loading, handleLogin, form }; + const handleLogout = async () => { + const logout = await EmailPassRecipe.signOut(); + }; + + const handleJwt = async () => { + const session = await Session.doesSessionExist(); + if (session) { + let userId = await Session.getUserId(); + let jwt = (await Session.getAccessTokenPayloadSecurely()).jwt; + // console.log(userId, jwt); + const {isVerified} = await EmailPassRecipe.isEmailVerified(); + console.log(isVerified) + if(!isVerified) { + const sendEmail = await EmailPassRecipe.sendVerificationEmail() + console.log(sendEmail); + } + } + }; + + return { handleInput, loading, handleLogin, handleLogout, handleJwt, form }; }; export default useLogin; diff --git a/frontend/src/routes/index.tsx b/frontend/src/routes/index.tsx index f7d3398..c341bc7 100644 --- a/frontend/src/routes/index.tsx +++ b/frontend/src/routes/index.tsx @@ -5,7 +5,7 @@ const Home = lazy(() => import("./views/home/Home")); const AuthLayout = lazy(() => import("./views/auth/AuthLayout")); const Login = lazy(() => import("./views/auth/Login")); const Register = lazy(() => import("./views/auth/Register")); - +const VerifyEmail = lazy(() => import("./views/auth/VerifyEmail")); const AppRouter: Component = () => { return ( @@ -13,6 +13,7 @@ const AppRouter: Component = () => { }> }> }> + }> ); diff --git a/frontend/src/routes/views/auth/Login.tsx b/frontend/src/routes/views/auth/Login.tsx index 0b06bf0..fa9225d 100644 --- a/frontend/src/routes/views/auth/Login.tsx +++ b/frontend/src/routes/views/auth/Login.tsx @@ -1,6 +1,6 @@ import { Component, Show } from "solid-js"; import useLogin from "../../../hooks/auth/login.hook"; -const { handleLogin, handleInput, loading, form } = useLogin(); +const { handleLogin, handleLogout, handleInput, handleJwt, loading, form } = useLogin(); const Login: Component = () => { return (
@@ -32,6 +32,12 @@ const Login: Component = () => { + +
); }; diff --git a/frontend/src/routes/views/auth/VerifyEmail.tsx b/frontend/src/routes/views/auth/VerifyEmail.tsx new file mode 100644 index 0000000..8ca232f --- /dev/null +++ b/frontend/src/routes/views/auth/VerifyEmail.tsx @@ -0,0 +1,18 @@ +import EmailPassRecipe from "supertokens-web-js/recipe/emailpassword"; + +const VerifyEmail = () => { + let text = "Verifying email"; + const verifyEmail = EmailPassRecipe.verifyEmail(); + verifyEmail.then((data) => { + console.log(data); + text = "Email verified successfully"; + }); + // console.log(verifyEmail); + return ( +
+

{text}

+
+ ); +}; + +export default VerifyEmail;