def createTaskList(): """API for creating a new task list from request body""" data = request.get_json(force=True) postAttrs = ['userId', 'name'] code, msg, result = 0, '', {"data": None} if not judgeInputValid(data): code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) elif not judgeKeysCorrect(data, postAttrs): code, msg = 400, apiStatus.getResponseMsg(400) else: try: userId = data['userId'] name = data['name'] newTaskList = TaskList(userId=userId, name=name) db.session.add(newTaskList) db.session.commit() result['data'] = newTaskList.toDict() code, msg = 201, apiStatus.getResponseMsg(201) except: code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)
def createTaskTimer(): """This function is used to create a new relation""" data = request.get_json() if not judgeInputValid(data): code, msg = 400, apiStatus.getResponseMsg(400) return jsonify({"code": code, "message": msg, "data": None}) postAttrs = ['taskId', 'timerId', 'userId'] code, msg, result = 0, "", {"data": None} if not judgeKeysExist(data, postAttrs): code, msg = 400, apiStatus.getResponseMsg(400) else: targetTask = Task.query.get(data['taskId']) # query by primary key targetTimer = Timer.query.get(data['timerId']) specifiedId = data['id'] if 'id' in data else None if not targetTask or not targetTimer: code, msg = 404, apiStatus.getResponseMsg(404) else: try: newTaskToTimer = TaskToTimer(taskId=str(targetTask.id), timerId=str(targetTimer.id), userId=str(data['userId'])) if specifiedId: newTaskToTimer.update({"id": specifiedId}) db.session.add(newTaskToTimer) db.session.commit() result["data"] = newTaskToTimer.toDict() code, msg = 201, apiStatus.getResponseMsg(201) except: # add repeat relations may cause internal error code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)
def handleTaskTimer(taskTimerId): """This function is used to handle GET / DELETE requests for handle task timer""" if not judgeIntValid(taskTimerId): code, msg = 400, apiStatus.getResponseMsg(400) return jsonify({"code": code, "message": msg, "data": None}) getCode, getMsg, targetTaskTimer = getTaskTimer(int(taskTimerId)) result = {"code": getCode, "message": getMsg, "data": None} if request.method == "GET": if targetTaskTimer: result["data"] = targetTaskTimer.toDict() elif request.method == "DELETE": if not targetTaskTimer: return jsonify(result) try: db.session.delete(targetTaskTimer) db.session.commit() code, msg = 200, apiStatus.getResponseMsg(200) except: code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)
def getTasksByTimerid(timerId): """get lists of tasks by timer id""" if not judgeIntValid(timerId): code, msg = 400, apiStatus.getResponseMsg(400) return code, msg, None try: # disable no member since it is setted flask function # may think about change to join query relateTasks = TaskToTimer.query.filter_by(timerId = timerId).all() relateTaskDict = {} for relTask in relateTasks: relateTaskDict[relTask.taskId] = relTask.id relatedTasksId = [rel.taskId for rel in relateTasks] tasks = Task.query.filter(Task.id.in_(relatedTasksId)).all() tasksData =[] for task in tasks: taskDict = task.toDict() taskDict["relId"] = relateTaskDict[task.id] tasksData.append(taskDict) # relatedTasks = db.session.query(TaskToTimer.taskId.label('taskId')).filter( # pylint: disable=maybe-no-member # TaskToTimer.timerId == timerId).subquery() # pylint: disable=maybe-no-member # tasks = db.session.query(Task).filter(Task.id.in_(relatedTasks)).all() # pylint: disable=maybe-no-member # tasksData = [task.toDict() for task in tasks] code, msg = 200, apiStatus.getResponseMsg(200) except: return 500, apiStatus.getResponseMsg(500), [] return code, msg, tasksData
def putTimers(timerId): """This function is for the server to update timers""" data = request.get_json() postAttrs = ['id', 'userId', 'title', 'startTime', 'duration', 'breakTime', 'round', 'description', 'zoomLink', 'isCreator', 'timerToUserId', 'added'] code, msg, result = 0, "", {"data": None} if not judgeKeysCorrect(data, postAttrs): code, msg = 400, apiStatus.getResponseMsg(400) else: if not judgeInputValid(data) : code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) targetTimer = Timer.query.get(timerId) if not targetTimer: code, msg = 404, apiStatus.getResponseMsg(404) else: try: targetTimer.update(data) db.session.commit() result["data"] = targetTimer.toDict({ "added": data["added"] if "added" in data else True, "isCreator": data["isCreator"] if "isCreator" in data else True, "timerToUserId": data["timerToUserId"] if "timerToUserId" in data else targetTimer.userId, }) code, msg = 201, apiStatus.getResponseMsg(201) except: code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)
def getTimersByTaskid(taskId): """get lists of timers by task id""" if not judgeIntValid(taskId): code, msg = 400, apiStatus.getResponseMsg(400) return code, msg, None try: relatedTasks = db.session.query(TaskToTimer.timerId.label('timerId')).filter( # pylint: disable=maybe-no-member TaskToTimer.taskId == taskId).subquery() # pylint: disable=maybe-no-member timers = db.session.query(Timer).filter(Timer.id.in_(relatedTasks)).all() # pylint: disable=maybe-no-member timersData = [timer.toDict() for timer in timers] code, msg = 200, apiStatus.getResponseMsg(200) except: return 500, apiStatus.getResponseMsg(500), [] return code, msg, timersData
def getTaskTimer(taskTimerId): """This function is used to handle retrieve task from database""" if not judgeIntValid(taskTimerId): code, msg = 400, apiStatus.getResponseMsg(400) return code, msg, None try: targetTaskTimer = TaskToTimer.query.get(taskTimerId) except: return 500, apiStatus.getResponseMsg(500), None if not targetTaskTimer: code, msg = 404, apiStatus.getResponseMsg(404) else: code, msg = 200, apiStatus.getResponseMsg(200) return code, msg, targetTaskTimer
def getTaskList(taskListId): """API for getting all tasklists with task list id as taskListId""" code, msg, result = 0, '', {"data": None} if not judgeIntValid(taskListId): code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) result["data"] = [] targetTaskList = TaskList.query.get(taskListId) if not targetTaskList: code, msg = 404, apiStatus.getResponseMsg(404) else: result["data"] = targetTaskList.toDict() code, msg = 200, apiStatus.getResponseMsg(200) result["code"] = code result["message"] = msg return jsonify(result)
def putTaskList(taskListId): """API for updating a task list with id as taskListId from request body""" data = request.get_json(force=True) postAttrs = ['userId', 'name'] code, msg, result = 0, '', {"data": None} if not judgeIntValid(taskListId): code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) if not judgeInputValid(data): code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) if not judgeKeysCorrect(data, postAttrs): code, msg = 400, apiStatus.getResponseMsg(400) else: targetTaskList = TaskList.query.get(taskListId) if not targetTaskList: code, msg = 404, apiStatus.getResponseMsg(404) else: try: targetTaskList.update(data) db.session.commit() result["data"] = targetTaskList.toDict() code, msg = 201, apiStatus.getResponseMsg(201) except: code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)
def deleteTaskList(taskListId): """API for delete a task list with id""" code, msg, result = 0, '', {"data": None} if not judgeIntValid(taskListId): code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) targetTaskList = TaskList.query.get(taskListId) if not targetTaskList: code, msg = 404, apiStatus.getResponseMsg(404) else: try: db.session.delete(targetTaskList) db.session.commit() code, msg = 201, apiStatus.getResponseMsg(201) except: code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)
def getTaskListsByUserId(): """API for getting all tasklists with user id as userId""" userId = request.args.get('userId', None) code, msg, result = 0, '', {"data": None} if not judgeInputValid({"userId":userId}): code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) result["data"] = [] taskLists = TaskList.query.filter_by(userId=userId).all() if not taskLists: code, msg = 404, apiStatus.getResponseMsg(404) else: for taskList in taskLists: result["data"].append(taskList.toDict()) code, msg = 200, apiStatus.getResponseMsg(200) result["code"] = code result["message"] = msg return jsonify(result)
def deleteTimers(timerId): """This function is for the server to delete timers""" code, msg, result = 0, "", {"data": None} if not judgeIntValid(timerId) : code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) targetTimer = Timer.query.get(timerId) # query by primary key if not targetTimer: code, msg = 404, apiStatus.getResponseMsg(404) else: try: db.session.delete(targetTimer) db.session.commit() result["data"] = {"id": timerId} code, msg = 200, apiStatus.getResponseMsg(200) except: code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)
def handleQueryTasksOrTimers(): """handle request to retrieve lists of tasks or timers""" taskId = request.args.get('taskId', None) timerId = request.args.get('timerId', None) userId = request.args.get('userId', None) # for verification # judge input if not judgeInputValid({"userId": userId}) or \ (taskId and not judgeIntValid(taskId)) or \ (timerId and not judgeIntValid(timerId)): code, msg = 400, apiStatus.getResponseMsg(400) return jsonify({"code": code, "message": msg, "data": None}) if (taskId and timerId) or not userId: code, msg = 500, apiStatus.getResponseMsg(500) return jsonify({"code": code, "message": msg, "data":[]}) code, msg, resultData = 0, "", [] result = {} if not timerId and not taskId and userId: # retrieve by user result['data'] = [] # should also return an empty list targetRels = TaskToTimer.query.filter_by(userId=userId).all() if not targetRels: code, msg = 404, apiStatus.getResponseMsg(404) else: for rel in targetRels: result['data'].append(rel.toDict()) code, msg = 200, apiStatus.getResponseMsg(200) elif timerId: targetTimer = Timer.query.get(timerId) if not targetTimer: code, msg = 404, apiStatus.getResponseMsg(404) # elif targetTimer.userId != userId: # code, msg = 401, apiStatus.getResponseMsg(401) else: code, msg, resultData = getTasksByTimerid(int(timerId)) elif taskId: targetTask = Task.query.get(taskId) if not targetTask: code, msg = 404, apiStatus.getResponseMsg(404) elif targetTask.userId !=userId: code, msg = 401, apiStatus.getResponseMsg(401) else: code, msg, resultData = getTimersByTaskid(int(taskId)) result["code"] = code result["message"] = msg result["data"] = resultData return jsonify(result)
def getTimers(): """This function is for the server to get timers from the database""" code, msg, result = 0, "", {"data": None} timerId = request.args.get('timerId', None) userId = request.args.get('userId', None) if timerId is not None : if not judgeIntValid(timerId) : code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) targetTimer = Timer.query.get(timerId) # query by primary key if not targetTimer: code, msg = 404, apiStatus.getResponseMsg(404) else: result["data"] = targetTimer.toDict() code, msg = 200, apiStatus.getResponseMsg(200) result["code"] = code result["message"] = msg return jsonify(result) if userId is not None: result['data'] = [] # should also return an empty list targetTimer = Timer.query.filter_by(userId=userId).all() if not targetTimer: code, msg = 404, apiStatus.getResponseMsg(404) else: # result['data'] = [] for timer in targetTimer : result['data'].append(timer.toDict()) # to iso format code, msg = 200, apiStatus.getResponseMsg(200) result["code"] = code result["message"] = msg return jsonify(result) code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result)
def zoomIntegration(): code = request.args.get("code") timerId = request.args.get("state") print("code: ", code) print("state: ", timerId) params = { "grant_type": "authorization_code", "code": code, "redirect_uri": "https://localhost:3000/zoom" } headers = { "Authorization": "Basic" + " " + b64encode(ZOOM_CREDENTIALS.encode("utf-8")).decode("utf-8") } print(headers) r = requests.post("https://zoom.us/oauth/token", params=params, headers=headers) print(r.text) if r.status_code != 200 and r.status_code != 201: code, msg, result = r.status_code, apiStatus.getResponseMsg(code), { "data": json.loads(r.text) } result["code"] = code result["message"] = msg return jsonify(result) response = json.loads(r.text) headers = { "Content-Type": "application/json", "Authorization": "Bearer " + response["access_token"] } data = {"topic": "Test", "type": 2, "start_time": "2020-11-21T19:00:00"} print(jsonify(data)) targetTimer = Timer.query.get(timerId) if not targetTimer: code, msg, result = 404, apiStatus.getResponseMsg(404), {"data": None} result["code"] = code result["message"] = msg return jsonify(result) else: timer = targetTimer.toDict() data["topic"] = timer["title"] data["start_time"] = timer["startTime"] r = requests.post("https://api.zoom.us/v2/users/me/meetings", headers=headers, data=json.dumps(data)) # Not testable, I don't think fail a meeting creation is possible normally # unless reaching the daily meeting creation limit if r.status_code != 200 and r.status_code != 201: code, msg, result = r.status_code, apiStatus.getResponseMsg(code), { "data": json.loads(r.text) } result["code"] = code result["message"] = msg return jsonify(result) response = json.loads(r.text) timer["zoomLink"] = response["join_url"] targetTimer = Timer.query.get(timerId) try: targetTimer.update(timer) db.session.commit() except: code, msg, result = 500, apiStatus.getResponseMsg(500), {"data": None} result["code"] = code result["message"] = msg return jsonify(result) data = { "start_url": response["start_url"], "join_url": response["join_url"], "timer": timer, } code, msg, result = 200, apiStatus.getResponseMsg(200), {"data": data} result["code"] = code result["message"] = msg return jsonify(result)
def createTimers(): """This function is for the server to create new timers""" data = request.get_json() postAttrs = ['userId', 'title', 'startTime', 'duration', 'breakTime', 'round'] code, msg, result = 0, "", {"data": None} if not judgeKeysExist(data, postAttrs): code, msg = 400, apiStatus.getResponseMsg(400) else: if not judgeInputValid(data) : code, msg = 400, apiStatus.getResponseMsg(400) result["code"] = code result["message"] = msg return jsonify(result) userId = data['userId'] title = data['title'] description = data['description'] if 'description' in data else None zoomLink = data['zoomLink'] if 'zoomLink' in data else None startTime = data['startTime'] # formatStartTime = parser.parse(startTime) # testFormStartTime = datetime.datetime.fromisoformat(startTime) # print(formatStartTime, testFormStartTime) duration = int(data['duration']) breakTime = int(data['breakTime']) round = int(data['round']) oldTimers = Timer.query.filter_by(userId=userId).all() if oldTimers is not None: for oldTimer in oldTimers: totalDuration = (oldTimer.duration + oldTimer.breakTime) * oldTimer.round totalDuration = datetime.timedelta(minutes=totalDuration) endTime = parser.parse(oldTimer.startTime) + totalDuration # sTime = datetime.datetime.strptime(startTime, "%Y-%m-%d %H:%M:%S") sTime = parser.parse(startTime) newDuration = (duration + breakTime) * round newDuration = datetime.timedelta(minutes=newDuration) eTime = sTime + newDuration if parser.parse(oldTimer.startTime) <= sTime < endTime or parser.parse(oldTimer.startTime) < eTime <= endTime: code, msg = 403, apiStatus.getResponseMsg(403) result["code"] = code result["message"] = msg return jsonify(result) if sTime < parser.parse(oldTimer.startTime) and eTime > endTime: code, msg = 403, apiStatus.getResponseMsg(403) result["code"] = code result["message"] = msg return jsonify(result) try: newTimer = Timer(userId=str(userId), title=str(title), description=str(description), zoomLink=str(zoomLink), startTime=startTime, duration=str(duration), breakTime=str(breakTime), round=str(round)) db.session.add(newTimer) newTimerTwo = Timer.query.filter_by(userId=userId).all() # print(newTimerTwo) newTimerToUser = TimerToUser(timerId=newTimer.id, userId=userId, status=1) db.session.add(newTimerToUser) db.session.commit() result["data"] = newTimer.toDict({ "added": True, "isCreator": True, "timerToUserId": userId, }) # result["data"]["startTime"] = startTime # remain to be string for the frontend consistent, or change to utcstring code, msg = 201, apiStatus.getResponseMsg(201) except: code, msg = 500, apiStatus.getResponseMsg(500) result["code"] = code result["message"] = msg return jsonify(result)