diff --git a/app/app.ts b/app/app.ts index 2e03142..fda47e7 100644 --- a/app/app.ts +++ b/app/app.ts @@ -15,7 +15,7 @@ import authRouter from "./routes/auth"; import indexRouter from "./routes/index"; import adduserRouter from "./routes/adduser"; -import {db, createUser, MediaRow} from "./types/db"; +import {db, expire, createUser, MediaRow} from "./types/db"; let app = express(); let server = http.createServer(app); @@ -130,7 +130,7 @@ app.use("/", adduserRouter); app.use("/uploads", express.static("uploads")); -function prune () { +async function prune () { db.all("SELECT * FROM media", (err: Error, rows: []) => { console.log("Uploaded files: " + rows.length); console.log(rows); @@ -139,30 +139,16 @@ function prune () { console.log("Vacuuming database..."); db.run("VACUUM"); - db.all("SELECT * FROM media WHERE expire < ?", [Date.now()], (err: Error, rows: []) => { - console.log("Expired rows: " + rows); - if (err) return console.error(err); - rows.forEach((row: MediaRow) => { - console.log(`Deleting ${row.path}`); - fs.unlink(`uploads/${row.path}`, (err) => { - if (err) { - if(err.errno == -4058) { - console.log("File already deleted"); - db.all("DELETE FROM media WHERE path = ?", [row.path], (err: Error) => { - if (err) return console.error(err); - }); - } else { - console.error(err); - } - } else { - db.all("DELETE FROM media WHERE path = ?", [row.path], (err: Error) => { - if (err) return console.error(err); - }); - } - }); - console.log(`Deleted ${row.path}`); + db.each("SELECT path FROM media WHERE expire < ?", [Date.now()], (err: Error, row: MediaRow) => { + console.log(`Expired row: ${row}`); + fs.unlink(`uploads/${row.path}`, (err) => { + if (err && err.errno == -4058) { + console.log("File already deleted"); + } }); }); + + await expire("media", "expire", Date.now()); } setInterval(prune, 1000 * 60); //prune every minute \ No newline at end of file diff --git a/app/routes/middleware.ts b/app/routes/middleware.ts index 55ffbc0..e3138d3 100644 --- a/app/routes/middleware.ts +++ b/app/routes/middleware.ts @@ -121,7 +121,7 @@ export const handleUpload: Middleware = (req, res, next) => { next(); } -function insertToDB (filename: String, expireDate: Date, username: String, next: NextFunction) { +function insertToDB (filename: string, expireDate: Date, username: string, next: NextFunction) { let params: MediaParams = [ filename, expireDate, diff --git a/app/types/db.ts b/app/types/db.ts index a6f981a..c477574 100644 --- a/app/types/db.ts +++ b/app/types/db.ts @@ -1,7 +1,6 @@ import sqlite3 from "sqlite3"; import mkdirp from "mkdirp"; import crypto from "crypto"; -import { FileFilterCallback } from "multer"; mkdirp.sync("./uploads"); mkdirp.sync("./var/db"); @@ -9,7 +8,8 @@ mkdirp.sync("./var/db"); export const db = new sqlite3.Database("./var/db/media.db"); export function createUser(username: string, password: string) { - var salt = crypto.randomBytes(16); + let salt = crypto.randomBytes(16); + db.run("INSERT OR IGNORE INTO users (username, hashed_password, salt) VALUES (?, ?, ?)", [ username, crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256"), @@ -20,6 +20,7 @@ export function createUser(username: string, password: string) { export function getPath(id: number | string) { return new Promise((resolve, reject) => { let query: string = `SELECT path FROM media WHERE id = ?`; + db.get(query, [id], (err: Error, path: object) => { if (err) {reject(err)} resolve(path) @@ -30,6 +31,7 @@ export function getPath(id: number | string) { export function deleteId(database: string, id: number | string) { return new Promise((resolve, reject) => { let query: string = `DELETE FROM ${database} WHERE id = ?` + db.run(query, [id], (err: Error) => { if (err) {reject(err); return;} resolve(null) @@ -37,22 +39,40 @@ export function deleteId(database: string, id: number | string) { }) } +export function expire(database: string, column: string, expiration:number) { + return new Promise((resolve, reject) => { + let query: string = `SELECT * FROM ${database} WHERE ${column} < ?`; + + db.each(query, [expiration], async (err: Error, row: GenericRow) => { + await deleteId(database, row.id) + + resolve(null); + }); + }) +} + +export interface GenericRow { + id? : number | string, + username?: string + expire? :Date +} + export interface MediaRow { - id? : Number, - path: String, + id? : number | string, + path: string, expire: Date, - username?: String + username?: string } export type MediaParams = [ - path: String, + path: string, expire: Date, - username?: String + username?: string ] export interface UserRow { id? : Number, - username: String, + username: string, hashed_password: any, salt: any } \ No newline at end of file diff --git a/app/types/lib.ts b/app/types/lib.ts index 70b0ebd..9723274 100644 --- a/app/types/lib.ts +++ b/app/types/lib.ts @@ -7,7 +7,7 @@ declare global { } } -export function extension(str: String){ +export function extension(str: string){ let file = str.split("/").pop(); return [file.substr(0,file.lastIndexOf(".")),file.substr(file.lastIndexOf("."),file.length).toLowerCase()]; }