summaryrefslogtreecommitdiff
path: root/service/pixelated/resources/mails_resource.py
diff options
context:
space:
mode:
Diffstat (limited to 'service/pixelated/resources/mails_resource.py')
-rw-r--r--service/pixelated/resources/mails_resource.py90
1 files changed, 69 insertions, 21 deletions
diff --git a/service/pixelated/resources/mails_resource.py b/service/pixelated/resources/mails_resource.py
index c4b578ba..93a19a9b 100644
--- a/service/pixelated/resources/mails_resource.py
+++ b/service/pixelated/resources/mails_resource.py
@@ -1,12 +1,15 @@
import json
from pixelated.adapter.services.mail_sender import SMTPDownException
from pixelated.adapter.model.mail import InputMail
-from pixelated.resources import respond_json, respond_json_deferred
+from twisted.web.server import NOT_DONE_YET
+from pixelated.resources import respond_json_deferred
from twisted.web.resource import Resource
from twisted.web import server
+from twisted.internet import defer
+from twisted.python.log import err
from leap.common.events import (
register,
- events_pb2 as proto
+ catalog as events
)
@@ -19,9 +22,15 @@ class MailsUnreadResource(Resource):
def render_POST(self, request):
idents = json.load(request.content).get('idents')
+ deferreds = []
for ident in idents:
- self._mail_service.mark_as_unread(ident)
- return respond_json(None, request)
+ deferreds.append(self._mail_service.mark_as_unread(ident))
+
+ d = defer.gatherResults(deferreds, consumeErrors=True)
+ d.addCallback(lambda _: respond_json_deferred(None, request))
+ d.addErrback(lambda _: respond_json_deferred(None, request, status_code=500))
+
+ return NOT_DONE_YET
class MailsReadResource(Resource):
@@ -33,10 +42,15 @@ class MailsReadResource(Resource):
def render_POST(self, request):
idents = json.load(request.content).get('idents')
+ deferreds = []
for ident in idents:
- self._mail_service.mark_as_read(ident)
+ deferreds.append(self._mail_service.mark_as_read(ident))
+
+ d = defer.gatherResults(deferreds, consumeErrors=True)
+ d.addCallback(lambda _: respond_json_deferred(None, request))
+ d.addErrback(lambda _: respond_json_deferred(None, request, status_code=500))
- return respond_json(None, request)
+ return NOT_DONE_YET
class MailsDeleteResource(Resource):
@@ -47,10 +61,19 @@ class MailsDeleteResource(Resource):
self._mail_service = mail_service
def render_POST(self, request):
+ def response_failed(failure):
+ err(failure, 'something failed')
+ request.finish()
+
idents = json.loads(request.content.read())['idents']
+ deferreds = []
for ident in idents:
- self._mail_service.delete_mail(ident)
- return respond_json(None, request)
+ deferreds.append(self._mail_service.delete_mail(ident))
+
+ d = defer.gatherResults(deferreds, consumeErrors=True)
+ d.addCallback(lambda _: respond_json_deferred(None, request))
+ d.addErrback(response_failed)
+ return NOT_DONE_YET
class MailsRecoverResource(Resource):
@@ -62,9 +85,13 @@ class MailsRecoverResource(Resource):
def render_POST(self, request):
idents = json.loads(request.content.read())['idents']
+ deferreds = []
for ident in idents:
- self._mail_service.recover_mail(ident)
- return respond_json(None, request)
+ deferreds.append(self._mail_service.recover_mail(ident))
+ d = defer.gatherResults(deferreds, consumeErrors=True)
+ d.addCallback(lambda _: respond_json_deferred(None, request))
+ d.addErrback(lambda _: respond_json_deferred(None, request, status_code=500))
+ return NOT_DONE_YET
class MailsResource(Resource):
@@ -75,7 +102,7 @@ class MailsResource(Resource):
delivery_error_mail = InputMail.delivery_error_template(delivery_address=event.content)
self._mail_service.mailboxes.inbox.add(delivery_error_mail)
- register(signal=proto.SMTP_SEND_MESSAGE_ERROR, callback=on_error)
+ register(events.SMTP_SEND_MESSAGE_ERROR, callback=on_error)
def __init__(self, mail_service, draft_service):
Resource.__init__(self)
@@ -90,16 +117,22 @@ class MailsResource(Resource):
def render_GET(self, request):
query, window_size, page = request.args.get('q')[0], request.args.get('w')[0], request.args.get('p')[0]
- mails, total = self._mail_service.mails(query, window_size, page)
+ d = self._mail_service.mails(query, window_size, page)
- response = {
+ d.addCallback(lambda (mails, total): {
"stats": {
"total": total,
},
"mails": [mail.as_dict() for mail in mails]
- }
+ })
+ d.addCallback(lambda res: respond_json_deferred(res, request))
+
+ def error_handler(error):
+ print error
- return respond_json(response, request)
+ d.addErrback(error_handler)
+
+ return NOT_DONE_YET
def render_POST(self, request):
content_dict = json.loads(request.content.read())
@@ -114,7 +147,8 @@ class MailsResource(Resource):
if isinstance(error.value, SMTPDownException):
respond_json_deferred({'message': str(error.value)}, request, status_code=503)
else:
- respond_json_deferred({'message': str(error)}, request, status_code=422)
+ err(error, 'something failed')
+ respond_json_deferred({'message': 'an error occurred while sending'}, request, status_code=422)
deferred.addCallback(onSuccess)
deferred.addErrback(onError)
@@ -126,11 +160,25 @@ class MailsResource(Resource):
_mail = InputMail.from_dict(content_dict)
draft_id = content_dict.get('ident')
+ def defer_response(deferred):
+ deferred.addCallback(lambda pixelated_mail: respond_json_deferred({'ident': pixelated_mail.ident}, request))
+
if draft_id:
- if not self._mail_service.mail_exists(draft_id):
- return respond_json("", request, status_code=422)
- pixelated_mail = self._draft_service.update_draft(draft_id, _mail)
+ deferred_check = self._mail_service.mail_exists(draft_id)
+
+ def handleDuplicatedDraftException(error):
+ respond_json_deferred("", request, status_code=422)
+
+ def return422otherwise(mail_exists):
+ if not mail_exists:
+ respond_json_deferred("", request, status_code=422)
+ else:
+ new_draft = self._draft_service.update_draft(draft_id, _mail)
+ new_draft.addErrback(handleDuplicatedDraftException)
+ defer_response(new_draft)
+
+ deferred_check.addCallback(return422otherwise)
else:
- pixelated_mail = self._draft_service.create_draft(_mail)
+ defer_response(self._draft_service.create_draft(_mail))
- return respond_json({'ident': pixelated_mail.ident}, request)
+ return server.NOT_DONE_YET