Skip to content

Commit ac3319c

Browse files
committed
adding code at end of video two
1 parent 7bd8cab commit ac3319c

File tree

5 files changed

+171
-10
lines changed

5 files changed

+171
-10
lines changed

package-lock.json

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"author": "",
1212
"license": "ISC",
1313
"dependencies": {
14+
"cors": "^2.8.5",
1415
"express": "^4.18.2"
1516
},
1617
"devDependencies": {

server/characterService.js

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ const path = require('path');
33

44
const DATA_PATH = path.join(__dirname, './data/character.json');
55

6+
const INITIAL_DATA = {
7+
totalLevels: 0,
8+
classes: []
9+
};
10+
611
function readData() {
712
return new Promise((resolve, reject) => {
813
fs.readFile(DATA_PATH, (err, data) => {
@@ -21,6 +26,48 @@ function readData() {
2126
});
2227
}
2328

24-
module.exports = {
25-
readData
29+
function writeData(data) {
30+
return new Promise((resolve, reject) => {
31+
fs.writeFile(DATA_PATH, JSON.stringify(data, null, 2), err => {
32+
if (err) {
33+
reject(err);
34+
return;
35+
}
36+
37+
resolve('Write file successful');
38+
});
39+
});
2640
}
41+
42+
function checkDataFile() {
43+
return new Promise((resolve, reject) => {
44+
fs.access(DATA_PATH, fs.constants.F_OK, err => {
45+
if (err) {
46+
writeData(INITIAL_DATA)
47+
.then(() => resolve('Data file created'))
48+
.catch(reject);
49+
} else {
50+
fs.readFile(DATA_PATH, (readErr, data) => {
51+
if (readErr) {
52+
reject(readErr);
53+
return;
54+
}
55+
56+
if (data.length === 0) {
57+
writeData(INITIAL_DATA)
58+
.then(() => resolve('Data file created'))
59+
.catch(reject);
60+
} else {
61+
resolve('Data file is valid');
62+
}
63+
});
64+
}
65+
});
66+
});
67+
}
68+
69+
module.exports = {
70+
readData,
71+
writeData,
72+
checkDataFile
73+
};

server/data/character.json

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,53 @@
11
{
2-
"totalLevels": 2,
3-
"classes": [
4-
{ "level": 1, "class": "monk" },
5-
{ "level": 2, "class": "rogue" }
6-
]
7-
}
2+
"totalLevels": 12,
3+
"classes": [
4+
{
5+
"level": 1,
6+
"class": "fighter"
7+
},
8+
{
9+
"level": 2,
10+
"class": "fighter"
11+
},
12+
{
13+
"level": 3,
14+
"class": "ranger"
15+
},
16+
{
17+
"level": 4,
18+
"class": "ranger"
19+
},
20+
{
21+
"level": 5,
22+
"class": "ranger"
23+
},
24+
{
25+
"level": 6,
26+
"class": "ranger"
27+
},
28+
{
29+
"level": 7,
30+
"class": "ranger"
31+
},
32+
{
33+
"level": 8,
34+
"class": "rogue"
35+
},
36+
{
37+
"level": 9,
38+
"class": "rogue"
39+
},
40+
{
41+
"level": 10,
42+
"class": "rogue"
43+
},
44+
{
45+
"level": 11,
46+
"class": "rogue"
47+
},
48+
{
49+
"level": 12,
50+
"class": "ranger"
51+
}
52+
]
53+
}

server/server.js

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ app.use((req, res, next) => {
99
next();
1010
});
1111
app.use(express.static('public'));
12+
app.use(express.urlencoded({ extended: false }));
1213

1314
// GET http://localhost:3000/character
1415
app.get('/character', async (req, res) => {
1516
try {
17+
await characterService.checkDataFile();
1618
const characterData = await characterService.readData();
1719
res.json(characterData);
1820
} catch (error) {
@@ -21,8 +23,38 @@ app.get('/character', async (req, res) => {
2123
});
2224

2325
// POST http://localhost:3000/levelup
24-
app.post('/levelup', (req, res) => {
25-
res.send('Level up');
26+
// body urlencoded { selectedClass: string }
27+
app.post('/levelup', async (req, res) => {
28+
try {
29+
const selectedClass = req.body.selectedClass;
30+
31+
if (!selectedClass) {
32+
return res
33+
.status(400)
34+
.json({ message: 'Level up failed', error: 'Invalid input' });
35+
}
36+
37+
const characterData = await characterService.readData();
38+
39+
if (characterData.totalLevels >= 12) {
40+
return res
41+
.status(400)
42+
.json({ message: 'Level up failed', error: 'Level limit reached' });
43+
}
44+
45+
characterData.totalLevels += 1;
46+
47+
characterData.classes.push({
48+
level: characterData.totalLevels,
49+
class: selectedClass
50+
});
51+
52+
await characterService.writeData(characterData);
53+
54+
res.json({ message: 'Level up successful' });
55+
} catch (error) {
56+
res.status(500).json({ error: 'Oops my code sucks', message: error.message });
57+
}
2658
});
2759

2860
const PORT = process.env.PORT || 3000;

0 commit comments

Comments
 (0)