signup

PHOTO EMBED

Sun Jul 23 2023 14:22:28 GMT+0000 (Coordinated Universal Time)

Saved by @nelson22

src > dbConfig > dbConfig.ts

import mongoose from "mongoose";

export async function connect(){
    try {
        mongoose.connect(process.env.MONGO_URI!);
        const connection = mongoose.connection;
        connection.on('connected', () => {
            console.log("Mongo DB connected");
        });
        connection.on('error', () => {
            console.log("Mongo DB connection error");
            process.exit();
        })
    } catch (error) {
        console.log(error);
    }
}

----------------------------------------------------------------

src > models > userModel.js

import mongoose from "mongoose";

const userSchema = new mongoose.Schema({
    username:{
        type: String,
        required: [true, 'Please provide username'],
        unique: true
    },
    email: {
        type: String,
        required: [true, 'Please provide email'],
        unique: true
    },
    password:{
        type: String,
        required: [true, 'Please provide password']
    },
    isVerified:{
        type: Boolean,
        default: false
    },
    isAdmin:{
        type: Boolean,
        default: false
    },
    forgotPasswordToken: String,
    forgotPasswordTokenExpiry: Date,
    verifyToken: String,
    verifyTokenExpiry: Date
})

const Users = mongoose.models.users || mongoose.model('users', userSchema);

export default Users;

----------------------------------------------------------------

src > app > api > signup > route.ts

import {connect} from '@/dbConfig/dbConfig';
import Users from '@/models/userModel';
import { NextRequest, NextResponse } from 'next/server';
import bcryptjs from 'bcryptjs';

connect()

export async function POST(request: NextRequest){
    try {
        const reqBody = await request.json();
        const {username, email, password} = reqBody;

        // check if user email exists
        const user = await Users.findOne({email});  
        if(user){
            return NextResponse.json({error: 'User already exists'}, {status: 400});
        }

        // hash the password
        const salt = await bcryptjs.genSalt(10);
        const hashedPassword = await bcryptjs.hash(password, salt);

        // save user
        const newUser = new Users({
            username,
            email,
            password: hashedPassword
        })

        const savedUser = newUser.save();

        return NextResponse.json({
            message: 'User saved successfully',
            success: true,
            savedUser
        })

    } catch (error: any) {
        console.log(error);
        return NextResponse.json({error: error.message}, {status: 500});
    }
}

----------------------------------------------------------------

src > app > signup > page.tsx

"use client";
import React from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import axios from "axios";

export default function Signup() {
  const router = useRouter();
  const [user, setUser] = React.useState({
    username: "",
    email: "",
    password: "",
  });

  const signupUser = async () => {
    try {
        const response = axios.post('/api/users/signup', user);
        console.log(response);
        router.push('/login');
    } catch (error) {
        console.log(error);
    }
  };
  return (
    <div>
      <h1 className="page-hd">Sign up</h1>
      <form>
        <input type="text" placeholder="name" value={user.username} className="form-input" onChange={(e) => setUser({ ...user, username: e.target.value })} />
        <br />
        <input type="text" placeholder="email" value={user.email} className="form-input" onChange={(e) => setUser({ ...user, email: e.target.value })} />
        <br />
        <input type="password" placeholder="password" value={user.password} className="form-input" onChange={(e) => setUser({ ...user, password: e.target.value })}
        />
        <br />
        <input type="button" value="Submit" className="btn" onClick={signupUser} />
      </form>
      <Link className="link" href="/login">
        Back to login
      </Link>
    </div>
  );
}

content_copyCOPY