90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
import express from 'express';
|
|
import session from 'express-session';
|
|
import passport from 'passport';
|
|
import './auth/google.js';
|
|
import uploadRoutes from './routes/upload.js';
|
|
import dotenv from 'dotenv';
|
|
import path from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
import pool from './db.js';
|
|
|
|
const initDB = async () => {
|
|
await pool.query(`
|
|
CREATE TABLE IF NOT EXISTS images (
|
|
id SERIAL PRIMARY KEY,
|
|
filename TEXT NOT NULL,
|
|
title TEXT NOT NULL,
|
|
description TEXT NOT NULL,
|
|
uploader TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
`);
|
|
await pool.query(`
|
|
CREATE TABLE IF NOT EXISTS comments (
|
|
id SERIAL PRIMARY KEY,
|
|
image_id INTEGER REFERENCES images(id) ON DELETE CASCADE,
|
|
author TEXT,
|
|
content TEXT NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
`);
|
|
};
|
|
initDB();
|
|
|
|
dotenv.config();
|
|
|
|
const app = express();
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
app.use(session({ secret: "urlaubsgeheimnis", resave: false, saveUninitialized: true }));
|
|
app.use(passport.initialize());
|
|
app.use(passport.session());
|
|
|
|
app.set('view engine', 'ejs');
|
|
app.set('views', path.join(__dirname, 'views'));
|
|
|
|
function isLoggedIn(req, res, next) {
|
|
req.user ? next() : res.redirect('/');
|
|
}
|
|
|
|
app.get('/', async (req, res) => {
|
|
const result = await pool.query('SELECT * FROM images ORDER BY created_at DESC');
|
|
const images = result.rows.map(img => ({
|
|
id: img.id,
|
|
title: img.title,
|
|
description: img.description,
|
|
path: `/uploads/${img.filename}`,
|
|
uploader: img.uploader || 'Unbekannt'
|
|
}));
|
|
|
|
res.render('index', { user: req.user, images });
|
|
});
|
|
|
|
app.get('/auth/google',
|
|
passport.authenticate('google', { scope: ['profile', 'email'] }));
|
|
|
|
app.get('/auth/google/callback',
|
|
passport.authenticate('google', { failureRedirect: '/' }),
|
|
(req, res) => {
|
|
res.redirect('/');
|
|
});
|
|
|
|
app.get('/logout', (req, res) => {
|
|
req.logout(() => {
|
|
res.redirect('/');
|
|
});
|
|
});
|
|
|
|
app.get('/protected', isLoggedIn, (req, res) => {
|
|
res.send(`Hallo ${req.user.displayName}, du bist eingeloggt!`);
|
|
});
|
|
|
|
app.use(express.urlencoded({ extended: true }));
|
|
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
|
|
app.use(uploadRoutes);
|
|
|
|
app.listen(5000, () => {
|
|
console.log("🚀 Server läuft auf http://localhost:5000");
|
|
});
|