diff --git a/app/controllers/api.py b/app/controllers/api.py index f84f72c..1389155 100644 --- a/app/controllers/api.py +++ b/app/controllers/api.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import logging +import config from flask import request, jsonify, abort from app import app from app.models.site import Site @@ -88,3 +89,28 @@ def new_comment(): abort(400) return "OK" + + +@app.route("/report", methods=['GET']) +def report(): + + try: + token = request.args.get('token', '') + secret = request.args.get('secret', '') + + if secret != config.SECRET: + logger.warn('Unauthorized request') + abort(401) + + site = Site.select().where(Site.token == token).get() + if site is None: + logger.warn('Unknown site %s' % token) + abort(404) + + processor.enqueue({'request': 'report', 'data': token}) + + except: + logger.exception("report failure") + abort(500) + + return "OK" \ No newline at end of file diff --git a/app/models/report.py b/app/models/report.py new file mode 100644 index 0000000..e6102d1 --- /dev/null +++ b/app/models/report.py @@ -0,0 +1,22 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from peewee import Model +from peewee import CharField +from peewee import BooleanField +from peewee import ForeignKeyField +from app.services.database import get_db +from app.models.site import Site + +class Report(Model): + name = CharField(unique=True) + email = CharField() + url = CharField() + published = BooleanField() + rejected = BooleanField() + subscribed = BooleanField() + unsubscribed = BooleanField() + site = ForeignKeyField(Site, related_name='report_site') + + class Meta: + database = get_db() diff --git a/app/services/database.py b/app/services/database.py index 5d17f27..0075e13 100644 --- a/app/services/database.py +++ b/app/services/database.py @@ -24,5 +24,6 @@ def setup(db): from app.models.site import Site from app.models.comment import Comment from app.models.reader import Reader + from app.models.report import Report - db.create_tables([Site, Comment, Reader], safe=True) + db.create_tables([Site, Comment, Reader, Report], safe=True) diff --git a/app/services/processor.py b/app/services/processor.py index dfe3cfb..a8199d1 100644 --- a/app/services/processor.py +++ b/app/services/processor.py @@ -39,6 +39,8 @@ class Processor(Thread): reply_comment_email(msg['data']) elif msg['request'] == 'unsubscribe': unsubscribe_reader(msg['data']) + elif msg['request'] == 'report': + report(msg['data']) else: logger.info("throw unknown request " + str(msg)) except: @@ -123,11 +125,17 @@ def reply_comment_email(data): # safe logic: no answer or unknown answer is a go for publishing if message[:2].upper() == 'NO': + # report event + report_rejected(comment) + logger.info('discard comment: %d' % comment_id) comment.delete_instance() email_body = get_template('drop_comment').render(original=message) mail(from_email, 'Re: ' + subject, email_body) else: + # report event + report_published(comment) + # update Comment row comment.published = datetime.now().strftime("%Y-%m-%d %H:%M:%S") comment.save() @@ -169,6 +177,9 @@ def subscribe_reader(email, token, url): reader = Reader(site=site, email=email, url=url) reader.save() + # report event + report_subscribed(reader) + def unsubscribe_reader(data): token = data.get('token', '') @@ -178,6 +189,9 @@ def unsubscribe_reader(data): for reader in Reader.select().join(Site).where(Site.token == token, Reader.email == email, Reader.url == url): + # report event + report_unsubscribed(reader) + reader.delete_instance() @@ -203,6 +217,29 @@ def notify_reader(from_email, to_email, token, url): mail(to_email, subject, email_body) +def report_rejected(comment): + pass + + +def report_published(comment): + pass + + +def report_subscribed(comment): + pass + + +def report_unsubscribed(comment): + pass + + +def report(token): + print('report requested for {}'.format(token)) + standby_count = Comment.select().join(Site).where( + Site.token == token, Comment.published.is_null(True)).count() + print('standby {}'.format(standby_count)) + + def mail(to_email, subject, message): headers = {'Content-Type': 'application/json; charset=utf-8'} diff --git a/config.py b/config.py index e5a2517..7e5298c 100644 --- a/config.py +++ b/config.py @@ -14,4 +14,6 @@ HTTP_PORT = 8000 SALT = "BRRJRqXgGpXWrgTidBPcixIThHpDuKc0" +SECRET = "Uqca5Kc8xuU6THz9" + UNSUBSCRIBE_URL = 'http://localhost:8000/unsubscribe'