From eca50dd9053a1ebbb6e02ca788638cf798236490 Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sat, 1 May 2021 17:21:25 -0500 Subject: [PATCH] Use the Database package in request service --- services/request/src/server/Application.ts | 2 +- .../database/entities/DiscordAccount.ts | 22 ---- .../database/entities/DiscordChannel.ts | 17 --- .../database/entities/DiscordLinkRequest.ts | 31 ----- .../database/entities/DiscordRequest.ts | 26 ---- .../src/server/database/entities/MovieInfo.ts | 23 ---- .../server/database/entities/MovieQuota.ts | 11 -- .../server/database/entities/MovieTicket.ts | 93 -------------- .../server/database/entities/MovieTorrent.ts | 18 --- .../src/server/database/entities/PlexMovie.ts | 50 -------- .../server/database/entities/RegisterToken.ts | 32 ----- .../src/server/database/entities/User.ts | 113 ------------------ .../src/server/database/entities/index.ts | 11 -- services/request/src/server/database/index.ts | 22 ---- .../request/src/server/services/Database.ts | 12 +- .../request/src/server/services/DiscordBot.ts | 9 +- .../src/server/services/MovieSearch.ts | 2 +- .../src/server/services/PlexLibrary.ts | 2 +- .../services/WebServer/middleware/auth.ts | 2 +- .../server/services/WebServer/routes/api.ts | 25 +++- .../server/services/WebServer/routes/auth.ts | 2 +- .../server/services/WebServer/validators.ts | 2 +- 22 files changed, 40 insertions(+), 487 deletions(-) delete mode 100644 services/request/src/server/database/entities/DiscordAccount.ts delete mode 100644 services/request/src/server/database/entities/DiscordChannel.ts delete mode 100644 services/request/src/server/database/entities/DiscordLinkRequest.ts delete mode 100644 services/request/src/server/database/entities/DiscordRequest.ts delete mode 100644 services/request/src/server/database/entities/MovieInfo.ts delete mode 100644 services/request/src/server/database/entities/MovieQuota.ts delete mode 100644 services/request/src/server/database/entities/MovieTicket.ts delete mode 100644 services/request/src/server/database/entities/MovieTorrent.ts delete mode 100644 services/request/src/server/database/entities/PlexMovie.ts delete mode 100644 services/request/src/server/database/entities/RegisterToken.ts delete mode 100644 services/request/src/server/database/entities/User.ts delete mode 100644 services/request/src/server/database/entities/index.ts delete mode 100644 services/request/src/server/database/index.ts diff --git a/services/request/src/server/Application.ts b/services/request/src/server/Application.ts index 2fff703..779aedf 100644 --- a/services/request/src/server/Application.ts +++ b/services/request/src/server/Application.ts @@ -1,6 +1,6 @@ import services from "./services"; import Service from "./services/Service"; -import { User, RegisterToken } from "./database/entities"; +import { User, RegisterToken } from "@autoplex/database"; import assert from "assert"; interface ServiceMap { diff --git a/services/request/src/server/database/entities/DiscordAccount.ts b/services/request/src/server/database/entities/DiscordAccount.ts deleted file mode 100644 index 012e74d..0000000 --- a/services/request/src/server/database/entities/DiscordAccount.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { BaseEntity, Column, CreateDateColumn, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; -import { DiscordRequest } from "./DiscordRequest"; -import { User } from "./User"; - -@Entity() -export class DiscordAccount extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column({ length: 20 }) - discordId!: string; - - @ManyToOne(() => User, user => user.discordAccounts) - user!: User; - - @OneToMany(() => DiscordRequest, request => request.account) - requests!: DiscordRequest[]; - - @CreateDateColumn() - createdAt!: Date; -} diff --git a/services/request/src/server/database/entities/DiscordChannel.ts b/services/request/src/server/database/entities/DiscordChannel.ts deleted file mode 100644 index 209af9c..0000000 --- a/services/request/src/server/database/entities/DiscordChannel.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from "typeorm"; - -@Entity() -export class DiscordChannel extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column({ length: 20 }) - channelId!: string; - - @Column({ length: 20 }) - messageId!: string; - - @CreateDateColumn() - createdAt!: Date; -} diff --git a/services/request/src/server/database/entities/DiscordLinkRequest.ts b/services/request/src/server/database/entities/DiscordLinkRequest.ts deleted file mode 100644 index 958163b..0000000 --- a/services/request/src/server/database/entities/DiscordLinkRequest.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from "typeorm"; -import { DiscordAccount } from "./DiscordAccount"; -import { User } from "./User"; - -@Entity() -export class DiscordLinkRequest extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column() - discordId!: string; - - @Column() - token!: string; - - @CreateDateColumn() - createdAt!: Date; - - /** - * Fulfill a link request for the given user - */ - public async linkUser(user: User) { - let account = new DiscordAccount(); - account.discordId = this.discordId; - account.user = user; - let awaitSave = account.save(); - await DiscordLinkRequest.delete({ id: this.id }); - return await awaitSave; - } -} diff --git a/services/request/src/server/database/entities/DiscordRequest.ts b/services/request/src/server/database/entities/DiscordRequest.ts deleted file mode 100644 index 7154f6f..0000000 --- a/services/request/src/server/database/entities/DiscordRequest.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { BaseEntity, Column, CreateDateColumn, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn } from "typeorm"; -import { DiscordAccount } from "./DiscordAccount"; -import { MovieTicket } from "./MovieTicket"; - -@Entity() -export class DiscordRequest extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column({ length: 20 }) - channelId!: string; - - @Column({ length: 20 }) - messageId!: string; - - @CreateDateColumn() - createdAt!: Date; - - @ManyToOne(() => DiscordAccount, account => account.requests) - account!: DiscordAccount; - - @OneToOne(() => MovieTicket) - @JoinColumn() - ticket!: MovieTicket; -} diff --git a/services/request/src/server/database/entities/MovieInfo.ts b/services/request/src/server/database/entities/MovieInfo.ts deleted file mode 100644 index 2666a94..0000000 --- a/services/request/src/server/database/entities/MovieInfo.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from "typeorm"; - -@Entity() -export class MovieInfo extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column({ type: "text", nullable: true }) - overview!: string | null; - - @Column({ type: "int", nullable: true }) - runtime!: number | null; - - @Column({ type: "char", length: 10, nullable: true }) - releaseDate!: string | null; - - @Column({ type: "varchar", length: 32, nullable: true }) - backdropPath!: string | null; - - @Column({ type: "varchar", length: 32, nullable: true }) - posterPath!: string | null; -} diff --git a/services/request/src/server/database/entities/MovieQuota.ts b/services/request/src/server/database/entities/MovieQuota.ts deleted file mode 100644 index edba67b..0000000 --- a/services/request/src/server/database/entities/MovieQuota.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from "typeorm"; - -@Entity() -export class MovieQuota extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column({ default: 5 }) - moviesPerWeek!: number; -} diff --git a/services/request/src/server/database/entities/MovieTicket.ts b/services/request/src/server/database/entities/MovieTicket.ts deleted file mode 100644 index ede2464..0000000 --- a/services/request/src/server/database/entities/MovieTicket.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { IApiMovieDetails } from "@common/api_schema"; -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, ManyToOne, OneToMany, OneToOne, JoinColumn, CreateDateColumn, Not, IsNull } from "typeorm"; -import { MovieInfo } from "./MovieInfo"; -import { MovieTorrent } from "./MovieTorrent"; -import { User } from "./User"; - -@Entity() -export class MovieTicket extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column({ type: "int", nullable: true }) - tmdbId!: number | null; - - @Column({ type: "varchar", length: 27, nullable: true }) - imdbId!: string | null; - - @Column({ type: "varchar" }) - title!: string; - - @Column({ type: "year", nullable: true }) - year!: number | null; - - @CreateDateColumn() - createdAt!: Date; - - @Column({ default: false }) - isFulfilled!: boolean; - - @Column({ default: false }) - isCanceled!: boolean; - - @Column({ default: false }) - isStale!: boolean; - - @ManyToOne(() => User, user => user.movieTickets) - user!: User; - - @OneToMany(() => MovieTorrent, torrent => torrent.movieTicket) - torrents!: MovieTorrent[]; - - @OneToOne(() => MovieInfo, { nullable: true }) - @JoinColumn() - info!: MovieInfo | null; - - /** - * @TODO This needs to check for fulfilled tickets too, but not there yet - * Fetch all active ticket ID's - */ - public static async activeTicketMap() { - let tickets = await MovieTicket.find({ where: { tmdbId: Not(IsNull()), isCanceled: false } }); - let result: {[tmdbId: number]: number} = {}; - for (let ticket of tickets) { - result[ticket.tmdbId] = ticket.id; - } - return result; - } - - /** - * Insert a request via IMDb movie details - */ - public static async requestImdb(user: User, imdbId: string, title: string, year: number) { - let ticket = new MovieTicket(); - ticket.imdbId = imdbId; - ticket.title = title; - ticket.year = year; - ticket.user = user; - return await ticket.save(); - } - - /** - * Insert a rquest via TMDb movie details - */ - public static async requestTmdb(user: User, movie: IApiMovieDetails) { - let info = new MovieInfo(); - info.overview = movie.overview; - info.posterPath = movie.posterPath; - info.backdropPath = movie.backdropPath; - info.releaseDate = movie.releaseDate; - info.runtime = movie.runtime; - await info.save(); - - let ticket = new MovieTicket(); - ticket.tmdbId = movie.tmdbId; - ticket.imdbId = movie.imdbId; - ticket.title = movie.title; - ticket.year = movie.releaseDate ? parseInt(movie.releaseDate.slice(0, 4)) : null; - ticket.user = user; - ticket.info = info; - return await ticket.save(); - } -} diff --git a/services/request/src/server/database/entities/MovieTorrent.ts b/services/request/src/server/database/entities/MovieTorrent.ts deleted file mode 100644 index 615cb6b..0000000 --- a/services/request/src/server/database/entities/MovieTorrent.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, ManyToOne } from "typeorm"; -import { MovieTicket } from "./MovieTicket"; - -@Entity() -export class MovieTorrent extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column() - infoHash!: string; - - @Column() - diskName!: string; - - @ManyToOne(() => MovieTicket, ticket => ticket.torrents) - movieTicket!: MovieTicket; -} diff --git a/services/request/src/server/database/entities/PlexMovie.ts b/services/request/src/server/database/entities/PlexMovie.ts deleted file mode 100644 index 28b924e..0000000 --- a/services/request/src/server/database/entities/PlexMovie.ts +++ /dev/null @@ -1,50 +0,0 @@ -import Plex from "@lib/plex"; -import { BaseEntity, Column, Entity, In, PrimaryColumn } from "typeorm"; - -@Entity() -export class PlexMovie extends BaseEntity -{ - @PrimaryColumn({ length: 27 }) - imdbId!: string; - - @Column({ type: "int", nullable: true, unique: true }) - tmdbId!: number|null; - - @Column() - plexKey!: number; - - /** - * Check if a movie is on Plex given its TMDb ID - */ - public static async findPlexKey(tmdbId: number|string) { - return (await PlexMovie.findOne({ where: { tmdbId } }))?.plexKey ?? null; - } - - /** - * Get the set of IMDb IDs stored in the library - */ - public static async imdbSet() { - let rows = await PlexMovie.createQueryBuilder("plex_movie") - .select("imdbId") - .getRawMany(); - return new Set(rows.map(row => row.imdbId)); - } - - /** - * Insert a set of IMDb IDs into the database - */ - public static async insertMovies(movies: { imdbId: string, plexKey: number }[]) { - await PlexMovie.createQueryBuilder() - .insert() - .into("plex_movie") - .values([...movies].map(({imdbId, plexKey}) => ({ imdbId, tmdbId: null, plexKey }))) - .execute(); - } - - /** - * Remove the given set of IMDb IDs from the library - */ - public static async removeImdbSet(imdbIds: Set) { - await PlexMovie.delete({ imdbId: In([...imdbIds]) }); - } -} diff --git a/services/request/src/server/database/entities/RegisterToken.ts b/services/request/src/server/database/entities/RegisterToken.ts deleted file mode 100644 index e180256..0000000 --- a/services/request/src/server/database/entities/RegisterToken.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { generateToken } from "@autoplex/utils"; -import { randomBytes } from "crypto"; -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from "typeorm"; - -@Entity() -export class RegisterToken extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column() - token!: string - - /** - * Check if the provided token is valid - */ - public static async isValid(token: string) { - if (typeof token !== "string") { - return false; - } - return Boolean(token) && await RegisterToken.count({token}) > 0; - } - - /** - * Create a new registration token and insert it into the database - */ - public static async generate() { - let token = new RegisterToken(); - token.token = await generateToken(); - return await token.save(); - } -} diff --git a/services/request/src/server/database/entities/User.ts b/services/request/src/server/database/entities/User.ts deleted file mode 100644 index 8a5007d..0000000 --- a/services/request/src/server/database/entities/User.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, OneToMany, OneToOne, JoinColumn, CreateDateColumn, MoreThanOrEqual } from "typeorm"; -import bcrypt from "bcrypt"; -import { MovieTicket } from "./MovieTicket"; -import { MovieQuota } from "./MovieQuota"; -import { IApiMovie } from "@common/api_schema"; -import { DiscordAccount } from "./DiscordAccount"; - -@Entity() -export class User extends BaseEntity -{ - @PrimaryGeneratedColumn() - id!: number; - - @Column() - isAdmin!: boolean; - - @Column({ length: 50 }) - name!: string; - - @Column({ length: 255 }) - email!: string; - - @Column({ type: "char", length: 60 }) - password!: string; - - @CreateDateColumn() - createdAt!: Date; - - @OneToOne(() => MovieQuota, { nullable: true }) - @JoinColumn() - quota!: MovieQuota | null; - - @OneToMany(() => User, user => user.movieTickets) - movieTickets!: MovieTicket[]; - - @OneToMany(() => DiscordAccount, account => account.user) - discordAccounts!: DiscordAccount[]; - - /** - * Authenticate a user and return an auth token upon success - */ - public static async authenticate(email: string, password: string) { - let user = await User.findOne({ email }); - if (user === undefined || !(await bcrypt.compare(password, user.password))) { - return null; - } - return user; - } - - /** - * Create a new user - */ - public static async createUser(name: string, email: string, password: string, quota: number|null = 5) { - let user = new User(); - user.isAdmin = false; - user.name = name; - user.email = email; - user.password = await bcrypt.hash(password, 8); - // Create a quota if necessary - if (quota !== null) { - user.quota = new MovieQuota; - user.quota.moviesPerWeek = quota; - await user.quota.save(); - } - return await user.save(); - } - - /** - * Determine the user's available quota - */ - public async availableQuota() { - let quota = await this.fetchQuota(); - if (quota === null) { - return null; - } - let oneWeekAgo = new Date(Date.now() - 1000*60*60*24*7); - let numTicketsThisWeek = await MovieTicket.count({ - user: this, - createdAt: MoreThanOrEqual(oneWeekAgo), - isCanceled: false - }); - return quota.moviesPerWeek - numTicketsThisWeek; - } - - /** - * Get the user's quota, fetching it if undefined - */ - public async fetchQuota() { - if (this.quota !== undefined) { - return this.quota; - } - let user = await User.findOne(this.id, { relations: ["quota"] }); - return user.quota; - } - - /** - * Fetch active movie tickets for this user - */ - public async activeMovieTickets() { - let tickets = await MovieTicket.find({ - where: { user: this, isCanceled: false, isFulfilled: false }, - relations: ["info"] - }); - return tickets.map(ticket => ({ - plexLink : null, - posterPath : ticket.info?.posterPath, - releaseDate: ticket.info?.releaseDate, - ticketId : ticket.id, - title : ticket.title, - tmdbId : ticket.tmdbId - })); - } -} diff --git a/services/request/src/server/database/entities/index.ts b/services/request/src/server/database/entities/index.ts deleted file mode 100644 index ace10df..0000000 --- a/services/request/src/server/database/entities/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from "./DiscordAccount"; -export * from "./DiscordChannel"; -export * from "./DiscordLinkRequest"; -export * from "./DiscordRequest"; -export * from "./MovieInfo"; -export * from "./MovieQuota"; -export * from "./MovieTicket"; -export * from "./MovieTorrent"; -export * from "./PlexMovie"; -export * from "./RegisterToken"; -export * from "./User"; diff --git a/services/request/src/server/database/index.ts b/services/request/src/server/database/index.ts deleted file mode 100644 index bfe0be5..0000000 --- a/services/request/src/server/database/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as entities from "./entities"; -import { readFile } from "fs/promises"; -import { createConnection } from "typeorm"; - -export default async function connectToDatabase() { - // Fetch the database password from the secret file - let password = (await readFile(process.env["DB_PASSWORD_FILE"])).toString().trim(); - - // Create the database connection - await createConnection({ - type : <"mysql" | "mariadb">process.env["DB_TYPE"], - host : process.env["DB_HOST"], - port : parseInt(process.env["DB_PORT"]), - username : process.env["DB_USER"], - password : password, - database : process.env["DB_DATABASE"], - // synchronize: process.env["NODE_ENV"] != "production", - synchronize: true, // Seems stable enough for my liking - entities : Object.values(entities), - migrations : ["src/migrations/*.ts"] - }); -} diff --git a/services/request/src/server/services/Database.ts b/services/request/src/server/services/Database.ts index 29bfdbf..0d3d892 100644 --- a/services/request/src/server/services/Database.ts +++ b/services/request/src/server/services/Database.ts @@ -1,7 +1,8 @@ -import { Connection, createConnection } from "typeorm"; +import { Connection } from "typeorm"; import Service from "./Service"; import Application from "../Application"; -import connectToDatabase from "@server/database"; +import connectToDatabase from "@autoplex/database"; +import { env, secret } from "@autoplex/utils"; export default class Database extends Service { @@ -21,7 +22,12 @@ export default class Database extends Service * Boot the database service */ public async boot() { - await connectToDatabase(); + let host = env("DB_HOST"); + let port = parseInt(env("DB_PORT")); + let username = env("DB_USER"); + let password = await secret(env("DB_PASSWORD_FILE")); + let database = env("DB_DATABASE"); + this.connection = await connectToDatabase(host, port, username, password, database); } /** diff --git a/services/request/src/server/services/DiscordBot.ts b/services/request/src/server/services/DiscordBot.ts index 021f204..2a79052 100644 --- a/services/request/src/server/services/DiscordBot.ts +++ b/services/request/src/server/services/DiscordBot.ts @@ -2,10 +2,8 @@ import Application from "../Application"; import Service from "./Service"; import { Client, Collection, Message, TextChannel, User as DiscordUser } from "discord.js"; import { env, formatImdbId, generateToken, secret } from "@autoplex/utils"; -import { DiscordChannel } from "@server/database/entities/DiscordChannel"; -import { DiscordAccount, MovieTicket } from "@server/database/entities"; +import { DiscordAccount, DiscordChannel, DiscordLinkRequest, MovieTicket } from "@autoplex/database"; import MovieSearch from "./MovieSearch"; -import { DiscordLinkRequest } from "@server/database/entities/DiscordLinkRequest"; /** * The required role to perfrom administrative commands on the bot @@ -349,6 +347,7 @@ export default class DiscordBot extends Service } /** + * @TODO movie requests have been disabled while the project is reorganized * Request a movie */ protected async cmdRequestMovie(account: DiscordAccount, message: Message) { @@ -390,7 +389,7 @@ export default class DiscordBot extends Service return; } let info = await this.app.service("Movie Search").details(movie.id); - await MovieTicket.requestTmdb(account.user, info); - this.sendDm(message.author, `*${info.title}* has been requested successfully!`); + // await MovieTicket.requestTmdb(account.user, info); + this.sendDm(message.author, `*${info.title}* has been requested successfully! (TEMP DISABLE)`); } } diff --git a/services/request/src/server/services/MovieSearch.ts b/services/request/src/server/services/MovieSearch.ts index bd54874..1e824ef 100644 --- a/services/request/src/server/services/MovieSearch.ts +++ b/services/request/src/server/services/MovieSearch.ts @@ -5,7 +5,7 @@ import { request } from "https"; import Service from "./Service"; import TvDb from "./TvDb"; import { IApiMovie, IApiMovieDetails, IApiPaginatedResponse } from "@common/api_schema"; -import { MovieTicket, PlexMovie } from "@server/database/entities"; +import { MovieTicket, PlexMovie } from "@autoplex/database"; import { IMovieSearchResult } from "@lib/tmdb/schema"; const CACHE_CLEAR_INTERVAL = 1000*60; // 60 seconds diff --git a/services/request/src/server/services/PlexLibrary.ts b/services/request/src/server/services/PlexLibrary.ts index 8230cf4..e9ad258 100644 --- a/services/request/src/server/services/PlexLibrary.ts +++ b/services/request/src/server/services/PlexLibrary.ts @@ -1,6 +1,6 @@ import Plex from "@lib/plex"; import Application from "@server/Application"; -import { PlexMovie } from "@server/database/entities"; +import { PlexMovie } from "@autoplex/database"; import { env, secret, sleep } from "@autoplex/utils"; import MovieSearch from "./MovieSearch"; import Service from "./Service"; diff --git a/services/request/src/server/services/WebServer/middleware/auth.ts b/services/request/src/server/services/WebServer/middleware/auth.ts index fbc193f..562930c 100644 --- a/services/request/src/server/services/WebServer/middleware/auth.ts +++ b/services/request/src/server/services/WebServer/middleware/auth.ts @@ -3,7 +3,7 @@ import Application from "@server/Application"; import jwt from "jsonwebtoken"; import { IteratorNext, MiddlewareRequest } from "."; import { ITokenSchema } from "@common/api_schema"; -import { User } from "@server/database/entities"; +import { User } from "@autoplex/database"; /** * Attempt to authenticate a client's JWT token diff --git a/services/request/src/server/services/WebServer/routes/api.ts b/services/request/src/server/services/WebServer/routes/api.ts index 2bc3cde..f0fd81d 100644 --- a/services/request/src/server/services/WebServer/routes/api.ts +++ b/services/request/src/server/services/WebServer/routes/api.ts @@ -4,7 +4,7 @@ import MovieSearch from "@server/services/MovieSearch"; import { auth } from "../middleware/auth"; import RouteRegisterFactory from "./RouteRegisterFactory"; import handle from "../requests"; -import { MovieTicket } from "@server/database/entities"; +import { MovieInfo, MovieTicket } from "@autoplex/database"; import RequestTmdbMovieRequest from "../requests/RequestTmdbMovieRequest"; /** @@ -68,15 +68,32 @@ export default function register(factory: RouteRegisterFactory, app: Application return; } // Verify that the IMDb ID exists - let movieDetails = await app.service("Movie Search").details(tmdbId); - if (!movieDetails) { // @TODO This isn't correct I don't think + let movie = await app.service("Movie Search").details(tmdbId); + if (!movie) { // @TODO This isn't correct I don't think reply.status(404); reply.send({ satus: "Not found" }); return; } // Create the movie request ticket let user = request.middlewareParams.auth.user; - let ticket = await MovieTicket.requestTmdb(user, movieDetails); + + let info = new MovieInfo(); + info.overview = movie.overview; + info.posterPath = movie.posterPath; + info.backdropPath = movie.backdropPath; + info.releaseDate = movie.releaseDate; + info.runtime = movie.runtime; + await info.save(); + + let ticket = new MovieTicket(); + ticket.tmdbId = movie.tmdbId; + ticket.imdbId = movie.imdbId; + ticket.title = movie.title; + ticket.year = movie.releaseDate ? parseInt(movie.releaseDate.slice(0, 4)) : null; + ticket.user = user; + ticket.info = info; + await ticket.save(); + app.service("Seeker IPC").notifyMovieRequested(ticket.id); return reply.send({ status: "Success", data: { ticket_id: ticket.id }}); })); diff --git a/services/request/src/server/services/WebServer/routes/auth.ts b/services/request/src/server/services/WebServer/routes/auth.ts index 306508a..05e3d68 100644 --- a/services/request/src/server/services/WebServer/routes/auth.ts +++ b/services/request/src/server/services/WebServer/routes/auth.ts @@ -1,6 +1,6 @@ import jwt from "jsonwebtoken" import Application from "@server/Application"; -import { DiscordLinkRequest, RegisterToken, User } from "@server/database/entities"; +import { DiscordLinkRequest, RegisterToken, User } from "@autoplex/database"; import LoginRequest, { ILoginFormBody } from "../requests/LoginRequest"; import RegisterRequest, { IRegisterFormBody } from "../requests/RegisterRequest"; import handle from "../requests"; diff --git a/services/request/src/server/services/WebServer/validators.ts b/services/request/src/server/services/WebServer/validators.ts index 0ac8e5e..b27e140 100644 --- a/services/request/src/server/services/WebServer/validators.ts +++ b/services/request/src/server/services/WebServer/validators.ts @@ -1,4 +1,4 @@ -import { RegisterToken } from "@server/database/entities"; +import { RegisterToken } from "@autoplex/database"; import validate from "validate.js"; interface IValidTokenOptions {