Browse Source

HOTFIX

pull/13/head
astria 3 months ago
parent
commit
8342fd52d7
  1. 12
      backend/app/routes/user.route.js
  2. 2
      backend/app/utils/mail.js
  3. 90
      backend/logs/access.log
  4. 4
      docker-compose.yaml
  5. 4
      frontend/src/components/CreatorCard.jsx
  6. 33
      frontend/src/pages/Video.jsx

12
backend/app/routes/user.route.js

@ -32,25 +32,25 @@ import {Channel} from "../middlewares/channel.middleware.js";
const router = Router(); const router = Router();
// REGISTER A USER // REGISTER A USER+
router.post("/", [profileUpload.single("profile"), addLogger, UserRegister.email, UserRegister.username, UserRegister.password, validator, doEmailExists, doUsernameExists], register); router.post("/", [profileUpload.single("profile"), addLogger, UserRegister.email, UserRegister.username, UserRegister.password, validator, doEmailExists, doUsernameExists], register);
// LOGIN A USER // LOGIN A USER+
router.post("/login", [addLogger, UserLogin.username, UserLogin.password, validator], login) router.post("/login", [addLogger, UserLogin.username, UserLogin.password, validator], login)
// SEARCH BY USERNAME // SEARCH BY USERNAME
router.get("/search", [addLogger, isTokenValid, UserSearch.username, validator], searchByUsername); router.get("/search", [addLogger, isTokenValid, UserSearch.username, validator], searchByUsername);
// GET USER BY ID // GET USER BY ID+
router.get("/:id", [addLogger, isTokenValid, User.id, validator], getById) router.get("/:id", [addLogger, isTokenValid, User.id, validator], getById)
// GET USER BY USERNAME // GET USER BY USERNAME+
router.get("/username/:username", [addLogger, isTokenValid, UserRequest.username, validator], getByUsername); router.get("/username/:username", [addLogger, isTokenValid, UserRequest.username, validator], getByUsername);
// UPDATE USER // UPDATE USER+
router.put("/:id", [addLogger, isTokenValid, User.id, UserRegister.email, UserRegister.username, validator, doUserExists, isOwner], update); router.put("/:id", [addLogger, isTokenValid, User.id, UserRegister.email, UserRegister.username, validator, doUserExists, isOwner], update);
// DELETE USER // DELETE USER+
router.delete("/:id", [addLogger, isTokenValid, User.id, validator, doUserExists, isOwner], deleteUser); router.delete("/:id", [addLogger, isTokenValid, User.id, validator, doUserExists, isOwner], deleteUser);
// GET USER CHANNEL // GET USER CHANNEL

2
backend/app/utils/mail.js

@ -7,7 +7,7 @@ function getTransporter() {
secure: false, secure: false,
auth: { auth: {
user: process.env.GMAIL_USER, user: process.env.GMAIL_USER,
pass: "yuuu kvoi ytrf blla", pass: process.env.GMAIL_PASSWORD,
}, },
}); });
}; };

90
backend/logs/access.log

