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 indexRouter from "./routes/index";
import adduserRouter from "./routes/adduser"; import adduserRouter from "./routes/adduser";
import {db, createUser, MediaRow} from "./types/db"; import {db, expire, createUser, MediaRow} from "./types/db";
let app = express(); let app = express();
let server = http.createServer(app); let server = http.createServer(app);
@ -130,7 +130,7 @@ app.use("/", adduserRouter);
app.use("/uploads", express.static("uploads")); app.use("/uploads", express.static("uploads"));
function prune () { async function prune () {
db.all("SELECT * FROM media", (err: Error, rows: []) => { db.all("SELECT * FROM media", (err: Error, rows: []) => {
console.log("Uploaded files: " + rows.length); console.log("Uploaded files: " + rows.length);
console.log(rows); console.log(rows);
@ -139,30 +139,16 @@ function prune () {
console.log("Vacuuming database..."); console.log("Vacuuming database...");
db.run("VACUUM"); db.run("VACUUM");
db.all("SELECT * FROM media WHERE expire < ?", [Date.now()], (err: Error, rows: []) => { db.each("SELECT path FROM media WHERE expire < ?", [Date.now()], (err: Error, row: MediaRow) => {
console.log("Expired rows: " + rows); console.log(`Expired row: ${row}`);
if (err) return console.error(err); fs.unlink(`uploads/${row.path}`, (err) => {
rows.forEach((row: MediaRow) => { if (err && err.errno == -4058) {
console.log(`Deleting ${row.path}`); console.log("File already deleted");
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}`);
}); });
}); });
await expire("media", "expire", Date.now());
} }
setInterval(prune, 1000 * 60); //prune every minute setInterval(prune, 1000 * 60); //prune every minute

View file

@ -121,7 +121,7 @@ export const handleUpload: Middleware = (req, res, next) => {
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 = [ let params: MediaParams = [
filename, filename,
expireDate, expireDate,

View file

@ -1,7 +1,6 @@
import sqlite3 from "sqlite3"; import sqlite3 from "sqlite3";
import mkdirp from "mkdirp"; import mkdirp from "mkdirp";
import crypto from "crypto"; import crypto from "crypto";
import { FileFilterCallback } from "multer";
mkdirp.sync("./uploads"); mkdirp.sync("./uploads");
mkdirp.sync("./var/db"); mkdirp.sync("./var/db");
@ -9,7 +8,8 @@ mkdirp.sync("./var/db");
export const db = new sqlite3.Database("./var/db/media.db"); export const db = new sqlite3.Database("./var/db/media.db");
export function createUser(username: string, password: string) { 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 (?, ?, ?)", [ db.run("INSERT OR IGNORE INTO users (username, hashed_password, salt) VALUES (?, ?, ?)", [
username, username,
crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256"), crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256"),
@ -20,6 +20,7 @@ export function createUser(username: string, password: string) {
export function getPath(id: number | string) { export function getPath(id: number | string) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let query: string = `SELECT path FROM media WHERE id = ?`; let query: string = `SELECT path FROM media WHERE id = ?`;
db.get(query, [id], (err: Error, path: object) => { db.get(query, [id], (err: Error, path: object) => {
if (err) {reject(err)} if (err) {reject(err)}
resolve(path) resolve(path)
@ -30,6 +31,7 @@ export function getPath(id: number | string) {
export function deleteId(database: string, id: number | string) { export function deleteId(database: string, id: number | string) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let query: string = `DELETE FROM ${database} WHERE id = ?` let query: string = `DELETE FROM ${database} WHERE id = ?`
db.run(query, [id], (err: Error) => { db.run(query, [id], (err: Error) => {
if (err) {reject(err); return;} if (err) {reject(err); return;}
resolve(null) 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 { export interface MediaRow {
id? : Number, id? : number | string,
path: String, path: string,
expire: Date, expire: Date,
username?: String username?: string
} }
export type MediaParams = [ export type MediaParams = [
path: String, path: string,
expire: Date, expire: Date,
username?: String username?: string
] ]
export interface UserRow { export interface UserRow {
id? : Number, id? : Number,
username: String, username: string,
hashed_password: any, hashed_password: any,
salt: 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(); let file = str.split("/").pop();
return [file.substr(0,file.lastIndexOf(".")),file.substr(file.lastIndexOf("."),file.length).toLowerCase()]; return [file.substr(0,file.lastIndexOf(".")),file.substr(file.lastIndexOf("."),file.length).toLowerCase()];
} }