def get(self):
reviewee = self.get_query_argument('reviewee', None)
reviewer = self.get_query_argument('reviewer', None)
oldest = self.get_query_argument('oldest', None)
try:
offset = int(self.get_query_argument('offset', 0))
limit = int(self.get_query_argument('limit', 10))
except ValueError:
raise JSONHTTPError(400, body={'errors': [{'id': 'bad_arguments', 'message': 'Bad Arguments'}]})
if reviewee is None and reviewer is None:
raise JSONHTTPError(400, body={'errors': [{'id': 'bad arguments', 'message': 'Bad Arguments'}]})
wheres = []
sql_args = []
if reviewee is not None:
# lowercase the address
reviewee = reviewee.lower()
if not validate_address(reviewee):
raise JSONHTTPError(400, body={'errors': [{'id': 'invalid_address', 'message': 'Invalid Address for `reviewee`'}]})
wheres.append("reviewee_id = ${}".format(len(wheres) + 1))
sql_args.append(reviewee)
if reviewer is not None:
# lowercase the address
reviewer = reviewer.lower()
if not validate_address(reviewer):
raise JSONHTTPError(400, body={'errors': [{'id': 'invalid_address', 'message': 'Invalid Address for `reviewer`'}]})
wheres.append("reviewer_id = ${}".format(len(wheres) + 1))
sql_args.append(reviewer)
if oldest is not None:
try:
oldest = iso8601.parse_date(oldest)
# remove the tzinfo so asyncpg can handle them
# fromutc adds the utc offset to the date, but doesn't remove the tzinfo
# so the final replace is to wipe that out (which doesn't adjust anything else)
oldest = oldest.tzinfo.fromutc(oldest).replace(tzinfo=None)
except iso8601.ParseError:
raise JSONHTTPError(400, body={'errors': [{'id': 'invalid_date', 'message': 'Invalid date for `oldest`'}]})
wheres.append("updated >= ${}".format(len(wheres) + 1))
sql_args.append(oldest)
cnt_sql = "SELECT COUNT(*) FROM reviews WHERE {}".format(" AND ".join(wheres))
sql = "SELECT * FROM reviews WHERE {} ORDER BY updated DESC OFFSET ${} LIMIT ${}".format(
" AND ".join(wheres), len(wheres) + 1, len(wheres) + 2)
async with self.db:
reviews = await self.db.fetch(sql, *sql_args + [offset, limit])
stats = await self.db.fetchrow(cnt_sql, *sql_args)
self.write({
"query": self.request.query,
"total": stats['count'],
"reviews": [render_review(r) for r in reviews],
"offset": offset,
"limit": limit
})
评论列表
文章目录