Files
myDrive/serverUtils/removeOldSubscriptionData.js
2020-11-23 21:51:08 -05:00

204 lines
5.6 KiB
JavaScript

const getEnvVariables = require("../dist/enviroment/getEnvVariables");
getEnvVariables()
const mongoose = require("./mongoServerUtil");
const conn = mongoose.connection;
const env = require("../dist/enviroment/env")
const DbUtilsFile = require("../dist/db/utils/fileUtils/index")
const dbUtilsFile = new DbUtilsFile();
const Thumbnail = require("../dist/models/thumbnail");
const removeChunksFS = require("../dist/services/ChunkService/utils/removeChunksFS");
const File = require("../dist/models/file");
const mongod = require("mongodb");
const ObjectID = mongod.ObjectID;
const User = require('../dist/models/user');
const s3 = require("../dist/db/s3");
const Stripe = require("stripe")
const removeChunksS3 = require("../dist/services/ChunkService/utils/removeChunksS3");
const getKey = require("../key/getKey");
const stripKey = env.stripeKey;
const DAY_LIMIT = 30;
const waitForDatabase = () => {
return new Promise((resolve, reject) => {
if (conn.readyState !== 1) {
conn.once("open", () => {
resolve();
})
} else {
resolve();
}
})
}
const mongoRemoveChunks = async(fileList) => {
for (const file of fileList) {
const fileID = file._id;
let bucket = new mongoose.mongo.GridFSBucket(conn.db, {
chunkSizeBytes: 1024 * 255,
});
if (file.metadata.thumbnailID) {
await Thumbnail.deleteOne({_id: file.metadata.thumbnailID});
}
await bucket.delete(new ObjectID(fileID));
}
}
const fsRemoveChunks = async(fileList) => {
for (const file of fileList) {
if (file.metadata.thumbnailID) {
const thumbnail = await Thumbnail.findById(file.metadata.thumbnailID)
const thumbnailPath = thumbnail.path;
await removeChunksFS(thumbnailPath);
await Thumbnail.deleteOne({_id: file.metadata.thumbnailID});
}
await removeChunksFS(file.metadata.filePath);
await File.deleteOne({_id: file._id});
}
}
const s3RemoveChunks = async(fileList) => {
for (const file of fileList) {
const s3Storage = s3;
const bucket = env.s3Bucket;
if (file.metadata.thumbnailID) {
const thumbnail = await Thumbnail.findById(file.metadata.thumbnailID);
const paramsThumbnail = {Bucket: bucket, Key: thumbnail.s3ID};
await removeChunksS3(s3Storage, paramsThumbnail);
await Thumbnail.deleteOne({_id: file.metadata.thumbnailID});
}
const params = {Bucket: bucket, Key: file.metadata.s3ID};
await removeChunksS3(s3Storage, params);
await File.deleteOne({_id: file._id});
}
}
const removeChunkData = async(user) => {
const fileList = await conn.db.collection("fs.files").find({
"metadata.owner": user._id,
"metadata.personalFile": null,
}).toArray();
// console.log("file list", fileList.length);
if (env.dbType === "mongo") {
await mongoRemoveChunks(fileList);
} else if (env.dbType === "fs") {
await fsRemoveChunks(fileList);
} else {
await s3RemoveChunks(fileList);
}
}
const removeFolders = async(user) => {
// console.log("removing folders", user._id)
await conn.db.collection("folders").deleteMany({
owner: user._id.toString(),
personalFolder: null
})
}
const removeOldSubscriptionData = async() => {
console.log("Getting Encryption Password");
await getKey();
console.log("Got encryption key\n")
console.log("Waiting for mongoDB Database...");
await waitForDatabase();
console.log("MongoDB Connection established\n")
console.log("Starting expire data check...")
const allUsers = await User.find({});
console.log("All users length", allUsers.length);
for (const currentUser of allUsers) {
if (currentUser.stripeCanceledDate) {
let date = new Date(currentUser.stripeCanceledDate);
date.setDate(date.getDate() + DAY_LIMIT);
const nowDate = new Date();
if (date.getTime() <= nowDate) {
console.log(`\nUser ${currentUser.email} over expire limit, deleting data...`);
await removeChunkData(currentUser)
await removeFolders(currentUser)
console.log(`Removed user ${currentUser.email} data successfully`);
}
} else if (currentUser.stripeEnabled) {
const stripe = new Stripe(stripKey, {
apiVersion: '2020-03-02',
});
const {subID}= await currentUser.decryptStripeData();
const subscriptionDetails = await stripe.subscriptions.retrieve(subID);
if (subscriptionDetails.status !== "active" && subscriptionDetails.status !== "trailing") {
const endedAt = (subscriptionDetails.ended_at * 1000);
let date = new Date(endedAt);
date.setDate(date.getDate() + DAY_LIMIT);
const nowDate = new Date();
if (date.getTime() <= nowDate) {
console.log(`\nUser ${currentUser.email} over expire limit, deleting data...`);
await removeChunkData(currentUser)
await removeFolders(currentUser)
console.log(`Removed user ${currentUser.email} data successfully`);
}
}
}
}
console.log("\nFinished removing all expired data")
process.exit()
}
removeOldSubscriptionData()