@ -12072,3 +12072,93 @@
[2025-09-05 17:57:44.224] [undefined] POST(/:id): user not the owner of the playlist with id 1 with status 403 [2025-09-05 17:57:44.224] [undefined] POST(/:id): user not the owner of the playlist with id 1 with status 403
[2025-09-05 17:58:14.088] [undefined] POST(/:id): Video added to playlist with id 2 with status 200 [2025-09-05 17:58:14.088] [undefined] POST(/:id): Video added to playlist with id 2 with status 200
[2025-09-05 17:58:21.531] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 [2025-09-05 17:58:21.531] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200
[2025-09-06 10:11:19.116] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200
[2025-09-06 10:11:56.023] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200
[2025-09-06 10:12:16.248] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200
[2025-09-06 10:12:23.630] [undefined] GET(/:id): failed due to invalid values with status 400
[2025-09-06 10:12:35.862] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200
[2025-09-06 10:13:32.803] [undefined] GET(/:id): try to get channel with id 1
[2025-09-06 10:13:32.809] [undefined] GET(/:id): Successfully get channel with id 1 with status 200
[2025-09-06 10:13:32.824] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1
[2025-09-06 10:13:32.829] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200
[2025-09-06 10:13:58.268] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1
[2025-09-06 10:13:58.276] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200
[2025-09-06 10:14:41.764] [undefined] GET(/:id): try to get channel with id 1
[2025-09-06 10:14:41.775] [undefined] GET(/:id): Successfully get channel with id 1 with status 200
[2025-09-06 10:14:41.789] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1
[2025-09-06 10:14:41.794] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200
[2025-09-06 10:14:42.428] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200
[2025-09-06 10:14:42.437] [undefined] GET(/:id): try to get video 1
[2025-09-06 10:14:42.447] [undefined] GET(/:id): successfully get video 1 with status 200
[2025-09-06 10:14:42.457] [undefined] GET(/:id/similar): try to get similar videos for video 1
[2025-09-06 10:14:42.464] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200
[2025-09-06 10:14:42.479] [undefined] GET(/:id/views): try to add views for video 1
[2025-09-06 10:14:42.484] [undefined] GET(/:id/views): successfully added views for video 1 with status 200
[2025-09-06 10:14:49.450] [undefined] GET(/:id): try to get video 1
[2025-09-06 10:14:49.454] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200
[2025-09-06 10:14:49.462] [undefined] GET(/:id): successfully get video 1 with status 200
[2025-09-06 10:14:49.473] [undefined] GET(/:id/similar): try to get similar videos for video 1
[2025-09-06 10:14:49.480] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200
[2025-09-06 10:14:49.529] [undefined] GET(/:id/views): try to add views for video 1
[2025-09-06 10:14:49.536] [undefined] GET(/:id/views): successfully added views for video 1 with status 200
[2025-09-06 10:14:51.048] [undefined] GET(/:id): try to get channel with id 1
[2025-09-06 10:14:51.054] [undefined] GET(/:id): Successfully get channel with id 1 with status 200
[2025-09-06 10:14:51.065] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1
[2025-09-06 10:14:51.071] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200
[2025-09-06 10:15:00.735] [undefined] GET(/:id): try to get channel with id 1
[2025-09-06 10:15:00.741] [undefined] GET(/:id): Successfully get channel with id 1 with status 200
[2025-09-06 10:15:00.754] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1
[2025-09-06 10:15:00.759] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200
[2025-09-06 10:15:01.676] [undefined] GET(/:id): try to get video 1
[2025-09-06 10:15:01.681] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200
[2025-09-06 10:15:01.690] [undefined] GET(/:id): successfully get video 1 with status 200
[2025-09-06 10:15:01.700] [undefined] GET(/:id/similar): try to get similar videos for video 1
[2025-09-06 10:15:01.706] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200
[2025-09-06 10:15:01.723] [undefined] GET(/:id/views): try to add views for video 1
[2025-09-06 10:15:01.731] [undefined] GET(/:id/views): successfully added views for video 1 with status 200
[2025-09-06 10:15:54.639] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200
[2025-09-06 10:15:54.651] [undefined] GET(/:id): try to get video 1
[2025-09-06 10:15:54.658] [undefined] GET(/:id): successfully get video 1 with status 200
[2025-09-06 10:15:54.669] [undefined] GET(/:id/similar): try to get similar videos for video 1
[2025-09-06 10:15:54.676] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200
[2025-09-06 10:15:54.696] [undefined] GET(/:id/views): try to add views for video 1
[2025-09-06 10:15:54.704] [undefined] GET(/:id/views): successfully added views for video 1 with status 200
[2025-09-06 10:15:57.359] [undefined] GET(/:id): try to get channel with id 1
[2025-09-06 10:15:57.365] [undefined] GET(/:id): Successfully get channel with id 1 with status 200
[2025-09-06 10:15:57.377] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1
[2025-09-06 10:15:57.382] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200
[2025-09-06 10:16:01.637] [undefined] GET(/:id): try to get video 1
[2025-09-06 10:16:01.642] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200
[2025-09-06 10:16:01.649] [undefined] GET(/:id): successfully get video 1 with status 200
[2025-09-06 10:16:01.658] [undefined] GET(/:id/similar): try to get similar videos for video 1
[2025-09-06 10:16:01.666] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200
[2025-09-06 10:16:01.710] [undefined] GET(/:id/views): try to add views for video 1
[2025-09-06 10:16:01.716] [undefined] GET(/:id/views): successfully added views for video 1 with status 200
[2025-09-06 10:16:04.193] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200
[2025-09-06 10:16:13.098] [undefined] GET(/:id): try to get channel with id 2
[2025-09-06 10:16:13.154] [undefined] GET(/:id): Successfully get channel with id 2 with status 200
[2025-09-06 10:16:13.165] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 2
[2025-09-06 10:16:13.170] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 2 with status 200
[2025-09-06 10:19:06.785] [undefined] GET(/:id): try to get channel with id 2
[2025-09-06 10:19:06.798] [undefined] GET(/:id): Successfully get channel with id 2 with status 200
[2025-09-06 10:19:06.814] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 2
[2025-09-06 10:19:06.819] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 2 with status 200
[2025-09-06 10:19:15.009] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200
[2025-09-06 10:23:43.105] [undefined] GET(/:id/channel): try to retrieve channel of user 1
[2025-09-06 10:23:43.111] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200
[2025-09-06 10:23:43.117] [undefined] GET(/:id/history): try to retrieve history of user 1
[2025-09-06 10:23:43.124] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200
[2025-09-06 10:23:43.129] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200
[2025-09-06 10:23:44.349] [undefined] GET(/:id): try to get channel with id 1
[2025-09-06 10:23:44.354] [undefined] GET(/:id/stats): try to get stats
[2025-09-06 10:23:44.359] [undefined] GET(/:id/stats): Successfully get stats with status 200
[2025-09-06 10:23:44.365] [undefined] GET(/:id): Successfully get channel with id 1 with status 200
[2025-09-06 10:23:47.007] [undefined] GET(/:id/history): try to retrieve history of user 1
[2025-09-06 10:23:47.013] [undefined] GET(/:id/channel): try to retrieve channel of user 1
[2025-09-06 10:23:47.066] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200
[2025-09-06 10:23:47.070] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200
[2025-09-06 10:23:47.077] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200
[2025-09-06 10:23:54.346] [undefined] GET(/:id): try to get channel with id 2
[2025-09-06 10:23:54.352] [undefined] GET(/:id): Successfully get channel with id 2 with status 200
[2025-09-06 10:23:54.364] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 2
[2025-09-06 10:23:54.370] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 2 with status 200

