def get_search_results(query_string=None): '''XHR endpoint to get results from GitHub's Search API. We're specifically searching "issues" here, which seems to make the most sense. Note that the rate limit is different for Search: 30 requests per minute. If a user hits the rate limit, the Flask Limiter extension will send a 429. See @app.error_handler(429) in views.py. This method can take a query_string argument, to be called from other endpoints, or the query_string can be passed in via the Request object. Not cached. ''' search_uri = 'https://api.github.com/search/issues' # TODO: handle sort and order parameters. params = request.args.copy() if query_string is None: query_string = params.get('q') # restrict results to our repo. query_string += " repo:{0}".format(REPO_PATH) params['q'] = query_string if g.user: request_headers = get_request_headers(g.request_headers) results = github.raw_request('GET', 'search/issues', params=params, headers=request_headers) else: results = proxy_request('get', params=params, uri=search_uri) return (results.content, results.status_code, get_headers(results))
def proxy_comments(number): '''XHR endpoint to get issues comments from GitHub. Either as an authed user, or as one of our proxy bots. ''' if request.method == 'POST': try: comment_data = json.loads(request.data) body = json.dumps({"body": comment_data['rawBody']}) path = 'repos/{0}/{1}/comments'.format(ISSUES_PATH, number) comment = github.raw_request('POST', path, data=body) return (json.dumps(comment.json()), comment.status_code, { 'content-type': JSON_MIME }) except GitHubError as e: print('GitHubError: ', e.response.status_code) return (':(', e.response.status_code) else: request_headers = get_request_headers(g.request_headers) if g.user: comments = github.raw_request('GET', 'repos/{0}/{1}/comments'.format( ISSUES_PATH, number), headers=request_headers) else: comments = proxy_request('get', '/{0}/comments'.format(number), headers=request_headers) return (comments.content, comments.status_code, get_headers(comments))
def get_search_results(query_string=None, params=None): """XHR endpoint to get results from GitHub's Search API. We're specifically searching "issues" here, which seems to make the most sense. Note that the rate limit is different for Search: 30 requests per minute. If a user hits the rate limit, the Flask Limiter extension will send a 429. See @app.error_handler(429) in views.py. This method can take a query_string argument, to be called from other endpoints, or the query_string can be passed in via the Request object. Not cached. """ params = params or request.args.copy() query_string = query_string or params.get("q") search_uri = "https://api.github.com/search/issues" # restrict results to our repo. query_string += " repo:{0}".format(REPO_PATH) params["q"] = query_string # convert issues api to search api params here. params = normalize_api_params(params) request_headers = get_request_headers(g.request_headers) if g.user: results = github.raw_request("GET", "search/issues", params=params, headers=request_headers) else: results = proxy_request("get", params=params, uri=search_uri, headers=request_headers) return (results.content, results.status_code, get_headers(results))
def proxy_comments(number): """XHR endpoint to get issues comments from GitHub. Either as an authed user, or as one of our proxy bots. """ if request.method == "POST": try: comment_data = json.loads(request.data) body = json.dumps({"body": comment_data["rawBody"]}) path = "repos/{0}/{1}/comments".format(ISSUES_PATH, number) comment = github.raw_request("POST", path, data=body) return (json.dumps(comment.json()), comment.status_code, {"content-type": JSON_MIME}) except GitHubError as e: print("GitHubError: ", e.response.status_code) return (":(", e.response.status_code) else: request_headers = get_request_headers(g.request_headers) if g.user: comments = github.raw_request( "GET", "repos/{0}/{1}/comments".format(ISSUES_PATH, number), headers=request_headers ) else: comments = proxy_request("get", "/{0}/comments".format(number), headers=request_headers) return (comments.content, comments.status_code, get_headers(comments))
def proxy_comments(number): '''XHR endpoint to get issues comments from GitHub. Either as an authed user, or as one of our proxy bots. ''' if request.method == 'POST': try: comment_data = json.loads(request.data) body = json.dumps({"body": comment_data['rawBody']}) path = 'repos/{0}/{1}/comments'.format(ISSUES_PATH, number) comment = github.raw_request('POST', path, data=body) return (json.dumps(comment.json()), comment.status_code, {'content-type': JSON_MIME}) except GitHubError as e: print('GitHubError: ', e.response.status_code) return (':(', e.response.status_code) else: if g.user: request_headers = get_request_headers(g.request_headers) comments = github.raw_request( 'GET', 'repos/{0}/{1}/comments'.format( ISSUES_PATH, number), headers=request_headers ) else: comments = proxy_request('get', '/{0}/comments'.format(number)) return (comments.content, comments.status_code, get_headers(comments))
def proxy_issue(number): '''XHR endpoint to get issue data from GitHub. either as an authed user, or as one of our proxy bots. ''' request_headers = get_request_headers(g.request_headers) path = 'repos/{0}/{1}'.format(ISSUES_PATH, number) return api_request('get', path)
def user_issues(): """API endpoint to return issues filed by the logged in user. Not cached. """ get_user_info() path = "repos/{0}?creator={1}&state=all".format(ISSUES_PATH, session["username"]) request_headers = get_request_headers(g.request_headers) issues = github.raw_request("GET", path, headers=request_headers) return (issues.content, issues.status_code, get_headers(issues))
def proxy_issue(number): """XHR endpoint to get issue data from GitHub. either as an authed user, or as one of our proxy bots. """ request_headers = get_request_headers(g.request_headers) if g.user: issue = github.raw_request("GET", "repos/{0}/{1}".format(ISSUES_PATH, number), headers=request_headers) else: issue = proxy_request("get", "/{0}".format(number), headers=request_headers) return (issue.content, issue.status_code, get_headers(issue))
def user_issues(): '''API endpoint to return issues filed by the logged in user. Not cached. ''' get_user_info() path = 'repos/{0}?creator={1}&state=all'.format(ISSUES_PATH, session['username']) request_headers = get_request_headers(g.request_headers) issues = github.raw_request('GET', path, headers=request_headers) return (issues.content, issues.status_code, get_headers(issues))
def proxy_issue(number): '''XHR endpoint to get issue data from GitHub. either as an authed user, or as one of our proxy bots. ''' if g.user: request_headers = get_request_headers(g.request_headers) issue = github.raw_request('GET', 'repos/{0}/{1}'.format( ISSUES_PATH, number), headers=request_headers) else: issue = proxy_request('get', '/{0}'.format(number)) return (issue.content, issue.status_code, get_headers(issue))
def user_issues(): '''API endpoint to return issues filed by the logged in user. Not cached. ''' get_user_info() path = 'repos/{0}?creator={1}&state=all'.format( ISSUES_PATH, session['username'] ) request_headers = get_request_headers(g.request_headers) issues = github.raw_request('GET', path, headers=request_headers) return (issues.content, issues.status_code, get_headers(issues))
def get_repo_labels(): '''XHR endpoint to get all possible labels in a repo. Cached for 10 minutes. ''' if g.user: request_headers = get_request_headers(g.request_headers) path = 'repos/{0}/labels'.format(REPO_PATH) labels = github.raw_request('GET', path, headers=request_headers) return (labels.content, labels.status_code, get_headers(labels)) else: # only authed users should be hitting this endpoint abort(401)
def get_rate_limit(): '''Endpoint to display the current GitHub API rate limit. Will display for the logged in user, or webcompat-bot if not logged in. See https://developer.github.com/v3/rate_limit/. ''' rate_limit_uri = 'https://api.github.com/rate_limit' request_headers = get_request_headers(g.request_headers) if g.user: rl = github.raw_request('GET', 'rate_limit', headers=request_headers) else: rl = proxy_request('get', uri=rate_limit_uri, headers=request_headers) return rl.content
def get_rate_limit(): """Endpoint to display the current GitHub API rate limit. Will display for the logged in user, or webcompat-bot if not logged in. See https://developer.github.com/v3/rate_limit/. """ rate_limit_uri = "https://api.github.com/rate_limit" request_headers = get_request_headers(g.request_headers) if g.user: rl = github.raw_request("GET", "rate_limit", headers=request_headers) else: rl = proxy_request("get", uri=rate_limit_uri, headers=request_headers) return rl.content
def get_rate_limit(): '''Endpoint to display the current GitHub API rate limit. Will display for the logged in user, or webcompat-bot if not logged in. See https://developer.github.com/v3/rate_limit/. ''' rate_limit_uri = 'https://api.github.com/rate_limit' if g.user: request_headers = get_request_headers(g.request_headers) rl = github.raw_request('GET', 'rate_limit', headers=request_headers) else: rl = proxy_request('get', uri=rate_limit_uri) return rl.content
def proxy_issue(number): '''XHR endpoint to get issue data from GitHub. either as an authed user, or as one of our proxy bots. ''' request_headers = get_request_headers(g.request_headers) if g.user: issue = github.raw_request('GET', 'repos/{0}/{1}'.format(ISSUES_PATH, number), headers=request_headers) else: issue = proxy_request('get', '/{0}'.format(number), headers=request_headers) return (issue.content, issue.status_code, get_headers(issue))
def proxy_issue(number): '''XHR endpoint to get issue data from GitHub. either as an authed user, or as one of our proxy bots. ''' request_headers = get_request_headers(g.request_headers) if g.user: issue = github.raw_request('GET', 'repos/{0}/{1}'.format( ISSUES_PATH, number), headers=request_headers) else: issue = proxy_request('get', '/{0}'.format(number), headers=request_headers) if issue.status_code != 404: return (issue.content, issue.status_code, get_headers(issue)) else: # We may want in the future handle 500 type of errors. # This will return the JSON version of 404 abort(404)
def get_search_results(query_string=None, params=None): '''XHR endpoint to get results from GitHub's Search API. We're specifically searching "issues" here, which seems to make the most sense. Note that the rate limit is different for Search: 30 requests per minute. If a user hits the rate limit, the Flask Limiter extension will send a 429. See @app.error_handler(429) in views.py. This method can take a query_string argument, to be called from other endpoints, or the query_string can be passed in via the Request object. Not cached. ''' params = params or request.args.copy() query_string = query_string or params.get('q') search_uri = 'https://api.github.com/search/issues' # restrict results to our repo. query_string += " repo:{0}".format(REPO_PATH) params['q'] = query_string # convert issues api to search api params here. params = normalize_api_params(params) request_headers = get_request_headers(g.request_headers) if g.user: results = github.raw_request('GET', 'search/issues', params=params, headers=request_headers) else: results = proxy_request('get', params=params, uri=search_uri, headers=request_headers) return (results.content, results.status_code, get_headers(results))