cleaner prune function

This commit is contained in:
waveringana 2022-12-11 06:20:48 +00:00
parent 135c772723
commit 0a0d9b9802
4 changed files with 40 additions and 34 deletions

View file

@ -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}`);
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) {
if(err.errno == -4058) {
if (err && 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}`);
});
});
await expire("media", "expire", Date.now());
}
setInterval(prune, 1000 * 60); //prune every minute

View file

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

View file

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

View file

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