-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
133 lines (113 loc) · 3.3 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* eslint-disable no-unused-vars */
require("./instrument.js");
require("dotenv").config();
const Sentry = require("@sentry/node");
const express = require("express");
const app = express();
const Sequelize = require("sequelize");
const bodyParser = require("body-parser");
const path = require("path");
app.set("views", path.join(__dirname, "views"));
const passport = require("passport");
const connectEnsureLogin = require("connect-ensure-login");
const session = require("express-session");
const flash = require("connect-flash");
const LocalStrategy = require("passport-local");
const bcrypt = require("bcryptjs");
const saltRounds = 10;
const authRoutes = require("./routes/auth");
const studentRoutes = require("./routes/student");
const educatorRoutes = require("./routes/educator");
const { getAIResponse } = require("./routes/geminiai");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//translations
const i18n = require("i18n");
// eslint-disable-next-line no-undef
app.use(express.static(path.join(__dirname, "public")));
app.use(
session({
secret: "my-super-secret-key-21728172615261562",
cookie: {
maxAge: 24 * 60 * 60 * 1000,
},
}),
);
app.use(flash());
app.use(function (request, response, next) {
response.locals.messages = request.flash();
next();
});
// i18n configuration
i18n.configure({
locales: ["en", "fr"], // Add your supported locales
defaultLocale: "en",
cookie: "lang",
queryParameter: "lang", // Allows switching languages via query parameter
directory: __dirname + "/locale", // Path to your translation files
autoReload: true,
updateFiles: false,
syncFiles: true,
parser: JSON,
});
// Middleware to set the locale based on the query parameter
app.use(i18n.init);
app.use(passport.initialize());
app.use(passport.session());
passport.use(
new LocalStrategy(
{
usernameField: "email",
passwordField: "pwd",
},
(username, password, done) => {
User.findOne({ where: { email: username } })
.then(async (user) => {
if (!user) {
return done(null, false, { message: "Invalid email" });
}
const result = await bcrypt.compare(password, user.password);
if (result) {
return done(null, user);
} else {
return done(null, false, { message: "Invalid password" });
}
})
.catch((error) => {
return done(error);
});
},
),
);
passport.serializeUser((user, done) => {
done(null, user.id); // Serialize user ID and role
});
passport.deserializeUser((id, done) => {
User.findByPk(id)
.then((user) => {
done(null, user);
})
.catch((error) => {
done(error, null);
});
});
const { User } = require("./models");
app.set("view engine", "ejs");
Sentry.setupExpressErrorHandler(app);
app.use(function onError(err, req, res, next) {
res.statusCode = 500;
res.end(res.sentry + "\n");
});
app.use(authRoutes);
app.use(studentRoutes);
app.use(educatorRoutes);
app.post("/ask-ai", async (req, res) => {
const { query } = req.body;
try {
const answer = await getAIResponse(query); // Call the AI service to get a response
res.json({ answer });
} catch (error) {
res.status(500).json({ error: "Error with AI response" });
}
});
module.exports = app;