use job system for deleting mailbox

This commit is contained in:
Son 2021-10-13 11:40:15 +02:00
parent 3a0b125323
commit fbabe6fb44
4 changed files with 50 additions and 10 deletions

View File

@ -1,10 +1,12 @@
from smtplib import SMTPRecipientsRefused from smtplib import SMTPRecipientsRefused
import arrow
from flask import g from flask import g
from flask import jsonify from flask import jsonify
from flask import request from flask import request
from app.api.base import api_bp, require_api_auth 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 import send_verification_email
from app.dashboard.views.mailbox_detail import verify_mailbox_change from app.dashboard.views.mailbox_detail import verify_mailbox_change
from app.db import Session from app.db import Session
@ -13,7 +15,8 @@ from app.email_utils import (
email_can_be_used_as_mailbox, email_can_be_used_as_mailbox,
is_valid_email, 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 from app.utils import sanitize_email
@ -88,8 +91,14 @@ def delete_mailbox(mailbox_id):
if mailbox.id == user.default_mailbox_id: if mailbox.id == user.default_mailbox_id:
return jsonify(error="You cannot delete the default mailbox"), 400 return jsonify(error="You cannot delete the default mailbox"), 400
Mailbox.delete(mailbox_id) # Schedule delete account job
Session.commit() 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 return jsonify(deleted=True), 200

View File

@ -255,6 +255,7 @@ JOB_ONBOARDING_3 = "onboarding-3"
JOB_ONBOARDING_4 = "onboarding-4" JOB_ONBOARDING_4 = "onboarding-4"
JOB_BATCH_IMPORT = "batch-import" JOB_BATCH_IMPORT = "batch-import"
JOB_DELETE_ACCOUNT = "delete-account" JOB_DELETE_ACCOUNT = "delete-account"
JOB_DELETE_MAILBOX = "delete-mailbox"
# for pagination # for pagination
PAGE_LIMIT = 20 PAGE_LIMIT = 20

View File

@ -1,5 +1,4 @@
from threading import Thread import arrow
from flask import render_template, request, redirect, url_for, flash from flask import render_template, request, redirect, url_for, flash
from flask_login import login_required, current_user from flask_login import login_required, current_user
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
@ -7,7 +6,7 @@ from itsdangerous import Signer
from wtforms import validators from wtforms import validators
from wtforms.fields.html5 import EmailField 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.dashboard.base import dashboard_bp
from app.db import Session from app.db import Session
from app.email_utils import ( from app.email_utils import (
@ -18,7 +17,7 @@ from app.email_utils import (
is_valid_email, is_valid_email,
) )
from app.log import LOG from app.log import LOG
from app.models import Mailbox from app.models import Mailbox, Job
class NewMailboxForm(FlaskForm): class NewMailboxForm(FlaskForm):
@ -51,8 +50,15 @@ def mailbox_route():
flash("You cannot delete default mailbox", "error") flash("You cannot delete default mailbox", "error")
return redirect(url_for("dashboard.mailbox_route")) return redirect(url_for("dashboard.mailbox_route"))
LOG.d("Schedule deleting %s", mailbox) # Schedule delete account job
Thread(target=delete_mailbox, args=(mailbox.id,)).start() 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( flash(
f"Mailbox {mailbox.email} scheduled for deletion." f"Mailbox {mailbox.email} scheduled for deletion."
f"You will receive a confirmation email when the deletion is finished", f"You will receive a confirmation email when the deletion is finished",

View File

@ -12,6 +12,7 @@ from app.config import (
JOB_ONBOARDING_4, JOB_ONBOARDING_4,
JOB_BATCH_IMPORT, JOB_BATCH_IMPORT,
JOB_DELETE_ACCOUNT, JOB_DELETE_ACCOUNT,
JOB_DELETE_MAILBOX,
) )
from app.db import Session from app.db import Session
from app.email_utils import ( from app.email_utils import (
@ -20,7 +21,7 @@ from app.email_utils import (
) )
from app.import_utils import handle_batch_import from app.import_utils import handle_batch_import
from app.log import LOG 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 from server import create_light_app
@ -163,6 +164,29 @@ if __name__ == "__main__":
render("transactional/account-delete.txt"), render("transactional/account-delete.txt"),
render("transactional/account-delete.html"), 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: else:
LOG.e("Unknown job name %s", job.name) LOG.e("Unknown job name %s", job.name)