From 562abb0413f008b8750e5fa1ab81a1d7ea3d71a5 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 22 Jun 2024 22:13:22 +0100 Subject: [PATCH] cleanups --- apps/client/src/App.tsx | 9 +- .../auth/components/invite-sign-up-form.tsx | 8 +- .../features/auth/components/login-form.tsx | 7 -- .../features/auth/components/sign-up-form.tsx | 83 ------------------- .../src/features/auth/hooks/use-auth.ts | 26 +----- .../features/auth/services/auth-service.ts | 3 +- .../features/user/services/user-service.ts | 2 - apps/client/src/pages/auth/invite-signup.tsx | 13 +++ apps/client/src/pages/auth/layout.tsx | 7 -- .../auth/{signup.tsx => setup-workspace.tsx} | 23 ++--- apps/server/src/core/auth/auth.controller.ts | 3 +- .../src/core/auth/services/signup.service.ts | 6 +- .../services/workspace-invitation.service.ts | 3 +- .../integrations/mail/drivers/log.driver.ts | 7 +- 14 files changed, 54 insertions(+), 146 deletions(-) delete mode 100644 apps/client/src/features/auth/components/sign-up-form.tsx create mode 100644 apps/client/src/pages/auth/invite-signup.tsx delete mode 100644 apps/client/src/pages/auth/layout.tsx rename apps/client/src/pages/auth/{signup.tsx => setup-workspace.tsx} (68%) diff --git a/apps/client/src/App.tsx b/apps/client/src/App.tsx index 7b85715a..3045d78b 100644 --- a/apps/client/src/App.tsx +++ b/apps/client/src/App.tsx @@ -1,6 +1,5 @@ import { Navigate, Route, Routes } from "react-router-dom"; -import { Welcome } from "@/pages/welcome"; -import SignUpPage from "@/pages/auth/signup"; +import SetupWorkspace from "@/pages/auth/setup-workspace.tsx"; import LoginPage from "@/pages/auth/login"; import Home from "@/pages/dashboard/home"; import Page from "@/pages/page/page"; @@ -20,11 +19,11 @@ import { io } from "socket.io-client"; import { authTokensAtom } from "@/features/auth/atoms/auth-tokens-atom.ts"; import { SOCKET_URL } from "@/features/websocket/types"; import AccountPreferences from "@/pages/settings/account/account-preferences.tsx"; -import { InviteSignUpForm } from "@/features/auth/components/invite-sign-up-form.tsx"; import SpaceHome from "@/pages/space/space-home.tsx"; import PageRedirect from "@/pages/page/page-redirect.tsx"; import Layout from "@/components/layouts/global/layout.tsx"; import { ErrorBoundary } from "react-error-boundary"; +import InviteSignup from "@/pages/auth/invite-signup.tsx"; export default function App() { const [, setSocket] = useAtom(socketAtom); @@ -62,8 +61,8 @@ export default function App() { } /> } /> - } /> - } /> + } /> + } /> } /> diff --git a/apps/client/src/features/auth/components/invite-sign-up-form.tsx b/apps/client/src/features/auth/components/invite-sign-up-form.tsx index 31166188..81752f57 100644 --- a/apps/client/src/features/auth/components/invite-sign-up-form.tsx +++ b/apps/client/src/features/auth/components/invite-sign-up-form.tsx @@ -29,7 +29,9 @@ export function InviteSignUpForm() { const params = useParams(); const [searchParams] = useSearchParams(); - const { data: invitation } = useGetInvitationQuery(params?.invitationId); + const { data: invitation, isError } = useGetInvitationQuery( + params?.invitationId, + ); const { invitationSignup, isLoading } = useAuth(); useRedirectIfAuthenticated(); @@ -52,6 +54,10 @@ export function InviteSignUpForm() { }); } + if (isError) { + return
invalid invitation link
; + } + if (!invitation) { return
; } diff --git a/apps/client/src/features/auth/components/login-form.tsx b/apps/client/src/features/auth/components/login-form.tsx index 9e9376ee..92b2c8fa 100644 --- a/apps/client/src/features/auth/components/login-form.tsx +++ b/apps/client/src/features/auth/components/login-form.tsx @@ -71,13 +71,6 @@ export function LoginForm() { Sign In - - - Don't have an account yet?{" "} - - Create account - - ); diff --git a/apps/client/src/features/auth/components/sign-up-form.tsx b/apps/client/src/features/auth/components/sign-up-form.tsx deleted file mode 100644 index 49650008..00000000 --- a/apps/client/src/features/auth/components/sign-up-form.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import * as React from "react"; -import * as z from "zod"; - -import { useForm, zodResolver } from "@mantine/form"; -import { - Container, - Title, - Anchor, - TextInput, - Button, - Text, - PasswordInput, - Box, -} from "@mantine/core"; -import { Link } from "react-router-dom"; -import { IRegister } from "@/features/auth/types/auth.types"; -import useAuth from "@/features/auth/hooks/use-auth"; -import classes from "@/features/auth/components/auth.module.css"; -import { useRedirectIfAuthenticated } from "@/features/auth/hooks/use-redirect-if-authenticated.ts"; - -const formSchema = z.object({ - email: z - .string() - .min(1, { message: "email is required" }) - .email({ message: "Invalid email address" }), - password: z.string().min(1, { message: "Password is required" }), -}); - -export function SignUpForm() { - const { signUp, isLoading } = useAuth(); - useRedirectIfAuthenticated(); - - const form = useForm({ - validate: zodResolver(formSchema), - initialValues: { - email: "", - password: "", - }, - }); - - async function onSubmit(data: IRegister) { - await signUp(data); - } - - return ( - - - - Create an account - - -
- - - - - - - - Already have an account?{" "} - - Login - - -
-
- ); -} diff --git a/apps/client/src/features/auth/hooks/use-auth.ts b/apps/client/src/features/auth/hooks/use-auth.ts index 0d2996f6..a4957440 100644 --- a/apps/client/src/features/auth/hooks/use-auth.ts +++ b/apps/client/src/features/auth/hooks/use-auth.ts @@ -1,9 +1,5 @@ import { useState } from "react"; -import { - login, - register, - setupWorkspace, -} from "@/features/auth/services/auth-service"; +import { login, setupWorkspace } from "@/features/auth/services/auth-service"; import { useNavigate } from "react-router-dom"; import { useAtom } from "jotai"; import { authTokensAtom } from "@/features/auth/atoms/auth-tokens-atom"; @@ -46,25 +42,6 @@ export default function useAuth() { } }; - const handleSignUp = async (data: IRegister) => { - setIsLoading(true); - - try { - const res = await register(data); - setIsLoading(false); - - setAuthToken(res.tokens); - - navigate(APP_ROUTE.HOME); - } catch (err) { - setIsLoading(false); - notifications.show({ - message: err.response?.data.message, - color: "red", - }); - } - }; - const handleInvitationSignUp = async (data: IAcceptInvite) => { setIsLoading(true); @@ -135,7 +112,6 @@ export default function useAuth() { return { signIn: handleSignIn, - signUp: handleSignUp, invitationSignup: handleInvitationSignUp, setupWorkspace: handleSetupWorkspace, isAuthenticated: handleIsAuthenticated, diff --git a/apps/client/src/features/auth/services/auth-service.ts b/apps/client/src/features/auth/services/auth-service.ts index a4ab9695..b34b47f3 100644 --- a/apps/client/src/features/auth/services/auth-service.ts +++ b/apps/client/src/features/auth/services/auth-service.ts @@ -12,10 +12,11 @@ export async function login(data: ILogin): Promise { return req.data; } +/* export async function register(data: IRegister): Promise { const req = await api.post("/auth/register", data); return req.data; -} +}*/ export async function changePassword( data: IChangePassword, diff --git a/apps/client/src/features/user/services/user-service.ts b/apps/client/src/features/user/services/user-service.ts index 78995655..ddd842d9 100644 --- a/apps/client/src/features/user/services/user-service.ts +++ b/apps/client/src/features/user/services/user-service.ts @@ -1,6 +1,5 @@ import api from "@/lib/api-client"; import { ICurrentUser, IUser } from "@/features/user/types/user.types"; -import { IAttachment } from "@/lib/types.ts"; export async function getMyInfo(): Promise { const req = await api.post("/users/me"); @@ -22,6 +21,5 @@ export async function uploadAvatar(file: File): Promise { "Content-Type": "multipart/form-data", }, }); - console.log(req); return req; } diff --git a/apps/client/src/pages/auth/invite-signup.tsx b/apps/client/src/pages/auth/invite-signup.tsx new file mode 100644 index 00000000..a7c4cc9a --- /dev/null +++ b/apps/client/src/pages/auth/invite-signup.tsx @@ -0,0 +1,13 @@ +import { Helmet } from "react-helmet-async"; +import { InviteSignUpForm } from "@/features/auth/components/invite-sign-up-form.tsx"; + +export default function InviteSignup() { + return ( + <> + + Invitation signup + + + + ); +} diff --git a/apps/client/src/pages/auth/layout.tsx b/apps/client/src/pages/auth/layout.tsx deleted file mode 100644 index bf542f1c..00000000 --- a/apps/client/src/pages/auth/layout.tsx +++ /dev/null @@ -1,7 +0,0 @@ -interface AuthLayoutProps { - children: React.ReactNode -} - -export default function AuthLayout({ children }: AuthLayoutProps) { - return
{children}
-} diff --git a/apps/client/src/pages/auth/signup.tsx b/apps/client/src/pages/auth/setup-workspace.tsx similarity index 68% rename from apps/client/src/pages/auth/signup.tsx rename to apps/client/src/pages/auth/setup-workspace.tsx index 3604f028..f0203e0d 100644 --- a/apps/client/src/pages/auth/signup.tsx +++ b/apps/client/src/pages/auth/setup-workspace.tsx @@ -1,10 +1,10 @@ -import { SignUpForm } from "@/features/auth/components/sign-up-form"; import { useWorkspacePublicDataQuery } from "@/features/workspace/queries/workspace-query.ts"; import { SetupWorkspaceForm } from "@/features/auth/components/setup-workspace-form.tsx"; import { Helmet } from "react-helmet-async"; -import React from "react"; +import React, { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; -export default function SignUpPage() { +export default function SetupWorkspace() { const { data: workspace, isLoading, @@ -12,6 +12,14 @@ export default function SignUpPage() { error, } = useWorkspacePublicDataQuery(); + const navigate = useNavigate(); + + useEffect(() => { + if (!isLoading && !isError && workspace) { + navigate("/"); + } + }, [isLoading, isError, workspace]); + if (isLoading) { return
; } @@ -31,12 +39,5 @@ export default function SignUpPage() { ); } - return workspace ? ( - <> - - Signup - - - - ) : null; + return null; } diff --git a/apps/server/src/core/auth/auth.controller.ts b/apps/server/src/core/auth/auth.controller.ts index 91aea653..d93a32dc 100644 --- a/apps/server/src/core/auth/auth.controller.ts +++ b/apps/server/src/core/auth/auth.controller.ts @@ -33,11 +33,12 @@ export class AuthController { return this.authService.login(loginInput, req.raw.workspaceId); } - @HttpCode(HttpStatus.OK) + /* @HttpCode(HttpStatus.OK) @Post('register') async register(@Req() req, @Body() createUserDto: CreateUserDto) { return this.authService.register(createUserDto, req.raw.workspaceId); } + */ @UseGuards(SetupGuard) @HttpCode(HttpStatus.OK) diff --git a/apps/server/src/core/auth/services/signup.service.ts b/apps/server/src/core/auth/services/signup.service.ts index 35365067..30eaf445 100644 --- a/apps/server/src/core/auth/services/signup.service.ts +++ b/apps/server/src/core/auth/services/signup.service.ts @@ -78,7 +78,11 @@ export class SignupService { // create user const user = await this.userRepo.insertUser( - { ...createAdminUserDto, role: UserRole.OWNER }, + { + ...createAdminUserDto, + role: UserRole.OWNER, + emailVerifiedAt: new Date(), + }, trx, ); diff --git a/apps/server/src/core/workspace/services/workspace-invitation.service.ts b/apps/server/src/core/workspace/services/workspace-invitation.service.ts index 7587d090..c293bb1a 100644 --- a/apps/server/src/core/workspace/services/workspace-invitation.service.ts +++ b/apps/server/src/core/workspace/services/workspace-invitation.service.ts @@ -21,7 +21,7 @@ import { GroupUserRepo } from '@docmost/db/repos/group/group-user.repo'; import InvitationAcceptedEmail from '@docmost/transactional/emails/invitation-accepted-email'; import { EnvironmentService } from '../../../integrations/environment/environment.service'; import { TokenService } from '../../auth/services/token.service'; -import { nanoIdGen } from '../../../common/helpers/nanoid.utils'; +import { nanoIdGen } from '../../../common/helpers'; import { PaginationOptions } from '@docmost/db/pagination/pagination-options'; import { executeWithPagination } from '@docmost/db/pagination/pagination'; import { TokensDto } from '../../auth/dto/tokens.dto'; @@ -179,6 +179,7 @@ export class WorkspaceInvitationService { role: invitation.role, lastLoginAt: new Date(), invitedById: invitation.invitedById, + emailVerifiedAt: new Date(), }) .returningAll() .executeTakeFirst(); diff --git a/apps/server/src/integrations/mail/drivers/log.driver.ts b/apps/server/src/integrations/mail/drivers/log.driver.ts index 8a3a9aa8..567190aa 100644 --- a/apps/server/src/integrations/mail/drivers/log.driver.ts +++ b/apps/server/src/integrations/mail/drivers/log.driver.ts @@ -2,17 +2,22 @@ import { MailDriver } from './interfaces/mail-driver.interface'; import { Logger } from '@nestjs/common'; import { MailMessage } from '../interfaces/mail.message'; import { mailLogName } from '../mail.utils'; +import * as process from 'node:process'; export class LogDriver implements MailDriver { private readonly logger = new Logger(mailLogName(LogDriver.name)); async sendMail(message: MailMessage): Promise { + if (process.env.NODE_ENV === 'production') { + return; + } + const mailLog = { to: message.to, subject: message.subject, text: message.text, }; - this.logger.log(`Logged mail: ${JSON.stringify(mailLog)}`); + this.logger.log(`Logged email: ${JSON.stringify(mailLog)}`); } }