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)
Exemple #15
0
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)