Created
April 7, 2020 16:49
-
-
Save patrickhulce/dfe1112ec6e5abdaf81c470cc24fc2ec to your computer and use it in GitHub Desktop.
Movies Interview Server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const _ = require('lodash') | |
const express = require('express') | |
const movies = require('./movies.json') | |
const actors = [] | |
const roles = [] | |
/** | |
* Documentation | |
* | |
* Installation: npm install express lodash morgan | |
* Starting: node server.js | |
* | |
* Routes: | |
* - /movies | |
* - /movies/<id> | |
* - /actors | |
* - /actors/<id> | |
* - /roles | |
* | |
* Query Examples | |
* - /movies?search=batman | |
* - /actors?search=christian | |
* - /roles?actorId=123 | |
* - /roles?movieId=123 | |
*/ | |
function getOrCreateActor(actors, name) { | |
const existing = actors.find((actor) => actor.name === name) | |
if (existing) return existing | |
const actor = {name, id: actors.length + 1} | |
actors.push(actor) | |
return actor | |
} | |
function init() { | |
movies.forEach((movie, i) => { | |
movie.id = i + 1 | |
movie.actors.forEach((name, i) => { | |
const actorId = getOrCreateActor(actors, name).id | |
roles.push({ | |
id: roles.length + 1, | |
actorId, | |
movieId: movie.id, | |
role: i === 0 ? 'lead' : 'supporting', | |
}) | |
}) | |
delete movie.actors | |
}) | |
movies.sort((a, b) => new Date(b.releaseDate).getTime() - new Date(a.releaseDate).getTime()) | |
} | |
const app = express() | |
app.use(require('morgan')('dev')) | |
app.get('/movies', (req, res) => { | |
const offset = req.query.offset || 0 | |
let matched = movies | |
if (req.query.search) | |
matched = _.filter(matched, (m) => | |
m.name.toLowerCase().includes(req.query.search.toLowerCase()), | |
) | |
res.json(matched.slice(offset, offset + 10)) | |
}) | |
app.get('/movies/:id', (req, res) => { | |
const movie = movies.find((m) => m.id === Number(req.params.id)) | |
if (!movie) return res.sendStatus(404) | |
res.json(movie) | |
}) | |
app.get('/actors', (req, res) => { | |
const offset = req.query.offset || 0 | |
let matched = actors | |
if (req.query.search) | |
matched = _.filter(matched, (m) => | |
m.name.toLowerCase().includes(req.query.search.toLowerCase()), | |
) | |
res.json(matched.slice(offset, offset + 10)) | |
}) | |
app.get('/actors/:id', (req, res) => { | |
const actor = actors.find((m) => m.id === Number(req.params.id)) | |
if (!actor) return res.sendStatus(404) | |
res.json(actor) | |
}) | |
app.get('/roles', (req, res) => { | |
const offset = req.query.offset || 0 | |
let matched = roles | |
if (req.query.actorId) matched = _.filter(matched, {actorId: Number(req.query.actorId)}) | |
if (req.query.movieId) matched = _.filter(matched, {movieId: Number(req.query.movieId)}) | |
res.json(matched.slice(offset, offset + 10)) | |
}) | |
init() | |
app.listen(8080, () => console.log('Listening on 8080...')) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment