import Application from "@server/Application"; import MovieSearch from "@server/services/MovieSearch"; import RequestMovieRequest from "../requests/RequestMovieRequest"; import { auth } from "../middleware/auth"; import RouteRegisterFactory from "./RouteRegisterFactory"; import handle from "../requests"; import { MovieTicket, User } from "@server/database/entities"; /** * Register API routes */ export default function register(factory: RouteRegisterFactory, app: Application) { factory.prefix("/api", [auth], (factory, app) => { /** * Service proxies */ factory.proxy("/tvdb/artwork", "https://artworks.thetvdb.com/"); factory.proxy("/tmdb/image", "https://image.tmdb.org/t/p/"); /** * Search for a movie */ factory.get("/movie/search", async (request, reply) => { let query = (request.query)["query"]; let year = parseInt((request.query)["year"]) || undefined; let results = await app.service("Movie Search").search(query, year); reply.send({ status: "success", data: results }); }); /** * Lookup a movie's details */ factory.get("/movie/details/:id", async (request, reply) => { let id = parseInt((request.params)["id"]); let results = await app.service("Movie Search").details(id); reply.send({ status: "success", data: results}); }); /** * Request a movie to download */ factory.get("/movie/request/:imdb_id", handle([RequestMovieRequest], async (request, reply) => { // Verify that the ID has not yet been requested let imdbId = (request.params)["imdb_id"]; if (undefined !== await MovieTicket.findOne({imdbId})) { reply.status(409); reply.send({ status: "Conflict" }); return; } // Verify that the IMDb ID exists if (!await app.service("Movie Search").verifyImdbId(imdbId)) { reply.status(404); reply.send({ satus: "Not found" }); return; } // Grab the user let user = await User.findOne({id: request.middlewareParams.auth.id}); if (user === undefined) { reply.status(401); reply.send({ status: "Unauthorized" }); return; } // Create the movie request ticket let ticket = new MovieTicket(); ticket.imdbId = imdbId; ticket.user = user; await ticket.save(); return reply.send({ status: "success" }); })); }); }