Skip to content

Instantly share code, notes, and snippets.

@patrickhulce
Created April 7, 2020 16:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save patrickhulce/dfe1112ec6e5abdaf81c470cc24fc2ec to your computer and use it in GitHub Desktop.
Save patrickhulce/dfe1112ec6e5abdaf81c470cc24fc2ec to your computer and use it in GitHub Desktop.
Movies Interview Server
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