You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

72 lines
2.3 KiB

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" });
}));
});
}