Skip to content

Commit 1139bbe

Browse files
swfavorites
1 parent ba76b34 commit 1139bbe

33 files changed

+355
-28440
lines changed

6-compose/backend/.dockerignore

Lines changed: 0 additions & 3 deletions
This file was deleted.

6-compose/backend/app.js

Lines changed: 71 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,91 @@
1-
const fs = require('fs');
2-
const path = require('path');
3-
41
const express = require('express');
5-
const mongoose = require('mongoose');
62
const bodyParser = require('body-parser');
7-
const morgan = require('morgan');
8-
9-
const Goal = require('./models/goal');
3+
const mysql = require('mysql');
4+
const axios = require('axios');
5+
const cors = require('cors');
106

117
const app = express();
12-
13-
const accessLogStream = fs.createWriteStream(
14-
path.join(__dirname, 'logs', 'access.log'),
15-
{ flags: 'a' }
16-
);
17-
18-
app.use(morgan('combined', { stream: accessLogStream }));
19-
8+
const port = 3000;
9+
app.use(cors());
2010
app.use(bodyParser.json());
2111

22-
app.use((req, res, next) => {
23-
res.setHeader('Access-Control-Allow-Origin', '*');
24-
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
25-
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
26-
next();
12+
// MySQL connection setup
13+
const connection = mysql.createConnection({
14+
host: 'mysql-server', //ovde staviti naziv mysql servera u mrezi
15+
user: 'novi',
16+
password: 'novi',
17+
database: 'swfavorites'
2718
});
2819

29-
app.get('/goals', async (req, res) => {
30-
console.log('TRYING TO FETCH GOALS');
31-
try {
32-
const goals = await Goal.find();
33-
res.status(200).json({
34-
goals: goals.map((goal) => ({
35-
id: goal.id,
36-
text: goal.text,
37-
})),
20+
connection.connect(err => {
21+
if (err) throw err;
22+
console.log('Connected to the database.');
23+
24+
const createTableSql = `
25+
CREATE TABLE IF NOT EXISTS favorites (
26+
id INT AUTO_INCREMENT PRIMARY KEY,
27+
name VARCHAR(100) NOT NULL,
28+
type VARCHAR(100) NOT NULL,
29+
url VARCHAR(100) NOT NULL
30+
)
31+
`;
32+
33+
connection.query(createTableSql, (err, result) => {
34+
if (err) throw err;
35+
console.log("Table 'favorites' is ready.");
3836
});
39-
console.log('FETCHED GOALS');
40-
} catch (err) {
41-
console.error('ERROR FETCHING GOALS');
42-
console.error(err.message);
43-
res.status(500).json({ message: 'Failed to load goals.' });
44-
}
45-
});
37+
});
4638

47-
app.post('/goals', async (req, res) => {
48-
console.log('TRYING TO STORE GOAL');
49-
const goalText = req.body.text;
5039

51-
if (!goalText || goalText.trim().length === 0) {
52-
console.log('INVALID INPUT - NO TEXT');
53-
return res.status(422).json({ message: 'Invalid goal text.' });
54-
}
40+
// Endpoint to get all favorites
41+
app.get('/favorites', (req, res) => {
42+
connection.query('SELECT * FROM favorites', (error, results) => {
43+
if (error) throw error;
44+
res.json(results);
45+
});
46+
});
5547

56-
const goal = new Goal({
57-
text: goalText,
48+
// Endpoint to add a favorite
49+
app.post('/favorites', (req, res) => {
50+
const { name, type, url } = req.body;
51+
const query = 'INSERT INTO favorites (name, type, url) VALUES (?, ?, ?)';
52+
connection.query(query, [name, type, url], (error, results) => {
53+
if (error) throw error;
54+
res.status(201).send(`Favorite added with ID: ${results.insertId}`);
5855
});
56+
});
5957

60-
try {
61-
await goal.save();
62-
res
63-
.status(201)
64-
.json({ message: 'Goal saved', goal: { id: goal.id, text: goalText } });
65-
console.log('STORED NEW GOAL');
66-
} catch (err) {
67-
console.error('ERROR FETCHING GOALS');
68-
console.error(err.message);
69-
res.status(500).json({ message: 'Failed to save goal.' });
70-
}
58+
// Endpoint to delete a favorite
59+
app.delete('/favorites/:id', (req, res) => {
60+
const { id } = req.params;
61+
const query = 'DELETE FROM favorites WHERE id = ?';
62+
connection.query(query, [id], (error, results) => {
63+
if (error) throw error;
64+
res.send(`Favorite with ID ${id} deleted.`);
65+
});
7166
});
7267

73-
app.delete('/goals/:id', async (req, res) => {
74-
console.log('TRYING TO DELETE GOAL');
68+
// Endpoint to update a favorite
69+
app.put('/favorites/:id', (req, res) => {
70+
const { id } = req.params;
71+
const { name, type, url } = req.body;
72+
const query = 'UPDATE favorites SET name = ?, type = ?, url = ? WHERE id = ?';
73+
connection.query(query, [name, type, url, id], (error, results) => {
74+
if (error) throw error;
75+
res.send(`Favorite with ID ${id} updated.`);
76+
});
77+
});
78+
79+
// Endpoint to fetch episodes from an external API
80+
app.get('/episodes', async (req, res) => {
7581
try {
76-
await Goal.deleteOne({ _id: req.params.id });
77-
res.status(200).json({ message: 'Deleted goal!' });
78-
console.log('DELETED GOAL');
79-
} catch (err) {
80-
console.error('ERROR FETCHING GOALS');
81-
console.error(err.message);
82-
res.status(500).json({ message: 'Failed to delete goal.' });
82+
const response = await axios.get('https://rickandmortyapi.com/api/episode');
83+
res.status(200).json({ episodes: response.data });
84+
} catch (error) {
85+
res.status(500).json({ message: 'Something went wrong.' });
8386
}
8487
});
8588

86-
mongoose.connect(
87-
`mongodb://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@mongodb:27017/course-goals?authSource=admin`,
88-
{
89-
useNewUrlParser: true,
90-
useUnifiedTopology: true,
91-
},
92-
(err) => {
93-
if (err) {
94-
console.error('FAILED TO CONNECT TO MONGODB');
95-
console.error(err);
96-
} else {
97-
console.log('CONNECTED TO MONGODB!!');
98-
app.listen(80);
99-
}
100-
}
101-
);
89+
app.listen(port, () => {
90+
console.log(`Server running on port ${port}`);
91+
});

6-compose/backend/dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM node
2+
WORKDIR /app
3+
COPY package.json .
4+
RUN npm install
5+
COPY . .
6+
EXPOSE 3000
7+
CMD ["node", "app.js"]

6-compose/backend/logs/access.log

Lines changed: 0 additions & 28 deletions
This file was deleted.

6-compose/backend/models/goal.js

Lines changed: 0 additions & 11 deletions
This file was deleted.

6-compose/backend/package.json

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
{
2-
"name": "backend",
2+
"name": "radi",
33
"version": "1.0.0",
44
"description": "",
5-
"main": "index.js",
5+
"main": "app.js",
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1",
88
"start": "nodemon app.js"
99
},
10-
"author": "Aleksa Miletic",
10+
"keywords": [],
11+
"author": "",
1112
"license": "ISC",
1213
"dependencies": {
13-
"body-parser": "^1.19.0",
14-
"express": "^4.17.1",
15-
"mongoose": "^5.10.3",
16-
"morgan": "^1.10.0"
14+
"body-parser": "^1.20.2",
15+
"express": "^4.19.2",
16+
"mysql": "^2.18.1",
17+
"axios": "^1.6.8",
18+
"cors": "^2.8.5"
1719
},
1820
"devDependencies": {
19-
"nodemon": "^2.0.4"
21+
"nodemon": "^3.1.0"
2022
}
2123
}

6-compose/db/init.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
SET GLOBAL log_error_verbosity = 1;
2+
ALTER USER 'novi'@'%' IDENTIFIED WITH mysql_native_password BY 'novi';
3+
GRANT ALL PRIVILEGES ON swfavorites.* TO 'novi'@'%';
4+
FLUSH PRIVILEGES;
5+
EXIT;

6-compose/db/my.cnf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[mysqld]
2+
log_error_verbosity = 1 # Set verbosity to 1 to log errors only (2 is default, 3 includes more info and warnings).

6-compose/frontend/.DS_Store

-6 KB
Binary file not shown.

6-compose/frontend/.dockerignore

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)