You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
stacosys/app/controllers/api.py

160 lines
4.1 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
9 years ago
import config
from flask import request, jsonify, abort
from app import app
7 years ago
from app import cache
from app.models.site import Site
from app.models.comment import Comment
from app.helpers.hashing import md5
from app.services import processor
logger = logging.getLogger(__name__)
@app.route("/comments", methods=['GET'])
def query_comments():
comments = []
try:
token = request.args.get('token', '')
url = request.args.get('url', '')
logger.info('retrieve comments for token %s, url %s' % (token, url))
for comment in Comment.select(Comment).join(Site).where(
10 years ago
(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")
logger.debug(d)
comments.append(d)
r = jsonify({'data': comments})
r.status_code = 200
except:
logger.warn('bad request')
r = jsonify({'data': []})
r.status_code = 400
return r
7 years ago
@cache.cached(timeout=300)
@app.route("/comments/count", methods=['GET'])
def get_comments_count():
try:
token = request.args.get('token', '')
url = request.args.get('url', '')
count = Comment.select(Comment).join(Site).where(
10 years ago
(Comment.url == url) &
(Comment.published.is_null(False)) &
(Site.token == token)).count()
r = jsonify({'count': count})
r.status_code = 200
except:
r = jsonify({'count': 0})
r.status_code = 200
return r
@app.route("/comments", methods=['POST'])
def new_comment():
try:
data = request.get_json()
logger.info(data)
# 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)
abort(400)
# honeypot for spammers
captcha = data.get('captcha', '')
if captcha:
logger.warn('discard spam: data %s' % data)
abort(400)
processor.enqueue({'request': 'new_comment', 'data': data})
except:
logger.exception("new comment failure")
abort(400)
return "OK"
9 years ago
@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})
9 years ago
except:
logger.exception("report failure")
abort(500)
return "OK"
@app.route("/accept", methods=['GET'])
def accept_comment():
try:
9 years ago
id = request.args.get('comment', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
processor.enqueue({'request': 'late_accept', 'data': id})
except:
logger.exception("accept failure")
abort(500)
return "PUBLISHED"
@app.route("/reject", methods=['GET'])
def reject_comment():
try:
9 years ago
id = request.args.get('comment', '')
secret = request.args.get('secret', '')
if secret != config.SECRET:
logger.warn('Unauthorized request')
abort(401)
processor.enqueue({'request': 'late_reject', 'data': id})
except:
logger.exception("reject failure")
abort(500)
return "REJECTED"