4
docker-compose.yaml

@ -23,7 +23,7 @@ services:
FRONTEND_URL: ${FRONTEND_URL} FRONTEND_URL: ${FRONTEND_URL}
volumes: volumes:
- ./backend/logs:/var/log/freetube - ./backend/logs:/var/log/freetube
- ./backend:/app - upload:/app/backend/app/uploads
depends_on: depends_on:
db: db:
condition: service_healthy condition: service_healthy
@ -61,3 +61,5 @@ services:
volumes: volumes:
db_data: db_data:
driver: local driver: local
upload:
driver: local

4
frontend/src/components/CreatorCard.jsx

@ -2,9 +2,11 @@
export default function CreatorCard({ creator }) { export default function CreatorCard({ creator }) {
const handleClick = () => { const handleClick = () => {
window.location.href = `/manage-channel/${creator.id}`; window.location.href = `/channel/${creator.channel_id}`;
}; };
console.log(creator);
return ( return (
<div className="flex flex-col glassmorphism w-full p-6 cursor-pointer" onClick={handleClick}> <div className="flex flex-col glassmorphism w-full p-6 cursor-pointer" onClick={handleClick}>
<img <img

33
frontend/src/pages/Video.jsx

@ -1,20 +1,20 @@
import {useNavigate, useParams, useSearchParams} from "react-router-dom"; import { useNavigate, useParams, useSearchParams } from "react-router-dom";
import {useEffect, useState, useRef, useCallback} from "react"; import { useEffect, useState, useRef, useCallback } from "react";
import Navbar from "../components/Navbar.jsx"; import Navbar from "../components/Navbar.jsx";
import { useAuth } from "../contexts/AuthContext.jsx"; import { useAuth } from "../contexts/AuthContext.jsx";
import Comment from "../components/Comment.jsx"; import Comment from "../components/Comment.jsx";
import VideoCard from "../components/VideoCard.jsx"; import VideoCard from "../components/VideoCard.jsx";
import Tag from "../components/Tag.jsx"; import Tag from "../components/Tag.jsx";
import {addView, getSimilarVideos, getVideoById, toggleLike} from "../services/video.service.js"; import { addView, getSimilarVideos, getVideoById, toggleLike } from "../services/video.service.js";
import {subscribe} from "../services/channel.service.js"; import { subscribe } from "../services/channel.service.js";
import {addComment} from "../services/comment.service.js"; import { addComment } from "../services/comment.service.js";
import { getPlaylists } from "../services/user.service.js"; import { getPlaylists } from "../services/user.service.js";
import { addToPlaylist, getPlaylistById } from "../services/playlist.service.js"; import { addToPlaylist, getPlaylistById } from "../services/playlist.service.js";
import PlaylistVideoCard from "../components/PlaylistVideoCard.jsx"; import PlaylistVideoCard from "../components/PlaylistVideoCard.jsx";
export default function Video() { export default function Video() {
const {id} = useParams(); const { id } = useParams();
const { user, isAuthenticated } = useAuth(); const { user, isAuthenticated } = useAuth();
const videoRef = useRef(null); const videoRef = useRef(null);
const controllerRef = useRef(null); const controllerRef = useRef(null);
@ -372,8 +372,7 @@ export default function Video() {
{/* Video controls */} {/* Video controls */}
<div <div
className={`glassmorphism-rounded-md p-4 hidden lg:flex gap-4 items-center transition-opacity duration-300 ${ className={`glassmorphism-rounded-md p-4 hidden lg:flex gap-4 items-center transition-opacity duration-300 ${showControls ? 'opacity-100' : 'opacity-0'
showControls ? 'opacity-100' : 'opacity-0'
} }
${isFullscreen ? 'fixed bottom-8 left-1/2 transform -translate-x-1/2 opacity-100 z-[60] w-[70%] max-w-3xl' : 'absolute bottom-4 left-4 right-4'}`} ${isFullscreen ? 'fixed bottom-8 left-1/2 transform -translate-x-1/2 opacity-100 z-[60] w-[70%] max-w-3xl' : 'absolute bottom-4 left-4 right-4'}`}
ref={controllerRef} ref={controllerRef}
@ -387,7 +386,7 @@ export default function Video() {
}} }}
>-10</p> >-10</p>
<svg width="30" height="34" viewBox="0 0 30 34" fill="none" xmlns="http://www.w3.org/2000/svg" onClick={handlePlayPause}> <svg width="30" height="34" viewBox="0 0 30 34" fill="none" xmlns="http://www.w3.org/2000/svg" onClick={handlePlayPause}>
<path d="M28.5 14.4019C30.5 15.5566 30.5 18.4434 28.5 19.5981L4.5 33.4545C2.5 34.6092 2.14642e-06 33.1658 2.24736e-06 30.8564L3.45873e-06 3.14359C3.55968e-06 0.834193 2.5 -0.609184 4.5 0.545517L28.5 14.4019Z" fill="white"/> <path d="M28.5 14.4019C30.5 15.5566 30.5 18.4434 28.5 19.5981L4.5 33.4545C2.5 34.6092 2.14642e-06 33.1658 2.24736e-06 30.8564L3.45873e-06 3.14359C3.55968e-06 0.834193 2.5 -0.609184 4.5 0.545517L28.5 14.4019Z" fill="white" />
</svg> </svg>
<p <p
className="text-white" className="text-white"
@ -454,10 +453,18 @@ export default function Video() {
<img <img
src={video.creator?.profile_picture || "https://placehold.co/48"} src={video.creator?.profile_picture || "https://placehold.co/48"}
alt={video.creator?.name || "Creator"} alt={video.creator?.name || "Creator"}
className="w-12 h-12 rounded-full object-cover mr-3" className="w-12 h-12 rounded-full object-cover mr-3 cursor-pointer"
onClick={() => {
window.location.href = `/channel/${video.creator?.id}`;
}}
/> />
<div> <div>
<p className="text-white font-bold font-montserrat">{video.creator?.name}</p> <p
className="text-white font-bold font-montserrat cursor-pointer"
onClick={() => {
window.location.href = `/channel/${video.creator?.id}`;
}}
>{video.creator?.name}</p>
<p className="text-gray-300 text-sm">{video.creator?.subscribers || 0} abonnés</p> <p className="text-gray-300 text-sm">{video.creator?.subscribers || 0} abonnés</p>
</div> </div>
<button className="ml-14 bg-primary text-white font-montserrat font-bold px-4 py-2 rounded-md cursor-pointer" onClick={handleSubscribe} > <button className="ml-14 bg-primary text-white font-montserrat font-bold px-4 py-2 rounded-md cursor-pointer" onClick={handleSubscribe} >
@ -468,7 +475,7 @@ export default function Video() {
<div className="flex items-center lg:ml-auto mt-4 lg:mt-0"> <div className="flex items-center lg:ml-auto mt-4 lg:mt-0">
<button className="lg:ml-4 cursor-pointer" onClick={handleLike}> <button className="lg:ml-4 cursor-pointer" onClick={handleLike}>
<svg width="32" height="32" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg width="32" height="32" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 31.5H7.5V12H6C5.20435 12 4.44129 12.3161 3.87868 12.8787C3.31607 13.4413 3 14.2044 3 15V28.5C3 29.2956 3.31607 30.0587 3.87868 30.6213C4.44129 31.1839 5.20435 31.5 6 31.5ZM30 12H19.5L21.183 6.948C21.3332 6.49712 21.3741 6.01702 21.3024 5.54723C21.2306 5.07745 21.0483 4.63142 20.7705 4.24589C20.4926 3.86036 20.1271 3.54636 19.7041 3.32975C19.2811 3.11314 18.8127 3.00012 18.3375 3H18L10.5 11.157V31.5H27L32.868 18.606L33 18V15C33 14.2044 32.6839 13.4413 32.1213 12.8787C31.5587 12.3161 30.7956 12 30 12Z" fill="white"/> <path d="M6 31.5H7.5V12H6C5.20435 12 4.44129 12.3161 3.87868 12.8787C3.31607 13.4413 3 14.2044 3 15V28.5C3 29.2956 3.31607 30.0587 3.87868 30.6213C4.44129 31.1839 5.20435 31.5 6 31.5ZM30 12H19.5L21.183 6.948C21.3332 6.49712 21.3741 6.01702 21.3024 5.54723C21.2306 5.07745 21.0483 4.63142 20.7705 4.24589C20.4926 3.86036 20.1271 3.54636 19.7041 3.32975C19.2811 3.11314 18.8127 3.00012 18.3375 3H18L10.5 11.157V31.5H27L32.868 18.606L33 18V15C33 14.2044 32.6839 13.4413 32.1213 12.8787C31.5587 12.3161 30.7956 12 30 12Z" fill="white" />
</svg> </svg>
</button> </button>
<p className="font-montserrat text-white ml-2" >{video.likes}</p> <p className="font-montserrat text-white ml-2" >{video.likes}</p>
@ -601,7 +608,7 @@ export default function Video() {
} }
</div> </div>
</> </>
): ( ) : (
<p>Loading</p> <p>Loading</p>
)} )}

Loading…
Cancel
Save