aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/GarbageCollector.ts87
-rw-r--r--src/server/authentication/controllers/user_controller.ts6
-rw-r--r--src/server/authentication/models/user_model.ts4
-rw-r--r--src/server/index.ts2
4 files changed, 58 insertions, 41 deletions
diff --git a/src/server/GarbageCollector.ts b/src/server/GarbageCollector.ts
index 59682e51e..ea5388004 100644
--- a/src/server/GarbageCollector.ts
+++ b/src/server/GarbageCollector.ts
@@ -59,7 +59,9 @@ function addDoc(doc: any, ids: string[], files: { [name: string]: string[] }) {
}
}
-async function GarbageCollect() {
+async function GarbageCollect(full: boolean = true) {
+ console.log("start GC");
+ const start = Date.now();
// await new Promise(res => setTimeout(res, 3000));
const cursor = await Database.Instance.query({}, { userDocumentId: 1 }, 'users');
const users = await cursor.toArray();
@@ -68,7 +70,7 @@ async function GarbageCollect() {
const files: { [name: string]: string[] } = {};
while (ids.length) {
- const count = Math.min(ids.length, 100);
+ const count = Math.min(ids.length, 1000);
const index = ids.length - count;
const fetchIds = ids.splice(index, count).filter(id => !visited.has(id));
if (!fetchIds.length) {
@@ -91,43 +93,58 @@ async function GarbageCollect() {
cursor.close();
- const toDeleteCursor = await Database.Instance.query({ _id: { $nin: Array.from(visited) } }, { _id: 1 });
+ const notToDelete = Array.from(visited);
+ const toDeleteCursor = await Database.Instance.query({ _id: { $nin: notToDelete } }, { _id: 1 });
const toDelete: string[] = (await toDeleteCursor.toArray()).map(doc => doc._id);
toDeleteCursor.close();
- let i = 0;
- let deleted = 0;
- while (i < toDelete.length) {
- const count = Math.min(toDelete.length, 5000);
- const toDeleteDocs = toDelete.slice(i, i + count);
- i += count;
- const result = await Database.Instance.delete({ _id: { $in: toDeleteDocs } }, "newDocuments");
- deleted += result.deletedCount || 0;
- }
- // const result = await Database.Instance.delete({ _id: { $in: toDelete } }, "newDocuments");
- console.log(`${deleted} documents deleted`);
+ if (!full) {
+ await Database.Instance.updateMany({ _id: { $nin: notToDelete } }, { $set: { "deleted": true } });
+ await Database.Instance.updateMany({ _id: { $in: notToDelete } }, { $unset: { "deleted": true } });
+ console.log(await Search.Instance.updateDocuments(
+ notToDelete.map<any>(id => ({
+ id, deleted: { set: null }
+ }))
+ .concat(toDelete.map(id => ({
+ id, deleted: { set: true }
+ })))));
+ console.log("Done with partial GC");
+ console.log(`Took ${(Date.now() - start) / 1000} seconds`);
+ } else {
+ let i = 0;
+ let deleted = 0;
+ while (i < toDelete.length) {
+ const count = Math.min(toDelete.length, 5000);
+ const toDeleteDocs = toDelete.slice(i, i + count);
+ i += count;
+ const result = await Database.Instance.delete({ _id: { $in: toDeleteDocs } }, "newDocuments");
+ deleted += result.deletedCount || 0;
+ }
+ // const result = await Database.Instance.delete({ _id: { $in: toDelete } }, "newDocuments");
+ console.log(`${deleted} documents deleted`);
- await Search.Instance.deleteDocuments(toDelete);
- console.log("Cleared search documents");
+ await Search.Instance.deleteDocuments(toDelete);
+ console.log("Cleared search documents");
- const folder = "./src/server/public/files/";
- fs.readdir(folder, (_, fileList) => {
- const filesToDelete = fileList.filter(file => {
- const ext = path.extname(file);
- let base = path.basename(file, ext);
- const existsInDb = (base in files || (base = base.substring(0, base.length - 2)) in files) && files[base].includes(ext);
- return file !== ".gitignore" && !existsInDb;
- });
- console.log(`Deleting ${filesToDelete.length} files`);
- filesToDelete.forEach(file => {
- console.log(`Deleting file ${file}`);
- try {
- fs.unlinkSync(folder + file);
- } catch {
- console.warn(`Couldn't delete file ${file}`);
- }
+ const folder = "./src/server/public/files/";
+ fs.readdir(folder, (_, fileList) => {
+ const filesToDelete = fileList.filter(file => {
+ const ext = path.extname(file);
+ let base = path.basename(file, ext);
+ const existsInDb = (base in files || (base = base.substring(0, base.length - 2)) in files) && files[base].includes(ext);
+ return file !== ".gitignore" && !existsInDb;
+ });
+ console.log(`Deleting ${filesToDelete.length} files`);
+ filesToDelete.forEach(file => {
+ console.log(`Deleting file ${file}`);
+ try {
+ fs.unlinkSync(folder + file);
+ } catch {
+ console.warn(`Couldn't delete file ${file}`);
+ }
+ });
+ console.log(`Deleted ${filesToDelete.length} files`);
});
- console.log(`Deleted ${filesToDelete.length} files`);
- });
+ }
}
-GarbageCollect();
+GarbageCollect(false);
diff --git a/src/server/authentication/controllers/user_controller.ts b/src/server/authentication/controllers/user_controller.ts
index fa1cd647d..0e431f1e6 100644
--- a/src/server/authentication/controllers/user_controller.ts
+++ b/src/server/authentication/controllers/user_controller.ts
@@ -52,7 +52,7 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => {
const password = req.body.password;
const model = {
- email: { type: email, unique: true },
+ email,
password,
userDocumentId: Utils.GenerateGuid()
} as Partial<DashUserModel>;
@@ -186,7 +186,7 @@ export let postForgot = function (req: Request, res: Response, next: NextFunctio
}
});
const mailOptions = {
- to: user.email.type,
+ to: user.email,
from: 'brownptcdash@gmail.com',
subject: 'Dash Password Reset',
text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
@@ -259,7 +259,7 @@ export let postReset = function (req: Request, res: Response) {
}
});
const mailOptions = {
- to: user.email.type,
+ to: user.email,
from: 'brownptcdash@gmail.com',
subject: 'Your password has been changed',
text: 'Hello,\n\n' +
diff --git a/src/server/authentication/models/user_model.ts b/src/server/authentication/models/user_model.ts
index fb62de1c8..45fbf23b1 100644
--- a/src/server/authentication/models/user_model.ts
+++ b/src/server/authentication/models/user_model.ts
@@ -16,7 +16,7 @@ mongoose.connection.on('disconnected', function () {
console.log('connection closed');
});
export type DashUserModel = mongoose.Document & {
- email: { type: String, unique: true },
+ email: String,
password: string,
passwordResetToken?: string,
passwordResetExpires?: Date,
@@ -42,7 +42,7 @@ export type AuthToken = {
};
const userSchema = new mongoose.Schema({
- email: { type: String, unique: true },
+ email: String,
password: String,
passwordResetToken: String,
passwordResetExpires: Date,
diff --git a/src/server/index.ts b/src/server/index.ts
index 37eabf4c8..9c0ec13c4 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -110,7 +110,7 @@ function addSecureRoute(method: Method,
if (req.user) {
handler(req.user, res, req);
} else {
- req.session!.target = `http://localhost:${port}${req.originalUrl}`;
+ req.session!.target = `${req.headers.host}${req.originalUrl}`;
onRejection(res, req);
}
};