Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

James C PR #151

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .env.example

This file was deleted.

87 changes: 79 additions & 8 deletions src/client/App.jsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { useEffect, useState } from 'react';
import './App.css';
import MovieForm from './components/MovieForm';
import UserForm from './components/UserForm';
import { useEffect, useState } from "react";
import "./App.css";
import MovieForm from "./components/MovieForm";
import UserForm from "./components/UserForm";
// import { register, login } from "../server/controllers/user";

const port = import.meta.env.VITE_PORT;
const apiUrl = `http://localhost:${port}`;
Expand All @@ -11,8 +12,8 @@ function App() {

useEffect(() => {
fetch(`${apiUrl}/movie`)
.then(res => res.json())
.then(res => setMovies(res.data));
.then((res) => res.json())
.then((res) => setMovies(res.data));
}, []);

/**
Expand All @@ -34,16 +35,86 @@ function App() {
* */

const handleRegister = async ({ username, password }) => {
try {
if (!username || !password) {
throw new Error("Username and password required");
}
const response = await fetch("http://localhost:4060/user/register", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username, password }),
});
if (!response.ok) {
throw new Error("Registration failed!");
}
const createdUser = await response.json();

return { success: true, data: createdUser };
} catch (error) {
return { success: false, error: error.message };
}
};

const handleLogin = async ({ username, password }) => {
try {
if (!username || !password) {
throw new Error("Username and password required");
}
const response = await fetch("http://localhost:4060/user/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username, password }),
});
const responseData = await response.json();

if (!response.ok) {
throw new Error(responseData.error || "Login failed");
}

const token = responseData.data;
localStorage.setItem("authToken", token);
console.log(localStorage.getItem("authToken"));

return { success: true, data: "Logged in!" };
} catch (error) {
return { success: false, error: error.message };
}
};

const handleCreateMovie = async ({ title, description, runtimeMins }) => {
try {
const token = localStorage.getItem("authToken");
if (!token) {
throw new Error("Please log in!");
}

const response = await fetch("http://localhost:4060/movie/", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify({ title, description, runtimeMins }),
});

}
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || "Failed to create movie.");
}

const { data: createdMovie } = await response.json(); // Extract the created movie from the response
setMovies((prevMovies) => [...prevMovies, createdMovie]);

return { success: true, data: response };
} catch (error) {
console.log(error);
return { success: false, error: error.message };
}
};

return (
<div className="App">
Expand All @@ -58,7 +129,7 @@ function App() {

<h1>Movie list</h1>
<ul>
{movies.map(movie => {
{movies.map((movie) => {
return (
<li key={movie.id}>
<h3>{movie.title}</h3>
Expand Down
51 changes: 30 additions & 21 deletions src/server/controllers/movie.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,40 @@
import jwt from 'jsonwebtoken';
import { PrismaClient } from '@prisma/client'
import jwt from "jsonwebtoken";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();

const jwtSecret = 'mysecret';
const jwtSecret = "mysecret";

const getAllMovies = async (req, res) => {
const movies = await prisma.movie.findMany();
const movies = await prisma.movie.findMany();

res.json({ data: movies });
res.json({ data: movies });
};

const createMovie = async (req, res) => {
const { title, description, runtimeMins } = req.body;

try {
const token = null;
// todo verify the token
} catch (e) {
return res.status(401).json({ error: 'Invalid token provided.' })
}

const createdMovie = null;

res.json({ data: createdMovie });
const { title, description, runtimeMins } = req.body;

const auth = req.headers.authorization;
const token = auth.split(" ")[1];

if (!auth || !token) {
return res.status(401).json({ error: "Not authorised" });
}

try {
const decodedToken = jwt.verify(token, jwtSecret);

const createdMovie = await prisma.movie.create({
data: {
title: title,
description: description,
runtimeMins: runtimeMins,
},
});

res.status(201).json({ data: createdMovie });
} catch (e) {
return res.status(401).json({ error: "Token is invalid" });
}
};

export {
getAllMovies,
createMovie
};
export { getAllMovies, createMovie };
51 changes: 29 additions & 22 deletions src/server/controllers/user.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,46 @@
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import { PrismaClient } from '@prisma/client'
import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();

const jwtSecret = 'mysecret';
const jwtSecret = "mysecret";

const register = async (req, res) => {
const { username, password } = req.body;
const { username, password } = req.body;
const hashedPassword = await bcrypt.hash(password, 10);

const createdUser = null;
const createdUser = await prisma.user.create({
data: {
username: username,
password: hashedPassword,
},
});

res.json({ data: createdUser });
res.json({ data: createdUser });
};

const login = async (req, res) => {
const { username, password } = req.body;
const { username, password } = req.body;

const foundUser = null;
const foundUser = await prisma.user.findUnique({
where: {
username: username,
},
});

if (!foundUser) {
return res.status(401).json({ error: 'Invalid username or password.' });
}
if (!foundUser) {
return res.status(401).json({ error: "Invalid username or password." });
}

const passwordsMatch = false;
const passwordsMatch = await bcrypt.compare(password, foundUser.password);

if (!passwordsMatch) {
return res.status(401).json({ error: 'Invalid username or password.' });
}
if (!passwordsMatch) {
return res.status(401).json({ error: "Invalid username or password." });
}

const token = null;
const token = jwt.sign({ username: username }, jwtSecret);

res.json({ data: token });
res.json({ data: token });
};

export {
register,
login
};
export { register, login };