From fbabe6fb444ad0820c8f07ef3836c23aef829478 Mon Sep 17 00:00:00 2001 From: Son Date: Wed, 13 Oct 2021 11:40:15 +0200 Subject: [PATCH] use job system for deleting mailbox --- app/api/views/mailbox.py | 15 ++++++++++++--- app/config.py | 1 + app/dashboard/views/mailbox.py | 18 ++++++++++++------ job_runner.py | 26 +++++++++++++++++++++++++- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/app/api/views/mailbox.py b/app/api/views/mailbox.py index 87f9dc79..d235d390 100644 --- a/app/api/views/mailbox.py +++ b/app/api/views/mailbox.py @@ -1,10 +1,12 @@ from smtplib import SMTPRecipientsRefused +import arrow from flask import g from flask import jsonify from flask import request from app.api.base import api_bp, require_api_auth +from app.config import JOB_DELETE_MAILBOX from app.dashboard.views.mailbox import send_verification_email from app.dashboard.views.mailbox_detail import verify_mailbox_change from app.db import Session @@ -13,7 +15,8 @@ from app.email_utils import ( email_can_be_used_as_mailbox, is_valid_email, ) -from app.models import Mailbox +from app.log import LOG +from app.models import Mailbox, Job from app.utils import sanitize_email @@ -88,8 +91,14 @@ def delete_mailbox(mailbox_id): if mailbox.id == user.default_mailbox_id: return jsonify(error="You cannot delete the default mailbox"), 400 - Mailbox.delete(mailbox_id) - Session.commit() + # Schedule delete account job + LOG.w("schedule delete mailbox job for %s", mailbox) + Job.create( + name=JOB_DELETE_MAILBOX, + payload={"mailbox_id": mailbox.id}, + run_at=arrow.now(), + commit=True, + ) return jsonify(deleted=True), 200 diff --git a/app/config.py b/app/config.py index 2553e3f0..69e8ec1c 100644 --- a/app/config.py +++ b/app/config.py @@ -255,6 +255,7 @@ JOB_ONBOARDING_3 = "onboarding-3" JOB_ONBOARDING_4 = "onboarding-4" JOB_BATCH_IMPORT = "batch-import" JOB_DELETE_ACCOUNT = "delete-account" +JOB_DELETE_MAILBOX = "delete-mailbox" # for pagination PAGE_LIMIT = 20 diff --git a/app/dashboard/views/mailbox.py b/app/dashboard/views/mailbox.py index c69d9a55..ef5bf42d 100644 --- a/app/dashboard/views/mailbox.py +++ b/app/dashboard/views/mailbox.py @@ -1,5 +1,4 @@ -from threading import Thread - +import arrow from flask import render_template, request, redirect, url_for, flash from flask_login import login_required, current_user from flask_wtf import FlaskForm @@ -7,7 +6,7 @@ from itsdangerous import Signer from wtforms import validators from wtforms.fields.html5 import EmailField -from app.config import MAILBOX_SECRET, URL +from app.config import MAILBOX_SECRET, URL, JOB_DELETE_MAILBOX from app.dashboard.base import dashboard_bp from app.db import Session from app.email_utils import ( @@ -18,7 +17,7 @@ from app.email_utils import ( is_valid_email, ) from app.log import LOG -from app.models import Mailbox +from app.models import Mailbox, Job class NewMailboxForm(FlaskForm): @@ -51,8 +50,15 @@ def mailbox_route(): flash("You cannot delete default mailbox", "error") return redirect(url_for("dashboard.mailbox_route")) - LOG.d("Schedule deleting %s", mailbox) - Thread(target=delete_mailbox, args=(mailbox.id,)).start() + # Schedule delete account job + LOG.w("schedule delete mailbox job for %s", mailbox) + Job.create( + name=JOB_DELETE_MAILBOX, + payload={"mailbox_id": mailbox.id}, + run_at=arrow.now(), + commit=True, + ) + flash( f"Mailbox {mailbox.email} scheduled for deletion." f"You will receive a confirmation email when the deletion is finished", diff --git a/job_runner.py b/job_runner.py index f0a9fa7e..b32ebe28 100644 --- a/job_runner.py +++ b/job_runner.py @@ -12,6 +12,7 @@ from app.config import ( JOB_ONBOARDING_4, JOB_BATCH_IMPORT, JOB_DELETE_ACCOUNT, + JOB_DELETE_MAILBOX, ) from app.db import Session from app.email_utils import ( @@ -20,7 +21,7 @@ from app.email_utils import ( ) from app.import_utils import handle_batch_import from app.log import LOG -from app.models import User, Job, BatchImport +from app.models import User, Job, BatchImport, Mailbox from server import create_light_app @@ -163,6 +164,29 @@ if __name__ == "__main__": render("transactional/account-delete.txt"), render("transactional/account-delete.html"), ) + elif job.name == JOB_DELETE_MAILBOX: + mailbox_id = job.payload.get("mailbox_id") + mailbox = Mailbox.get(mailbox_id) + if not mailbox: + continue + + mailbox_email = mailbox.email + user = mailbox.user + + Mailbox.delete(mailbox_id) + Session.commit() + LOG.d("Mailbox %s %s deleted", mailbox_id, mailbox_email) + + send_email( + user.email, + f"Your mailbox {mailbox_email} has been deleted", + f"""Mailbox {mailbox_email} along with its aliases are deleted successfully. + + Regards, + SimpleLogin team. + """, + ) + else: LOG.e("Unknown job name %s", job.name)