async def syncHighScores(request, fb_token): body = request.json if 'easy_highscores' not in body or 'hard_highscores' not in body: return json_response({'error': Response.BadRequest}, status=400) user = db.findUserByFbToken(fb_token) if user == None: return json_response({'error': Response.NotFoundError}, status=404) syncedHard = list( set(user['hard_highscores']) | set(body['hard_highscores'])) hardHS = sorted(syncedHard, reverse=True)[:10] syncedEasy = list( set(user['easy_highscores']) | set(body['easy_highscores'])) easyHS = sorted(syncedEasy, reverse=True)[:10] db.updateHighScores(user['_id'], easyHS, hardHS) return json_response({ 'easy_highscores': easyHS, 'hard_highscores': hardHS }, status=200)
async def create_event(request): body = request.json if 'uid' not in body or 'token' not in body or 'title' not in body or \ 'location' not in body or 'start' not in body or 'end' not in body \ or 'description' not in body or 'image' not in body: return json_response({'error': 'Bad request'}, status=400) title = body['title'] repeat, end_repeat, repeat_days = None, None, None if 'repeat' in body: repeat = body['repeat'] if 'end_repeat' in body: end_repeat = body['end_repeat'] if 'repeat_days' in body: repeat_days = dumps(body['repeat_days']) res = db.create_event(body['uid'], body['token'], title, body['location'], body['start'], body['end'], body['description'], repeat, end_repeat, repeat_days, body['image']) if 'error' in res: return json_response({'error': res['error']}, status=res['status']) msg = 'A new event ({}) has been added! Check it out!'.format(title) rejected_tokens = pusher.send_notifications(db.get_event_apn_tokens(), msg, 'event') for apn_token in rejected_tokens: db.remove_apn_token(apn_token) return json_response(res, status=201)
async def getFriendsHighscores(request, fb_token): body = request.json if 'fb_tokens' not in body: return json_response({'error': Response.BadRequest}, status=400) user = db.findUserByFbToken(fb_token) if user == None: return json_response({'error': Response.NotFoundError}, status=404) friends = db.getAllUsersByFBTokens(body['fb_tokens']) friendHighScores = [] for friend in friends: maxEasy = 0 if len(friend['easy_highscores']) > 0: maxEasy = max(friend['easy_highscores']) maxHard = 0 if len(friend['hard_highscores']) > 0: maxHard = max(friend['hard_highscores']) friendHighScores.append({ 'first_name': friend['first_name'], 'last_name': friend['last_name'], 'fb_token': friend['fb_token'], 'easy_highscore': maxEasy, 'hard_highscore': maxHard }) return json_response({'friends': friendHighScores}, status=200)
async def update_team(request): body = request.json if 'uid' not in body or 'token' not in body or 'tid' not in body or \ 'name' not in body or 'description' not in body or \ 'leaders' not in body or 'meetings' not in body or \ 'groupme' not in body or 'members' not in body or 'admins' not in body: return json_response({'error': 'Bad Request'}, status=400) name = body['name'] res = db.update_team(body['uid'], body['token'], body['tid'], name, body['description'], body['leaders'], body['meetings'], body['groupme'], body['members'], body['admins']) if 'error' in res: return json_response({'error': res['error']}, status=res['status']) msg = 'You\'ve been added to {} Team!'.format(name) tokens = db.get_team_apn_tokens(res['new_members']) rejected_tokens = pusher.send_notifications(tokens, msg, 'team') for apn_token in rejected_tokens: db.remove_apn_token(apn_token) return json_response({}, status=200)
async def patchChat(request, id, chat_id): user = db.findUserById(id) if user == None: return json_response({ 'error': Response.NotFoundError }) if not Auth.ValidateUser(user, request): return json_response({ 'error': Response.InvalidUser }, status=400) chat = db.findChatById(chat_id) if chat == None: return json_response({ 'error': Response.NotFoundError }) body = request.json if 'user_ids' not in body: return json_response({ 'error': Response.BadRequest }, status=400) notify = Notify() users = db.findUsersByIds(chat['user_ids']) apnTokens = [otherUser['apn_token'] for otherUser in users if otherUser['_id'] != user['_id']] custom = { 'chat_id' : chat['_id'], 'type' : 'users_added' } notify.sendMessages(apnTokens, user['first_name'] + ' ' + user['last_name'] + ' added more people to one of your chats.', custom) newUserIdsToAdd = [userId for userId in body['user_ids'] if userId not in chat['user_ids']] db.addUsersToChat(chat_id, newUserIdsToAdd) chat = db.findChatById(chat_id) chat['users'] = db.findUsersByIds(chat['user_ids']) return json_response({ 'chat' : chat })
async def batched_predict(request): dummy_input = [random.random()] response = await wrapped_model.predict(dummy_input) if not response.succeed(): return json_response({'output': None, 'status': 'failed'}) assert response.result == dummy_input[0], response.result return json_response({'output': response.result})
async def getUser(request, fb_token): user = db.findUserByFbToken(fb_token) if user == None: return json_response({'error': Response.NotFoundError}, status=404) return json_response({'user': user}, status=200)
async def update_event(request): body = request.json if 'uid' not in body or 'token' not in body or 'eid' not in body or \ 'title' not in body or 'location' not in body or \ 'start' not in body or 'end' not in body or \ 'description' not in body or 'image' not in body: return json_response({'error': 'Bad request'}, status=400) title, start, end = body['title'], body['start'], body['end'] repeat, end_repeat, repeat_days = None, None, None if 'repeat' in body: repeat = body['repeat'] if 'end_repeat' in body: end_repeat = body['end_repeat'] if 'repeat_days' in body: repeat_days = dumps(body['repeat_days']) res = db.update_event(body['uid'], body['token'], body['eid'], title, body['location'], start, end, body['description'], repeat, end_repeat, repeat_days, body['image']) if 'error' in res: return json_response({'error': res['error']}, status=res['status']) start_dt = datetime.strptime(start, '%Y-%m-%d %H:%M:%S') end_dt = datetime.strptime(end, '%Y-%m-%d %H:%M:%S') start_dt_old = datetime.strptime(res['start_old'], '%Y-%m-%d %H:%M:%S') end_dt_old = datetime.strptime(res['end_old'], '%Y-%m-%d %H:%M:%S') if start_dt != start_dt_old or end_dt != end_dt_old: msg = 'The time of {} has been changed. It will now '.format(title) start_time_str = start_dt.strftime('%I:%M%p').lstrip('0').lower() end_time_str = end_dt.strftime('%I:%M%p').lstrip('0').lower() if start_dt.date() == end_dt.date(): day = start_dt.strftime('%A, %B ') day += number.ordinal(start_dt.day) msg += 'be from {} to {} on {}.'.format(start_time_str, end_time_str, day) else: start_day = start_dt.strftime('%A, %B ') start_day += number.ordinal(start_dt.day) end_day = end_dt.strftime('%A, %B ') end_day += number.ordinal(end_dt.day) msg += 'start on {} at {} and end on {} at {}.'.\ format(start_day, start_time_str, end_day, end_time_str) rejected_tokens = pusher.send_notifications(db.get_event_apn_tokens(), msg, 'event') for apn_token in rejected_tokens: db.remove_apn_token(apn_token) return json_response({}, status=201)
async def getUserByUsernameAndPassword(request): if 'username' not in request.args or 'password' not in request.args: return json_response({'error': Response.BadRequest}, status=400) user = db.findUserByUsernameAndPassword(request.args['username'][0], request.args['password'][0]) if user == None: return json_response({'error': Response.NotFoundError}, status=404) return json_response({'user': user}, status=200)
async def postUser(request): body = request.json if 'first_name' not in body or 'last_name' not in body or 'fb_token' not in body: return json_response({'error': Response.BadRequest}, status=400) user_id = db.insertUser(body) user = db.findUserById(user_id) return json_response({'user': user}, status=201)
async def deleteUser(request, id): user = db.findUserById(id) if user == None: return json_response({'error': Response.NotFoundError}, status=404) if not Auth.ValidateUser(user, request): return json_response({'error': Response.InvalidUser}, status=400) db.removeUserById(id) return json_response({'success': True}, status=201)
async def postUser(request): body = request.json if 'first_name' not in body and 'last_name' not in body and 'apn_token' not in body: return json_response({'error': Response.BadRequest}, status=400) body['session_token'] = Auth.GenerateSessionToken() user_id = db.insertUser(body) user = db.findUserById(user_id) return json_response({'user': user}, status=201)
async def deleteUser(request, fb_token, mode): user = db.findUserByFbToken(fb_token) if user == None: return json_response({'error': Response.NotFoundError}, status=404) easyHS = [] if mode == "easy" else user['easy_highscores'] hardHS = [] if mode == "hard" else user['hard_highscores'] db.updateHighScores(user['_id'], easyHS, hardHS) return json_response({'success': 'removed ' + mode + ' highscores'}, status=201)
async def postChat(request): body = request.json message = body['message'] token = body['apn_token'] try: notify = Notify() notify.sendMessages([token], message, {}) except Exception as e: return json_response({'error': str(e)}, status=500) return json_response({'success': True})
async def leave_course(request): body = request.json if 'uid' not in body or 'token' not in body or 'cid' not in body: return json_response({'error': 'Bad request'}, status=400) res = db.leave_course(body['uid'], body['token'], body['cid']) if 'error' in res: return json_response({'error': res['error']}, status=res['status']) return json_response({}, status=200)
async def delete_events(request): body = request.json if 'uid' not in body or 'token' not in body or 'events' not in body: return json_response({'error': 'Bad request' }, status=400) res = db.delete_events(body['uid'], body['token'], body['events']) if 'error' in res: return json_response({'error': res['error']}, status=res['status']) return json_response({}, status=200)
async def get_courses(request): args = request.args if 'uid' not in args or 'token' not in args: return json_response({'error': 'Bad request'}, status=400) res = db.get_courses(args['uid'][0], args['token'][0]) if 'error' in res: return json_response({'error': res['error']}, status=res['status']) return json_response(res, status=200)
async def getUser(request, id): user = db.findUserById(id) if user == None: return json_response({'error': Response.NotFoundError}, status=404) if not Auth.ValidateUser(user, request): return json_response({'error': Response.InvalidUser}, status=400) newSessionToken = Auth.GenerateSessionToken() db.updateUserSessionToken(id, newSessionToken) user = db.findUserById(id) return json_response({'user': user}, status=200)
async def postUser(request): body = request.json if 'username' not in body or 'password' not in body: return json_response({'error': Response.BadRequest}, status=400) user = db.findByUsername(body['username']) if user != None: return json_response({'error': Response.BadRequest}, status=400) user_id = db.insertUser(body) user = db.findUserById(user_id) return json_response({'user': user}, status=201)
async def patchUser(request, id): user = db.findUserById(id) if user == None: return json_response({'error': Response.NotFoundError}, status=404) if not Auth.ValidateUser(user, request): return json_response({'error': Response.InvalidUser}, status=400) body = request.json if 'first_name' not in body and 'last_name' not in body: return json_response({'error': Response.BadRequest}, status=400) db.updateUserById(id, body['first_name'], body['last_name']) user = db.findUserById(id) return json_response({'user': user}, status=201)
async def postChat(request, id): user = db.findUserById(id) if user == None: return json_response({ 'error': Response.NotFoundError }) if not Auth.ValidateUser(user, request): return json_response({ 'error': Response.InvalidUser }, status=400) body = request.json if 'user_ids' not in body: return json_response({ 'error': Response.BadRequest }, status=400) chat_id = db.insertChat(body) return json_response({ 'chat': db.findChatById(chat_id) }, status=201)
async def deleteChat(request, id, chat_id): user = db.findUserById(id) if user == None: return json_response({ 'error': Response.NotFoundError }) if not Auth.ValidateUser(user, request): return json_response({ 'error': Response.InvalidUser }, status=400) chat = db.findChatById(chat_id) if chat == None: return json_response({ 'error': Response.NotFoundError }) db.removeUserFromChat(id, chat_id) return json_response({ 'success' : 'user removed from chat' })
def error(message, **kwargs): return json_response({ "status": "error", "results": [], "exception": message, **kwargs, })
async def getUserChats(request, id): user = db.findUserById(id) if user == None: return json_response({ 'error': Response.NotFoundError }) if not Auth.ValidateUser(user, request): return json_response({ 'error': Response.InvalidUser }, status=400) chats = db.findChatsByUserId(id) if 'removed_chat_ids' in user: chats = [chat for chat in chats if chat['_id'] not in user['removed_chat_ids']] for chat in chats: chat['users'] = db.findUsersByIds(chat['user_ids']) return json_response({ 'chats' : chats })
def handle_uncaught_exception(self, request, exception, custom_message=INTERNAL_SERVER_ERROR_JSON): return json_response(custom_message, status.HTTP_500_INTERNAL_SERVER_ERROR)
def success(result_set, **kwargs): return json_response({ "status": "success", "results": result_set, "exception": None, **kwargs, })
async def post_login(request): token = request.json['auth_token'] url = '{}/v1/login/verify/{}'.format(ID_SERVICE_LOGIN_URL, token) resp = await app.http.get(url) if resp.status != 200: raise SanicException("Login Failed", status_code=401) user = await resp.json() toshi_id = user['toshi_id'] session_id = generate_session_id() async with app.pool.acquire() as con: admin = await con.fetchrow("SELECT * FROM admins WHERE toshi_id = $1", toshi_id) if admin: await con.execute( "INSERT INTO sessions (session_id, toshi_id) VALUES ($1, $2)", session_id, toshi_id) if admin: response = json_response(user) response.cookies['session'] = session_id #response.cookies['session']['secure'] = True return response else: toshi_log.info("Invalid login from: {}".format(toshi_id)) raise SanicException("Login Failed", status_code=401)
def check_rate_limit(key, now): # If there are more recent attempts than allowed if key in RATE_LIMIT_DB and len( RATE_LIMIT_DB[key]) > RATE_LIMIT_NB_REQUESTS: oldest_attempt = RATE_LIMIT_DB[key][0] logger.info( f"Rate limit reached for {key}, can retry in {int(RATE_LIMIT_SECONDS - now + oldest_attempt)} seconds" ) return json_response( { "error": { "code": "error_rate_limit", "content": f"Rate limit reached for this domain or ip, retry in {int(RATE_LIMIT_SECONDS - now + oldest_attempt)} seconds" } }, status=400) # In any case, add this attempt to the DB if key not in RATE_LIMIT_DB: RATE_LIMIT_DB[key] = [now] else: RATE_LIMIT_DB[key].append(now)
async def postChat(request, id): body = request.json user = db.findUserById(id) if user == None: return json_response({'error': Response.NotFoundError}, status=404) if not Auth.ValidateUser(user, request): return json_response({'error': Response.InvalidUser}, status=400) try: notify = Notify() notify.clearNotifications(user['apn_token']) except Exception as e: return json_response({'error': str(e)}, status=500) return json_response({'success': True})
async def program_detail(request, name): process = supervisor.getProcessInfo(name) return json_response({ 'name': process['name'], 'statename': process['statename'], 'description': process['description'], 'logs': get_log(process['name']) })
async def return_data(request, data): return json_response(await get_data( data, int(request.args.get('size', 10)) ))