Browse Source

Converted Seeker uses database package. Adjust environment variables for UID and GID

dev
David Ludwig 4 years ago
parent
commit
f68cb9698d
20 changed files with 33 additions and 216 deletions
  1. +2
    -2
      .env.example
  2. +4
    -4
      docker-compose.yml
  3. +8
    -0
      packages/database/src/entities/MovieTicket.ts
  4. +2
    -0
      services/seeker/package.json
  5. +0
    -23
      services/seeker/src/database/entities/MovieInfo.ts
  6. +0
    -11
      services/seeker/src/database/entities/MovieQuota.ts
  7. +0
    -53
      services/seeker/src/database/entities/MovieTicket.ts
  8. +0
    -18
      services/seeker/src/database/entities/MovieTorrent.ts
  9. +0
    -39
      services/seeker/src/database/entities/RegisterToken.ts
  10. +0
    -32
      services/seeker/src/database/entities/User.ts
  11. +0
    -6
      services/seeker/src/database/entities/index.ts
  12. +9
    -19
      services/seeker/src/services/Database.ts
  13. +1
    -2
      services/seeker/src/services/IpcInterface.ts
  14. +1
    -1
      services/seeker/src/services/MovieSearch.ts
  15. +1
    -1
      services/seeker/src/services/PostProcessor/PostProcessor.ts
  16. +1
    -1
      services/seeker/src/services/Supervisor.ts
  17. +1
    -1
      services/seeker/src/services/TorrentManager/TorrentManager.ts
  18. +1
    -1
      services/seeker/src/torrents/Torrent.ts
  19. +1
    -1
      services/seeker/src/torrents/providers/Provider.ts
  20. +1
    -1
      services/seeker/src/torrents/providers/torrentgalaxy/index.ts

+ 2
- 2
.env.example View File

@ -1,5 +1,5 @@
UID=1000
GID=1000
USER_ID=1000
GROUP_ID=1000
DOCKER_BUILDKIT=1
COMPOSE_DOCKER_CLI_BUILD=1

+ 4
- 4
docker-compose.yml View File

@ -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


+ 8
- 0
packages/database/src/entities/MovieTicket.ts View File

@ -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


+ 2
- 0
services/seeker/package.json View File

@ -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",


+ 0
- 23
services/seeker/src/database/entities/MovieInfo.ts View File

@ -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;
}

+ 0
- 11
services/seeker/src/database/entities/MovieQuota.ts View File

@ -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;
}

+ 0
- 53
services/seeker/src/database/entities/MovieTicket.ts View File

@ -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();
}
}

+ 0
- 18
services/seeker/src/database/entities/MovieTorrent.ts View File

@ -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;
}

+ 0
- 39
services/seeker/src/database/entities/RegisterToken.ts View File

@ -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<RegisterToken>((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());
}
});
});
}
}

+ 0
- 32
services/seeker/src/database/entities/User.ts View File

@ -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[];
}

+ 0
- 6
services/seeker/src/database/entities/index.ts View File

@ -1,6 +0,0 @@
export * from "./MovieInfo";
export * from "./MovieQuota";
export * from "./MovieTicket";
export * from "./MovieTorrent";
export * from "./RegisterToken";
export * from "./User";

+ 9
- 19
services/seeker/src/services/Database.ts View File

@ -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(<string>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(<string>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);
}
/**


+ 1
- 2
services/seeker/src/services/IpcInterface.ts View File

@ -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
{


+ 1
- 1
services/seeker/src/services/MovieSearch.ts View File

@ -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";


+ 1
- 1
services/seeker/src/services/PostProcessor/PostProcessor.ts View File

@ -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";


+ 1
- 1
services/seeker/src/services/Supervisor.ts View File

@ -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";


+ 1
- 1
services/seeker/src/services/TorrentManager/TorrentManager.ts View File

@ -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"


+ 1
- 1
services/seeker/src/torrents/Torrent.ts View File

@ -1,4 +1,4 @@
import { MovieTicket } from "../database/entities";
import { MovieTicket } from "@autoplex/database";
import { ITorrentMetaInfo, parseMovieTorrentName } from "./parsing";
export default class Torrent


+ 1
- 1
services/seeker/src/torrents/providers/Provider.ts View File

@ -1,4 +1,4 @@
import { MovieTicket } from "../../database/entities";
import { MovieTicket } from "@autoplex/database";
import Torrent from "../Torrent";
/**


+ 1
- 1
services/seeker/src/torrents/providers/torrentgalaxy/index.ts View File

@ -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";


Loading…
Cancel
Save