|
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 = <string>(<any>request.query)["query"];
|
|
let year = parseInt((<any>request.query)["year"]) || undefined;
|
|
let results = await app.service<MovieSearch>("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((<any>request.params)["id"]);
|
|
let results = await app.service<MovieSearch>("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 = (<any>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<MovieSearch>("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" });
|
|
}));
|
|
});
|
|
}
|