Browse Source

FIX video tag database relation

fix/clean
astria 5 months ago
parent
commit
58e6483811
  1. 18
      backend/app/controllers/recommendation.controller.js
  2. 21
      backend/app/controllers/video.controller.js
  3. 0
      backend/app/middlewares/recommendation.middleware.js
  4. 7
      backend/app/routes/redommendation.routes.js
  5. 1
      backend/app/routes/video.route.js
  6. 9
      backend/app/utils/database.js
  7. 21
      frontend/src/pages/Home.jsx

18
backend/app/controllers/recommendation.controller.js

@ -0,0 +1,18 @@
import {getClient} from "../utils/database.js";
export async function getRecommendations(req, res) {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
// GET MOST USED TOKEN
let client = await getClient();
let queryMostUsedToken = `SELECT * FROM tags `
} else {
}
}

21
backend/app/controllers/video.controller.js

@ -217,15 +217,26 @@ export async function addTags(req, res) {
logger.action("try to add tags to video " + videoId); logger.action("try to add tags to video " + videoId);
const client = await getClient(); const client = await getClient();
const tagInBaseQuery = `DELETE tags WHERE video = ${videoId}`;
client.query(tagInBaseQuery);
for (const tag of tags) { for (const tag of tags) {
const query = `INSERT INTO tags (video, tag) VALUES (${videoId}, '${tag}')`; const tagQuery = `SELECT * FROM tags WHERE name = '${tag}' AND video = ${videoId}`;
await client.query(query); const tagResult = await client.query(tagQuery);
} let id = null;
if (tagResult.rows.length === 0) {
const insertTagQuery = `INSERT INTO tags (name, video) VALUES ('${tag}') RETURNING id`;
const result = await client.query(insertTagQuery);
id = result.rows[0].id;
} else {
logger.write("Tag " + tag + " already exists for video " + videoId, 200);
id = tagResult.rows[0].id;
}
const insertVideoTagQuery = `INSERT INTO video_tags (video, tag) VALUES (${id}, ${videoId}) ON CONFLICT DO NOTHING`;
await client.query(insertVideoTagQuery);
}
logger.write("successfully added tags to video " + videoId, 200); logger.write("successfully added tags to video " + videoId, 200);
await client.end();
res.status(200).json({"message": "Successfully added tags to video"}); res.status(200).json({"message": "Successfully added tags to video"});
} }

0
backend/app/middlewares/recommendation.middleware.js

7
backend/app/routes/redommendation.routes.js

@ -0,0 +1,7 @@
import { Router } from 'express';
const router = Router();
router.get('/', [], getRecommendations);
export default router;

1
backend/app/routes/video.route.js

@ -52,4 +52,5 @@ router.get("/:id/like", [addLogger, isTokenValid, Video.id, validator, doVideoEx
// UPDATE TAGS // UPDATE TAGS
router.put("/:id/tags", [addLogger, isTokenValid, Video.id, Video.tags, validator, doVideoExistsParam, isOwner], addTags); router.put("/:id/tags", [addLogger, isTokenValid, Video.id, Video.tags, validator, doVideoExistsParam, isOwner], addTags);
export default router; export default router;

9
backend/app/utils/database.js

@ -89,11 +89,16 @@ export async function initDb() {
query = `CREATE TABLE IF NOT EXISTS tags( query = `CREATE TABLE IF NOT EXISTS tags(
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL
video INTEGER NOT NULL REFERENCES videos(id)
)`; )`;
await client.query(query); await client.query(query);
query = `CREATE TABLE IF NOT EXISTS video_tags (
video INTEGER NOT NULL REFERENCES videos(id),
tag INTEGER NOT NULL REFERENCES tags(id)
)`
await client.query(query);
} catch (e) { } catch (e) {
console.error("Error initializing database:", e); console.error("Error initializing database:", e);
} }

21
frontend/src/pages/Home.jsx

@ -1,9 +1,30 @@
import Navbar from '../components/Navbar.jsx'; import Navbar from '../components/Navbar.jsx';
import HeroImage from '../assets/img/hero.png'; import HeroImage from '../assets/img/hero.png';
import Recommendations from "../components/Recommendations.jsx"; import Recommendations from "../components/Recommendations.jsx";
import {useState} from "react";
export default function Home() { export default function Home() {
const [recommendations, setRecommendations] = useState([]);
const [loading, setLoading] = useState(true);
const [topCreators, setTopCreators] = useState([]);
const [trendingVideos, setTrendingVideos] = useState([]);
// Fetch recommendations, top creators, and trending videos
const fetchData = async () => {
try {
const response = await fetch('/api/home');
const data = await response.json();
setRecommendations(data.recommendations);
setTopCreators(data.topCreators);
setTrendingVideos(data.trendingVideos);
} catch (error) {
console.error('Error fetching data:', error);
} finally {
setLoading(false);
}
};
return ( return (
<div className="min-w-screen min-h-screen bg-linear-to-br from-left-gradient to-right-gradient"> <div className="min-w-screen min-h-screen bg-linear-to-br from-left-gradient to-right-gradient">
<Navbar isSearchPage={false} /> <Navbar isSearchPage={false} />

Loading…
Cancel
Save