184 lines
5.0 KiB
Python
Raw Normal View History

2015-05-02 13:43:38 +02:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2017-07-09 17:13:41 +02:00
import time
2015-05-02 13:43:38 +02:00
import logging
2015-09-06 18:58:07 +02:00
import config
2017-07-08 20:21:39 +02:00
from sanic import response
2015-05-02 13:43:38 +02:00
from app import app
2015-05-02 20:24:56 +02:00
from app.models.site import Site
from app.models.comment import Comment
from app.helpers.hashing import md5
from app.services import processor
2015-05-02 13:43:38 +02:00
logger = logging.getLogger(__name__)
2017-07-09 17:13:41 +02:00
cache = {}
cache_time = 0
def get_cached(key):
global cache
global cache_time
value = cache.get(key,None)
2017-07-09 17:18:30 +02:00
if (time.time() - cache_time) > 120:
2017-07-09 17:13:41 +02:00
cache = {}
cache_time = time.time()
return value
def set_cached(key, value):
global cache
cache[key] = value
2015-05-02 13:43:38 +02:00
@app.route("/comments", methods=['GET'])
2017-07-08 20:21:39 +02:00
def query_comments(request):
2015-05-02 20:24:56 +02:00
comments = []
try:
token = request.args.get('token', '')
url = request.args.get('url', '')
2015-05-02 20:24:56 +02:00
logger.info('retrieve comments for token %s, url %s' % (token, url))
for comment in Comment.select(Comment).join(Site).where(
2015-05-18 13:23:24 +02:00
(Comment.url == url) &
(Comment.published.is_null(False)) &
(Site.token == token)).order_by(+Comment.published):
d = {}
d['author'] = comment.author_name
d['content'] = comment.content
if comment.author_site:
d['site'] = comment.author_site
if comment.author_email:
d['avatar'] = md5(comment.author_email.strip().lower())
d['date'] = comment.published.strftime("%Y-%m-%d %H:%M:%S")
2016-05-09 13:10:11 +02:00
logger.debug(d)
comments.append(d)
2017-07-08 20:21:39 +02:00
r = response.json({'data': comments})
except:
logger.warn('bad request')
2017-07-08 20:21:39 +02:00
r = response.json({'data': []}, status=400)
2015-05-02 20:24:56 +02:00
return r
2017-07-09 15:55:40 +02:00
async def get_cached_comments_count(request):
try:
token = request.args.get('token', '')
url = request.args.get('url', '')
2017-07-09 16:53:58 +02:00
key = '%s:%s' % (token, url)
count = get_cached(key)
if count is None:
count = Comment.select(Comment).join(Site).where(
(Comment.url == url) &
(Comment.published.is_null(False)) &
(Site.token == token)).count()
set_cached(key, count)
2017-07-09 15:55:40 +02:00
r = {'count': count}
except:
2017-07-09 16:53:58 +02:00
logger.exception("cache exception")
2017-07-09 15:55:40 +02:00
r = {'count': 0}
return r
2015-05-10 12:44:04 +02:00
2017-07-09 15:55:40 +02:00
@app.route("/comments/count", methods=['GET'])
async def get_comments_count(request):
return response.json(await get_cached_comments_count(request))
2017-07-09 11:42:36 +02:00
@app.route("/comments", methods=['OPTIONS'])
def option_comments(request):
return response.text('OK')
@app.route("/comments", methods=['POST'])
2017-07-08 20:21:39 +02:00
def new_comment(request):
2015-05-10 12:44:04 +02:00
try:
2017-07-09 11:27:16 +02:00
data = request.json
logger.info(data)
2015-05-10 12:44:04 +02:00
# validate token: retrieve site entity
token = data.get('token', '')
site = Site.select().where(Site.token == token).get()
if site is None:
logger.warn('Unknown site %s' % token)
2017-07-08 20:21:39 +02:00
return response.text('BAD_REQUEST', status=400)
2015-05-10 12:44:04 +02:00
# honeypot for spammers
captcha = data.get('captcha', '')
2015-05-10 12:44:04 +02:00
if captcha:
logger.warn('discard spam: data %s' % data)
2017-07-08 20:21:39 +02:00
return response.text('BAD_REQUEST', status=400)
processor.enqueue({'request': 'new_comment', 'data': data})
2015-05-10 12:44:04 +02:00
except:
logger.exception("new comment failure")
2017-07-08 20:21:39 +02:00
return response.text('BAD_REQUEST', status=400)
2015-05-10 12:44:04 +02:00
2017-07-08 20:21:39 +02:00
return response.text('OK')
2015-09-06 18:58:07 +02:00
@app.route("/report", methods=['GET'])
2017-07-08 20:21:39 +02:00
def report(request):
2015-09-06 18:58:07 +02:00
try:
token = request.args.get('token', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
2017-07-08 20:21:39 +02:00
return response.text('UNAUTHORIZED', status=401)
2015-09-06 18:58:07 +02:00
site = Site.select().where(Site.token == token).get()
if site is None:
logger.warn('Unknown site %s' % token)
2017-07-08 20:21:39 +02:00
return response.text('', status=404)
2015-09-06 18:58:07 +02:00
processor.enqueue({'request': 'report', 'data': token})
2015-09-20 12:33:42 +02:00
2015-09-06 18:58:07 +02:00
except:
logger.exception("report failure")
2017-07-08 20:21:39 +02:00
return response.text('ERROR', status=500)
2015-09-06 18:58:07 +02:00
2017-07-08 20:21:39 +02:00
return response.text('OK')
2015-09-20 12:33:42 +02:00
@app.route("/accept", methods=['GET'])
2017-07-08 20:21:39 +02:00
def accept_comment(request):
2015-09-20 12:33:42 +02:00
try:
2015-09-20 12:39:09 +02:00
id = request.args.get('comment', '')
2015-09-20 12:33:42 +02:00
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
2017-07-08 20:21:39 +02:00
return response.text('UNAUTHORIZED', status=401)
2015-09-20 12:33:42 +02:00
processor.enqueue({'request': 'late_accept', 'data': id})
except:
logger.exception("accept failure")
2017-07-08 20:21:39 +02:00
return response.text('', status=500)
2015-09-20 12:33:42 +02:00
2017-07-08 20:21:39 +02:00
return response.text('PUBLISHED')
2015-09-20 12:33:42 +02:00
@app.route("/reject", methods=['GET'])
2017-07-08 20:21:39 +02:00
def reject_comment(request):
2015-09-20 12:33:42 +02:00
try:
2015-09-20 12:39:09 +02:00
id = request.args.get('comment', '')
2015-09-20 12:33:42 +02:00
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
2017-07-08 20:21:39 +02:00
return response.text('UNAUTHORIZED', status=401)
2015-09-20 12:33:42 +02:00
processor.enqueue({'request': 'late_reject', 'data': id})
except:
logger.exception("reject failure")
2017-07-08 20:21:39 +02:00
return response.text('ERROR', status=500)
2015-09-20 12:33:42 +02:00
2017-07-08 20:21:39 +02:00
return response.text('REJECTED')