Пример #1
0
def diaries_series(series_id):
    """시리즈별 다이어리 보여주는 API

    """
    try:
        db = None

        user_id = 1

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        diaries = model_dao.search_diaries_in_series(db, series_id, user_id)

        diary=[
            {
                "diary_id": data['id'],
                "emotion_id": data['emotion_id'],
                "image_url":data['image_url'],
                "color":data['color'],
                "summary":data['summary'],
                "like": True if data['is_deleted'] == 0 else False,
                "is_public": True if data['public'] == 1 else False,
                "count":model_dao.count_likes(db, data['id'])
            }for data in diaries]

        return jsonify(diary), 200
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #2
0
def change_series_name(series_id):
    """시리즈 이름 변경 API

    """
    try:
        db = None

        user_id = 1
        name = request.json['name']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        db.begin()
        model_dao.update_series_name(db, name, series_id)
        db.commit()
        return (''), 200

    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #3
0
def select_diary(**kwargs):
    """다이어리 가져오기"""
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        diary = model_dao.select_diary(db, kwargs['id'], kwargs['diary_id'])
        data = {
            'emotion_id': diary['emotion_id'],
            'series_id': diary['series_id'],
            'contents': diary['contents'],
            'summary': diary['summary'],
            'is_completed': diary['is_completed'],
            'public': diary['public']
        }
        return jsonify(data=data), 200

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #4
0
def find_user_series():
    """ user별 시리즈 조회

    """
    db = None
    try:
        user_id = 1

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        series_data = model_dao.my_series(db, user_id)
        data = [
            {
                "id": series['id'],
                "name": series['name'],
                "count": model_dao.count_series_diary(db, user_id, series['id'])
            }for series in series_data ]

        return jsonify(data), 200

    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #5
0
def check_if_email_exist():
    """이메일 중복 확인

        Args:
            email : 사용자의 이메일
    """
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data = request.json
        email = model_dao.search_email(db, data['email'])

        if email:
            return jsonify(message="EMAIL_ALREADY_EXIST"), 400
        return jsonify(message="AVAILABLE_EMAIL"), 200

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #6
0
def check_if_nickname_exist():
    """닉네임 중복 확인

        Args:
            nickname : 사용자의 닉네임
    """
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data = request.json
        nickname = model_dao.search_nickname(db, data['nickname'])

        if nickname:
            return jsonify(message="NICKNAME_ALREADY_EXIST"), 400
        return jsonify(message="AVAILABLE_NICKNAME"), 200

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #7
0
def delete_diary(**kwargs):
    """다이어리 삭제"""
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        db.begin()
        model_dao.delete_diary(db, kwargs['id'], kwargs['diary_id'])
        db.commit()
        return '', 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #8
0
def new_series():
    """새로운 시리즈 생성 API

    """

    db = None
    try:
        # user_id = 토큰에서 받아온 user_id
        user_id = 1
        name = request.json['name']

        db = db_connector()
        # db 에러처리
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        series_id = model_dao.search_series(db, user_id, name)

        # 시리즈 중복 확인
        if series_id:
            return jsonify(message="EXIST_SERIES"), 400

        # db에 값 추가
        db.begin()
        model_dao.insert_series(db, user_id, name)
        db.commit()

        return (''), 200

    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #9
0
def delete_series(series_id):
    """시리즈 삭제하는 API

    """
    try:
        db = None

        user_id = 1

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        db.begin()
        model_dao.delete_series_from_db(db, series_id, user_id)
        model_dao.delete_series_from_diaries(db, series_id, user_id)
        db.commit()
        return (''), 200

    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #10
0
def delete_diary(series_id):
    """
    시리즈에서 다이어리 삭제하는 API
    """
    try:
        db = None

        user_id = 1

        diaries = request.json['diary_id']

        # requset body로 들어온 diary id를 tuple로 변경
        diary_list = []
        for diary in diaries:
            diary_id = diary['id']
            diary_list.append(diary_id)
        diary_tuple = tuple(diary_list)

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        db.begin()
        model_dao.delete_diary_from_series(db, diary_tuple, user_id, series_id)
        db.commit()
        return (''), 200

    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #11
0
def find_user_series(**kwargs):
    """user별 시리즈 조회.

    Headers:
        token

    Return:
        {data}, http status code

    Exceptions:
        InternalError: DATABASE가 존재하지 않을 때 발생
        OperationalError: DATABASE 접속이 인가되지 않았을 때 발생
        ProgramingError: SQL syntax가 잘못되었을 때 발생
        IntegrityError: Key의 무결성을 해쳤을 때 발생
        DataError: 컬럼 타입과 매칭되지 않는 값이 DB에 전달되었을 때 발생
        KeyError: 엔드포인트에서 요구하는 키값이 전달되지 않았을 때 발생
    """
    db = None
    try:
        user_id = kwargs['id']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        series_data = model_dao.my_series(db, user_id)
        data = [{
            "id":
            series['id'],
            "name":
            series['name'],
            "count":
            model_dao.count_series_diary(db, user_id, series['id'])
        } for series in series_data]

        return jsonify(data), 200

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except KeyError:
        return jsonify(message="KEY_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #12
0
def select_all_diaries(**kwargs):
    """
    모든 다이어리 보기

    ---주석 지우면 안되요!!---
    토큰값 없어서 임시로 주석 달아 놓음.

    """
    db = None
    try:
        #user_id = kwargs['id']

        # pagination 조건 생성
        filter_dict = {}
        filter_dict['limit'] = request.args.get('limit', 10, int)
        filter_dict['offset'] = request.args.get('offset', 0, int)

        filter_dict['emotion'] = request.args.getlist('emotion', int)
        filter_dict['startdate'] = request.args.get('startdate')
        filter_dict['enddate'] = request.args.get('enddate', datetime.today(),
                                                  str)

        filter_dict['pop']

        db = db_connector()

        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        all_diary_list = model_dao.search_all_diaries(db, filter_dict)
        #like_count = model_dao.search_is_like(db, user_id)

        all_diary = [
            {
                "nickname": diary['nickname'],
                "diary_id": diary['id'],
                "emotion_id": diary['emotion_id'],
                "image_url": diary['image_url'],
                "color": diary['color'],
                "summary": diary['summary'],
                #"like":True if model_dao.search_is_like(db, user_id, diary['id']) == 1 else False,
                "count": model_dao.count_likes(db, diary['id'])
            } for diary in all_diary_list
        ]
        return jsonify(diary=all_diary), 200

    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #13
0
def sign_up():
    """이메일 회원가입

        Args:
            email : 사용자의 이메일
            nickname : 사용자의 닉네임
            password : 사용자의 비밀번호
    """
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data = request.json
        email = model_dao.search_email(db, data['email'])
        if email:
            return jsonify(message="EMAIL_EXIST"), 400

        data['password'] = bcrypt.hashpw(data['password'].encode('utf-8'),
                                         bcrypt.gensalt())

        db.begin()
        model_dao.create_user(db, data['email'], data['password'],
                              data['nickname'])
        db.commit()
        return '', 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #14
0
def question():
    db = None
    try:
        db = db_connector()

        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data = model_dao.search_question(db)
        return jsonify(question=data), 200
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #15
0
def sign_in():
    """이메일 로그인

        Args:
            email : 사용자의 이메일
            password : 사용자의 비밀번호

        Returns:
            token : 로그인시 발행되는 JWT 토큰
    """
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data = request.json
        user = model_dao.search_email(db, data['email'])

        if user:
            if bcrypt.checkpw(data['password'].encode('utf-8'),
                              user['password'].encode('utf-8')):
                token = jwt.encode(
                    {
                        'id': user['id'],
                        'exp': datetime.utcnow() + timedelta(hours=1)
                    }, SECRET_KEY, ALGORITHM).decode('utf-8')
                return jsonify(token=token), 200

            return jsonify(message="PASSWORD_DOES_NOT_MATCH"), 400
        return jsonify(message="EMAIL_DOES_NOT_EXIST"), 400

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #16
0
def kakao():
    """ kakao 로그인 API

    """
    db = None
    try:
        token = request.headers['Authorization']
        nickname = request.get_json(silent=True).get('nickname', None)

        if not token:
            return jsonify(message="TOKEN_DOES_NOT_EXIST"), 400

        data = request.get('https://kapi.kakao.com/v2/user/me',
                           headers={'Authorization': f'Bearer {token}'})
        kakao_id = data.json()['kakao_id']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        kakao_user = model_dao.search_kakao_user(db, kakao_id)
        # 가입된 계정인 경우 로그인 진행
        if kakao_user:
            token = jwt.encode(kakao_user, SECRET_KEY, ALGORITHM)
            return Jsonify(token=token.decode('utf-8'), nickname=nickname), 200
        # 가입되어있지 않은 계정인 경우 회원가입 진행
        elif kakao_user is None:
            db.begin()
            social_id = model_dao.insert_kakao_user(db, kakao_id)
            if nickname:
                kakao_user = model_dao.insert_kakao_into_user(
                    db, social_id, nickname)
                token = jwt.encode(kakao_user, SECRET_KEY, ALGORITHM)
                return Jsonify(token=token.decode('utf-8'),
                               nickname=nickname), 200
            # 닉네임 입력하지 않은 경우 에러처리
            elif nickname is None:
                return jsonify(message="DATA_ERROR"), 400
            db.commit()

    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #17
0
def select_member_information(**kwargs):
    db = None
    try:
        user_id = kwargs['id']

        db = db_connector()

        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data = model_dao.select_user_information(db, user_id)

        return jsonify(data), 200
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #18
0
def like_diary(**kwargs):
    """다이어리 좋아요"""
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        user_id = kwargs['id']
        diary_id = kwargs['diary_id']
        liked_diary = model_dao.search_id_like(db, user_id, diary_id)

        db.begin()
        if liked_diary:
            model_dao.delete_liked_diary(db, user_id, diary_id)
            return jsonify(message=False), 200

        model_dao.like_diary(db, user_id, diary_id)
        db.commit()
        return jsonify(message=True), 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #19
0
def modify_diary(**kwargs):
    """다이어리 수정"""
    db = None
    try:
        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data = request.json()
        db.begin()
        model_dao.update_diary(db, data['emotion_id'], data['series_id'],
                               data['contents'], data['summary'],
                               data['is_completed'], data['public'],
                               kwargs['id'], kwargs['diary_id'])
        db.commit()
        return '', 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except KeyError:
        db.rollback()
        return jsonify(message="KEY_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #20
0
def other_person_diary(**kwargs):
    db = None
    try:

        users_id = kwargs['id']

        db = db_connector()

        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        data_list = model_dao.other_person_diary(db, user_id)

        other_person = [{
            "nickname":
            data['nickname'],
            "diary_id":
            data['id'],
            "emotion_id":
            data['emotion_id'],
            "image_url":
            data['image_url'],
            "color":
            data['color'],
            "summary":
            data['summary'],
            "like":
            True if model_dao.search_is_like(db, users_id, data['id']) == 1
            else False,
            "count":
            model_dao.count_likes(db, data['id'])
        } for data in data_list]
        return jsonify(diary=other_person), 200
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #21
0
def new_series(**kwargs):
    """새로운 시리즈 생성 API.

    Headers:
        Token

    Args:
        user_id: 사용자 id
        name: 생성될 시리즈 이름

    Return:
        None

    Exceptions:
        InternalError: DATABASE가 존재하지 않을 때 발생
        OperationalError: DATABASE 접속이 인가되지 않았을 때 발생
        ProgramingError: SQL syntax가 잘못되었을 때 발생
        IntegrityError: Key의 무결성을 해쳤을 때 발생
        DataError: 컬럼 타입과 매칭되지 않는 값이 DB에 전달되었을 때 발생
        KeyError: 엔드포인트에서 요구하는 키값이 전달되지 않았을 때 발생
    """
    db = None
    try:
        # user_id = 토큰에서 받아온 user_id
        user_id = kwargs['id']
        name = request.json['name']

        db = db_connector()
        # db 에러처리
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        # 시리즈 중복 확인
        series_id = model_dao.search_series(db, user_id, name)
        # 시리즈가 존재하면 Error
        if series_id:
            return jsonify(message="EXIST_SERIES"), 400

        # db에 값 추가
        db.begin()
        model_dao.insert_series(db, user_id, name)
        db.commit()

        return (''), 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except KeyError:
        db.rollback()
        return jsonify(message="KEY_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #22
0
def modifying_member_information(**kwargs):
    db = None
    try:
        data = request.json
        user_id = kwargs['id']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        #회원 정보 변경 전 기존 비밀번호 확인
        if bcrypt.checkpw(data['password'].encode('utf-8'),
                          kwargs['password'].encode('utf-8')):

            #닉네임 검사 후 있는 닉네임이면 변경 불가
            nickname = model_dao.search_nickname(db, data['nickname'])
            if nickname:
                return jsonify(message="NICKNAME_ALREADY_EXiST"), 400

            #비밀번호를 변경 했다면 새 비밀번호와 닉네임 저장 후 새 토큰 발행
            if data['new_password'] != None:
                new_password = bcrypt.hashpw(
                    data['new_password'].encode('utf-8'), bcrypt.gensalt())

                db.begin()
                model_dao.put_user_information(db, data['nickname'],
                                               new_password, user_id)
                db.commit()

                #새 토큰 발행
                new_user = model_dao.search_email(db, kwargs['email'])
                token = jwt.encode(
                    {
                        'id': new_user['id'],
                        'exp': datetime.utcnow() + timedelta(hours=1)
                    }, SECRET_KEY, ALGORITHM).decode('utf-8')
                return jsonify(token=token), 200

            #닉네임만 변경했을 때
            else:
                db.begin()
                model_dao.put_user_nickname(db, data['nickname'], user_id)
                db.commit()
                return (''), 200

        #기존 비밀번호 틀렸을 때
        return jsonify(message="PASSWORD_DOES_NOT_MATCH"), 400

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #23
0
def diaries_series(**kwargs):
    """시리즈별 다이어리 보여주는 API.

    Headers:
        token

    Args:
        series_id: 시리즈 id

    Return:
        {diary}, http status code

    Exceptions:
        InternalError: DATABASE가 존재하지 않을 때 발생
        OperationalError: DATABASE 접속이 인가되지 않았을 때 발생
        ProgramingError: SQL syntax가 잘못되었을 때 발생
        IntegrityError: Key의 무결성을 해쳤을 때 발생
        DataError: 컬럼 타입과 매칭되지 않는 값이 DB에 전달되었을 때 발생
        KeyError: 엔드포인트에서 요구하는 키값이 전달되지 않았을 때 발생
    """
    db = None
    try:
        user_id = kwargs['id']
        series_id = kwargs['series_id']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        diaries = model_dao.search_diaries_in_series(db, series_id, user_id)

        diary = [{
            "diary_id": data['id'],
            "emotion_id": data['emotion_id'],
            "image_url": data['image_url'],
            "color": data['color'],
            "summary": data['summary'],
            "like": True if data['is_deleted'] == 0 else False,
            "is_public": True if data['public'] == 1 else False,
            "count": model_dao.count_likes(db, data['id'])
        } for data in diaries]

        return jsonify(diary), 200

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except KeyError:
        return jsonify(message="KEY_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #24
0
def delete_series(**kwargs):
    """시리즈 삭제하는 API.

    Header:
        token

    Args:
        series_id: 시리즈 id

    Return:
        None

    Exceptions:
        InternalError: DATABASE가 존재하지 않을 때 발생
        OperationalError: DATABASE 접속이 인가되지 않았을 때 발생
        ProgramingError: SQL syntax가 잘못되었을 때 발생
        IntegrityError: Key의 무결성을 해쳤을 때 발생
        DataError: 컬럼 타입과 매칭되지 않는 값이 DB에 전달되었을 때 발생
        KeyError: 엔드포인트에서 요구하는 키값이 전달되지 않았을 때 발생
    """
    db = None
    try:
        user_id = kwargs['id']
        series_id = kwargs['series_id']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        db.begin()
        # 시리즈 삭제
        model_dao.delete_series_from_db(db, series_id, user_id)
        # 다이어리에서 해당 시리즈 삭제
        model_dao.delete_series_from_diaries(db, series_id, user_id)
        db.commit()
        return (''), 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except KeyError:
        db.rollback()
        return jsonify(message="KEY_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #25
0
def kakao():
    """kakao 로그인 API.

    Header:
        Authorizaion

    Args:
        nickname: 사용자의 닉네임
        Kakao_id: 카카오톡 소셜 아이디

    Returns:
        {
            token: JWT_TOKEN,
            nickname: 닉네임
        }, http status code

    Exceptions:
        InternalError: DATABASE가 존재하지 않을 때 발생
        OperationalError: DATABASE 접속이 인가되지 않았을 때 발생
        ProgramingError: SQL syntax가 잘못되었을 때 발생
        IntegrityError: Key의 무결성을 해쳤을 때 발생
        DataError: 컬럼 타입과 매칭되지 않는 값이 DB에 전달되었을 때 발생
    """
    db = None
    try:
        access_token = request.headers['Authorization']
        nickname = request.get_json(silent=True)
        if not access_token:
            return jsonify(message="TOKEN_DOES_NOT_EXIST"), 400

        data = requests.get(
            'https://kapi.kakao.com/v2/user/me',
            headers={'Authorization': f'Bearer {access_token}'})
        kakao_id = data.json()['id']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        kakao_user = model_dao.search_kakao_user(db, kakao_id)
        # 가입된 계정인 경우 로그인 진행
        if kakao_user:
            nickname = kakao_user['nickname']
            token = jwt.encode(kakao_user, SECRET_KEY, ALGORITHM)
            return jsonify(token=token.decode('utf-8'),
                           nickname=nickname,
                           message="SIGN_IN_COMPLETE"), 200

        # 가입되어있지 않은 계정인 경우 회원가입 진행
        elif kakao_user is None:
            # 닉네임 입력하지 않은 경우 에러처리
            if nickname is None:
                return jsonify(message="DATA_ERROR"), 400

            db.begin()
            social_id = model_dao.insert_kakao_user(db, kakao_id)
            nickname = nickname['nickname']
            kakao_user = model_dao.insert_kakao_into_user(
                db, social_id, nickname)
            token = jwt.encode({"id": kakao_user}, SECRET_KEY, ALGORITHM)
            db.commit()
            return jsonify(token=token.decode('utf-8'),
                           nickname=nickname,
                           message="SIGN_UP_COMPLETE"), 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #26
0
def membership_withdrawal(**kwargs):
    """회원 탈퇴 API

    Headers:
        token

    Args:
        None

    Return:
        None

    Exceptions:
        InternalError: DATABASE가 존재하지 않을 때 발생
        OperationalError: DATABASE 접속이 인가되지 않았을 때 발생
        ProgramingError: SQL syntax가 잘못되었을 때 발생
        IntergrityError: Key의 무결성을 헤쳤을 때 발생
        DataError: 컬럼 타입과 매칭되지 않는 값이 DB에 전달되었을 때 발생
        KeyError: 엔드포인트에서 요구하는 키값이 전달되지 않았을 때 발생
    """
    db = None
    try:
        user_id = kwargs['id']

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        db.begin()
        model_dao.delete_user(db, user_id)
        model_dao.delete_user_diary(db, user_id)
        model_dao.delete_user_series(db, user_id)
        model_dao.delete_user_like(db, user_id)

        db.commit()
        return (''), 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except KeyError:
        db.rollback()
        return jsonify(message="KEY_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close
Пример #27
0
def google():
    db = None
    try:

        data = request.json

        GOOGLE_AUTH_URL = 'https://oauth2.googleapis.com/tokeninfo?id_token='
        CORRECT_ISS_LIST = [
            'accounts.google.com', 'https://accounts.google.com'
        ]

        google_id = data['googleId']
        google_token = data['token']
        nickname = request.get_json(silent=True).get('nickname', None)

        token_data = json.loads(
            requests.get(GOOGLE_AUTH_URL + google_token).text)

        if (token_data['iss']
                not in CORRECT_ISS_LIST) or (token_data['sub'] != google_id):
            return {'message': 'MODIFIED_TOKEN'}, 401

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        google_user = model_dao.serch_google_user(db, google_id)
        # 가입된 계정인 경우 로그인 진행
        if google_user:
            token = jwt.encode(google_user, SECRET_KEY, ALGORITHM)
            return jsonify(token=token.decode('utf-8'), nickname=nickname), 200

        elif google_user is None:
            db.begin()
            social_id = model_dao.insert_google_user(db, google_id)
            if nickname:
                google_user = model_dao.insert_google_into_user(
                    db, social_id, nickname)
                token = jwt.encode(google_user, SECRET_KEY, ALGORITHM)
                return jsonify(token=token.decode('utf-8'),
                               nickname=nickname), 200

            elif nickname is None:
                return jsonify(message="DATA_ERROR"), 400
            db.commit()

    except pymysql.err.InternalError:
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        return jsonify(message="DATA_ERROR"), 400
    except Exception as e:
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #28
0
def change_public(**kwargs):
    """다이어리 공개 여부 변경 API.

    Headers:
        token

    Args:
        user_id:
        diary_id: 다이어리 id
        status: 공개 여부

    Return:
        None

    Exceptions:
        InternalError: DATABASE가 존재하지 않을 때 발생
        OperationalError: DATABASE 접속이 인가되지 않았을 때 발생
        ProgramingError: SQL syntax가 잘못되었을 때 발생
        IntegrityError: Key의 무결성을 해쳤을 때 발생
        DataError: 컬럼 타입과 매칭되지 않는 값이 DB에 전달되었을 때 발생
        KeyError: 엔드포인트에서 요구하는 키값이 전달되지 않았을 때 발생
    """
    db = None
    try:
        user_id = kwargs['id']

        diaries = request.json['diary_id']

        # Public 상태 변경
        status = request.args['status']
        if status == 'public':
            public = 1
        elif status == 'secret':
            public = 0

        # requset body로 들어온 diary id를 tuple로 변경
        diary_list = []
        for diary in diaries:
            diary_id = diary['id']
            diary_list.append(diary_id)
        diary_tuple = tuple(diary_list)

        db = db_connector()
        if db is None:
            return jsonify(message="DATABASE_INIT_ERROR"), 500

        db.begin()
        model_dao.change_diary_public(db, public, diary_tuple, user_id)
        db.commit()
        return (''), 200

    except pymysql.err.InternalError:
        db.rollback()
        return jsonify(message="DATABASE_DOES_NOT_EXIST"), 500
    except pymysql.err.OperationalError:
        db.rollback()
        return jsonify(message="DATABASE_AUTHORIZATION_DENIED"), 500
    except pymysql.err.ProgrammingError:
        db.rollback()
        return jsonify(message="DATABASE_SYNTAX_ERROR"), 500
    except pymysql.err.IntegrityError:
        db.rollback()
        return jsonify(message="FOREIGN_KEY_CONSTRAINT_ERROR"), 500
    except pymysql.err.DataError:
        db.rollback()
        return jsonify(message="DATA_ERROR"), 400
    except KeyError:
        db.rollback()
        return jsonify(message="KEY_ERROR"), 400
    except Exception as e:
        db.rollback()
        return jsonify(message=f"{e}"), 500
    finally:
        if db:
            db.close()
Пример #29
0
import os, sys
import pymysql

ROOT_DIR = os.path.dirname(os.path.abspath("API"))
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.extend([ROOT_DIR])
os.chdir(BASE_DIR)

from database_utils import init_databases, import_aquery
from connections import db_connector

db = db_connector()
cursor = db.cursor()

db.begin()
init_databases(db)

with open('whisper_20200708_14_12.txt', 'r') as f:
    TABLE_QUERIES = import_aquery(f)

for query in TABLE_QUERIES:
    cursor.execute(query)

db.commit()
cursor.close()
db.close()
print('COMPLETE')