From f68cb9698d73fdd07cd678867b5ee6e5f3b75dfb Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sat, 1 May 2021 18:48:50 -0500 Subject: [PATCH] Converted Seeker uses database package. Adjust environment variables for UID and GID --- .env.example | 4 +- docker-compose.yml | 8 +-- packages/database/src/entities/MovieTicket.ts | 8 +++ services/seeker/package.json | 2 + .../seeker/src/database/entities/MovieInfo.ts | 23 -------- .../src/database/entities/MovieQuota.ts | 11 ---- .../src/database/entities/MovieTicket.ts | 53 ------------------- .../src/database/entities/MovieTorrent.ts | 18 ------- .../src/database/entities/RegisterToken.ts | 39 -------------- services/seeker/src/database/entities/User.ts | 32 ----------- .../seeker/src/database/entities/index.ts | 6 --- services/seeker/src/services/Database.ts | 28 ++++------ services/seeker/src/services/IpcInterface.ts | 3 +- services/seeker/src/services/MovieSearch.ts | 2 +- .../services/PostProcessor/PostProcessor.ts | 2 +- services/seeker/src/services/Supervisor.ts | 2 +- .../services/TorrentManager/TorrentManager.ts | 2 +- services/seeker/src/torrents/Torrent.ts | 2 +- .../seeker/src/torrents/providers/Provider.ts | 2 +- .../torrents/providers/torrentgalaxy/index.ts | 2 +- 20 files changed, 33 insertions(+), 216 deletions(-) delete mode 100644 services/seeker/src/database/entities/MovieInfo.ts delete mode 100644 services/seeker/src/database/entities/MovieQuota.ts delete mode 100644 services/seeker/src/database/entities/MovieTicket.ts delete mode 100644 services/seeker/src/database/entities/MovieTorrent.ts delete mode 100644 services/seeker/src/database/entities/RegisterToken.ts delete mode 100644 services/seeker/src/database/entities/User.ts delete mode 100644 services/seeker/src/database/entities/index.ts diff --git a/.env.example b/.env.example index 2c597ef..f11427e 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ -UID=1000 -GID=1000 +USER_ID=1000 +GROUP_ID=1000 DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 diff --git a/docker-compose.yml b/docker-compose.yml index daeacbb..f851b6e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,7 +25,7 @@ services: - tmdb_key - tvdb_key - tvdb_pin - user: ${UID}:${GID} + user: ${USER_ID}:${GROUP_ID} volumes: - var:/var/autoplex @@ -45,7 +45,7 @@ services: restart: unless-stopped secrets: - mysql_root_password - user: ${UID}:${GID} + user: ${USER_ID}:${GROUP_ID} volumes: - var:/var/autoplex @@ -66,7 +66,7 @@ services: - 3300:3300 secrets: - mysql_root_password - user: ${UID}:${GID} + user: ${USER_ID}:${GROUP_ID} volumes: - var:/var/autoplex @@ -91,7 +91,7 @@ services: restart: unless-stopped secrets: - mysql_root_password - user: ${UID}:${GID} + user: ${USER_ID}:${GROUP_ID} volumes: - var:/var/autoplex diff --git a/packages/database/src/entities/MovieTicket.ts b/packages/database/src/entities/MovieTicket.ts index 3eecf4b..3300aae 100644 --- a/packages/database/src/entities/MovieTicket.ts +++ b/packages/database/src/entities/MovieTicket.ts @@ -43,6 +43,14 @@ export class MovieTicket extends BaseEntity @JoinColumn() info!: MovieInfo | null; + /** + * Fulfill the current ticket instance + */ + async fulfill() { + this.isFulfilled = true; + return await this.save(); + } + /** * @TODO This needs to check for fulfilled tickets too, but not there yet * Fetch all active ticket ID's diff --git a/services/seeker/package.json b/services/seeker/package.json index 024c844..b430287 100644 --- a/services/seeker/package.json +++ b/services/seeker/package.json @@ -21,6 +21,8 @@ "typescript": "^4.2.4" }, "dependencies": { + "@autoplex/database": "^0.0.0", + "@autoplex/utils": "^0.0.0", "cheerio": "^1.0.0-rc.6", "diskusage": "^1.1.3", "mysql": "^2.18.1", diff --git a/services/seeker/src/database/entities/MovieInfo.ts b/services/seeker/src/database/entities/MovieInfo.ts deleted file mode 100644 index 2666a94..0000000 --- a/services/seeker/src/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/seeker/src/database/entities/MovieQuota.ts b/services/seeker/src/database/entities/MovieQuota.ts deleted file mode 100644 index edba67b..0000000 --- a/services/seeker/src/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/seeker/src/database/entities/MovieTicket.ts b/services/seeker/src/database/entities/MovieTicket.ts deleted file mode 100644 index 67a92f5..0000000 --- a/services/seeker/src/database/entities/MovieTicket.ts +++ /dev/null @@ -1,53 +0,0 @@ -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; - - /** - * Fulfill the current ticket instance - */ - async fulfill() { - this.isFulfilled = true; - return await this.save(); - } -} diff --git a/services/seeker/src/database/entities/MovieTorrent.ts b/services/seeker/src/database/entities/MovieTorrent.ts deleted file mode 100644 index 615cb6b..0000000 --- a/services/seeker/src/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/seeker/src/database/entities/RegisterToken.ts b/services/seeker/src/database/entities/RegisterToken.ts deleted file mode 100644 index 3fe2c55..0000000 --- a/services/seeker/src/database/entities/RegisterToken.ts +++ /dev/null @@ -1,39 +0,0 @@ -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 generate() { - return new Promise((resolve, reject) => { - randomBytes(48, async (err, result) => { - if (err) { - reject(err); - } else { - let token = new RegisterToken(); - token.token = result.toString("hex"); - resolve(await token.save()); - } - }); - }); - } -} diff --git a/services/seeker/src/database/entities/User.ts b/services/seeker/src/database/entities/User.ts deleted file mode 100644 index 025e448..0000000 --- a/services/seeker/src/database/entities/User.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, OneToMany, OneToOne, JoinColumn, CreateDateColumn, MoreThanOrEqual } from "typeorm"; -import { MovieTicket } from "./MovieTicket"; -import { MovieQuota } from "./MovieQuota"; - -@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[]; -} diff --git a/services/seeker/src/database/entities/index.ts b/services/seeker/src/database/entities/index.ts deleted file mode 100644 index 2b8c4c9..0000000 --- a/services/seeker/src/database/entities/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from "./MovieInfo"; -export * from "./MovieQuota"; -export * from "./MovieTicket"; -export * from "./MovieTorrent"; -export * from "./RegisterToken"; -export * from "./User"; diff --git a/services/seeker/src/services/Database.ts b/services/seeker/src/services/Database.ts index 79a3231..ae49365 100644 --- a/services/seeker/src/services/Database.ts +++ b/services/seeker/src/services/Database.ts @@ -1,7 +1,7 @@ -import { Connection, createConnection } from "typeorm"; -import * as entities from "../database/entities"; +import { Connection } from "typeorm"; +import connectToDatabase from "@autoplex/database"; +import { env, secret } from "@autoplex/utils"; import Service from "./Service"; -import { readFile } from "fs/promises"; import Application from "../Application"; export default class Database extends Service @@ -22,22 +22,12 @@ export default class Database extends Service * Boot the database service */ public async boot() { - // 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: false, - entities : Object.values(entities), - migrations : ["src/migrations/*.ts"] - }); + 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/seeker/src/services/IpcInterface.ts b/services/seeker/src/services/IpcInterface.ts index 1bd702d..b0c0490 100644 --- a/services/seeker/src/services/IpcInterface.ts +++ b/services/seeker/src/services/IpcInterface.ts @@ -4,9 +4,8 @@ import { mkdir } from "fs/promises"; import { dirname } from "path"; import Service from "./Service"; import Application from "../Application"; -import MovieSearch from "./MovieSearch"; import Supervisor from "./Supervisor"; -import { MovieTicket } from "../database/entities"; +import { MovieTicket } from "@autoplex/database"; export default class IpcInterface extends Service { diff --git a/services/seeker/src/services/MovieSearch.ts b/services/seeker/src/services/MovieSearch.ts index 8547218..0c32114 100644 --- a/services/seeker/src/services/MovieSearch.ts +++ b/services/seeker/src/services/MovieSearch.ts @@ -1,5 +1,5 @@ import Application from "../Application"; -import { MovieTicket } from "../database/entities"; +import { MovieTicket } from "@autoplex/database"; import * as providerClasses from "../torrents"; import Provider, { MediaType } from "../torrents/providers/Provider"; import Torrent from "../torrents/Torrent"; diff --git a/services/seeker/src/services/PostProcessor/PostProcessor.ts b/services/seeker/src/services/PostProcessor/PostProcessor.ts index a74a5e5..ba1a7d8 100644 --- a/services/seeker/src/services/PostProcessor/PostProcessor.ts +++ b/services/seeker/src/services/PostProcessor/PostProcessor.ts @@ -1,7 +1,7 @@ import { link, mkdir } from "fs/promises"; import { dirname, extname } from "path"; import Application from "../../Application"; -import { MovieTicket, MovieTorrent } from "../../database/entities"; +import { MovieTicket, MovieTorrent } from "@autoplex/database"; import Service from "../Service"; import { ISerializedTorrent } from "../TorrentManager/TorrentClientIpc"; import { safeTitleFileName } from "../../utils"; diff --git a/services/seeker/src/services/Supervisor.ts b/services/seeker/src/services/Supervisor.ts index cc54551..29371aa 100644 --- a/services/seeker/src/services/Supervisor.ts +++ b/services/seeker/src/services/Supervisor.ts @@ -1,5 +1,5 @@ import Application from "../Application"; -import { MovieTicket, MovieTorrent } from "../database/entities"; +import { MovieTicket, MovieTorrent } from "@autoplex/database"; import MovieSearch from "./MovieSearch"; import PostProcessor from "./PostProcessor"; import Service from "./Service"; diff --git a/services/seeker/src/services/TorrentManager/TorrentManager.ts b/services/seeker/src/services/TorrentManager/TorrentManager.ts index 5e4d267..d66afb0 100644 --- a/services/seeker/src/services/TorrentManager/TorrentManager.ts +++ b/services/seeker/src/services/TorrentManager/TorrentManager.ts @@ -1,7 +1,7 @@ import diskusage from "diskusage"; import { readdir } from "fs/promises"; import Application from "../../Application" -import { MovieTicket, MovieTorrent } from "../../database/entities"; +import { MovieTicket, MovieTorrent } from "@autoplex/database"; import Supervisor from "../Supervisor"; import TorrentClientIpc, { TorrentClientConnectionError } from "./TorrentClientIpc" diff --git a/services/seeker/src/torrents/Torrent.ts b/services/seeker/src/torrents/Torrent.ts index 0ba82bb..cd0c8e4 100644 --- a/services/seeker/src/torrents/Torrent.ts +++ b/services/seeker/src/torrents/Torrent.ts @@ -1,4 +1,4 @@ -import { MovieTicket } from "../database/entities"; +import { MovieTicket } from "@autoplex/database"; import { ITorrentMetaInfo, parseMovieTorrentName } from "./parsing"; export default class Torrent diff --git a/services/seeker/src/torrents/providers/Provider.ts b/services/seeker/src/torrents/providers/Provider.ts index d53c97c..8eaa8d5 100644 --- a/services/seeker/src/torrents/providers/Provider.ts +++ b/services/seeker/src/torrents/providers/Provider.ts @@ -1,4 +1,4 @@ -import { MovieTicket } from "../../database/entities"; +import { MovieTicket } from "@autoplex/database"; import Torrent from "../Torrent"; /** diff --git a/services/seeker/src/torrents/providers/torrentgalaxy/index.ts b/services/seeker/src/torrents/providers/torrentgalaxy/index.ts index b628440..8a08bcd 100644 --- a/services/seeker/src/torrents/providers/torrentgalaxy/index.ts +++ b/services/seeker/src/torrents/providers/torrentgalaxy/index.ts @@ -1,4 +1,4 @@ -import { MovieTicket } from "../../../database/entities"; +import { MovieTicket } from "@autoplex/database"; import Provider, { MediaType } from "../Provider"; import Torrent from "../../Torrent"; import { search, Sort } from "./search";