def login():
    body = flask.request.get_json()
    username = body['username']
    password = body['password']

    user = db.query_fetchone('get_user_by_username', {'username': username})
    if security.check_password_hash(user['hashed_password'], password):
        return _create_user_response(user)

    flask.abort(400, 'incorrect username or password')
def set_tag_of_post():
    body = flask.request.get_json()
    user_id = jwt.get_jwt_identity()
    post_id = int(body['post_id'])
    tags = [{'post_id': post_id, 'tag': tag_name} for tag_name in body['tags']]

    # check if is owner or moderator and above
    post = db.query_fetchone('get_post_by_id', {'id': post_id})
    user = db.query_fetchone('get_user_by_id', {'id': user_id})
    if user_id != post['uploader_id'] and user['authority'] > 2:
        flask.abort(401)

    # delete all created post_tag
    db.do_query('delete_post_tags_by_post_id', {
        'post_id': post_id,
    })

    # insert new
    db.do_query('insert_tag', tags)
    return flask.jsonify({'post_id': post_id})
def info_change():
    body = flask.request.get_json()
    display_name = body['display_name']
    old_password = body['old_password']
    new_password = body['new_password']

    user_id = jwt.get_jwt_identity()
    user = db.query_fetchone('get_user_by_id', {'id': user_id})
    if not security.check_password_hash(user['hashed_password'], old_password):
        flask.abort(401)

    hash_password = user['hashed_password']
    if new_password:
        hash_password = security.generate_password_hash(new_password,
                                                        salt_length=32)

    user = db.query_fetchone('update_user_info', {
        'display_name': display_name,
        'hashed_password': hash_password,
    })
    return _create_user_response(user)
def clap_on_post():
    body = flask.request.get_json()
    user_id = jwt.get_jwt_identity()
    post_id = int(body['post_id'])
    amount = int(body['amount'])

    result = db.query_fetchone('upsert_clap', {
        'user_id': user_id,
        'post_id': post_id,
        'amount': amount,
    })
    return flask.jsonify(result)
def comment_on_post():
    body = flask.request.get_json()
    user_id = jwt.get_jwt_identity()
    post_id = int(body['post_id'])
    content = body['content']
    time = datetime.utcnow()

    result = db.query_fetchone('insert_comment', {
        'user_id': user_id,
        'post_id': post_id,
        'content': content,
        'time': time,
    })
    return flask.jsonify(result)
def register():
    body = flask.request.get_json()
    username = body['username']
    password = body['password']
    display_name = body['display_name']

    user = db.query_fetchone(
        'insert_user', {
            'username':
            username,
            'hashed_password':
            security.generate_password_hash(password, salt_length=32),
            'display_name':
            display_name,
            'authority':
            4,
        })

    return _create_user_response(user)
def create_post():
    body = flask.request.get_json()

    query = ''
    params = {
        'hidden': False,
        'time': datetime.utcnow(),
        'uploader_id': jwt.get_jwt_identity(),
        'title': body['title'],
        'total_claps': 0,
    }

    if body['type'] == 1:
        params['status'] = 'queue'
        query = 'insert_image_post'
    elif body['type'] == 2:
        params['content'] = body['content']
        query = 'insert_discuss_post'

    data = db.query_fetchone(query, params)
    if body['type'] == 1:
        file.write_base64_image_to_file(str(data['post_id']), body['file_b64'])

    return flask.jsonify(data)
def get_user_info():
    user_id = jwt.get_jwt_identity()
    user = db.query_fetchone('get_user_by_id', {'id': user_id})
    return _create_user_response(user)
def get_post_detail():
    post_id = int(flask.request.args.get('post_id'))

    data = db.query_fetchone('get_post_by_id', {'id': post_id})
    return flask.jsonify(data)