cleaner prune function
This commit is contained in:
parent
135c772723
commit
0a0d9b9802
4 changed files with 40 additions and 34 deletions
34
app/app.ts
34
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
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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()];
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue