-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
130 lines (122 loc) · 3.34 KB
/
Copy pathindex.js
File metadata and controls
130 lines (122 loc) · 3.34 KB
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
const express = require("express");
const cors = require("cors");
const helmet = require("helmet");
const morgan = require("morgan");
const bodyParser = require("body-parser");
const Joi = require("joi");
const data = {
details: require("./api/data/details.json"),
characters: require("./api/data/characters.json"),
episodes: require("./api/data/episodes.json"),
};
const corsOptions = {
origin: "*",
};
const responseHeaders = {
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json",
"Cross-Origin-Resource-Policy": "cross-origin",
};
const app = express();
app.use(cors(corsOptions));
app.use(helmet());
app.use(morgan("dev"));
app.use(bodyParser.json());
const port = process.env.PORT || 3000;
const schemas = {
characters: Joi.object().keys({
name: Joi.string().required(),
role: Joi.string().required(),
image: Joi.string().uri().required(),
social: Joi.object().keys({
twitter: Joi.string().uri(),
facebook: Joi.string().uri(),
instagram: Joi.string().uri(),
}),
}),
};
// GET Routes
// Get series details
app.get("/", (req, res) => {
res.set(responseHeaders);
res.send(data.details);
});
// Get all characters
app.get("/characters", (req, res) => {
res.set(responseHeaders);
res.send(data.characters);
});
// Get characters by id
app.get("/characters/:id", (req, res) => {
const id = req.url.split("/")[2];
const character = data.characters[0].main[id - 1];
if (character) {
res.set(responseHeaders);
res.send(character);
} else {
res.status(404).send({ error: "Character not found" });
}
});
// Get all seasons
app.get("/seasons", (req, res) => {
res.set(responseHeaders);
res.send(data.episodes[0].overview);
});
// Get a season by id
app.get("/seasons/:id", (req, res) => {
const id = req.url.split("/")[2];
const season = data.episodes[0].overview["season_" + id];
if (season) {
res.set(responseHeaders);
res.send(season);
} else {
res.status(404).send({ error: "Season not found" });
}
});
// Get all episodes
app.get("/episodes", (req, res) => {
res.set(responseHeaders);
res.send(data.episodes);
});
// Get an episode by id
app.get("/episodes/:id", (req, res) => {
const id = req.url.split("/")[2];
const episode = data.episodes[0].all[id - 1];
if (episode) {
res.set(responseHeaders);
res.send(episode);
} else {
res.status(404).send({ error: "Episode not found" });
}
});
// Get episodes by number of episode in the season
app.get("/episodes/:no_season/:no_in_season", (req, res) => {
const season = "season_" + req.url.split("/")[2];
const episode = req.url.split("/")[3];
const episodeData = data.episodes[0][season][episode - 1];
if (episodeData) {
res.set(responseHeaders);
res.send(episodeData);
} else {
res.status(404).send({ error: "Episode not found" });
}
});
// POST Routes
// Create a new character
app.post("/characters/new", (req, res) => {
const newCharacter = req.body;
res.set(responseHeaders);
schemas.characters.validate(newCharacter, (err, value) => {
if (err) {
res.status(400).send(err);
} else {
data.characters.push(newCharacter);
fs.writeFile("./api/data/characters.json", JSON.stringify(newCharacter));
res.send(data.characters);
console.log(newCharacter);
}
});
});
app.listen(port, () => {
console.log(`Listening on port ${port}...`);
});