[DB] 차단 기능 구현

장선규·2022년 10월 27일
1

DB

목록 보기
4/4

사용자들끼리의 차단 기능을 구현하고자 한다.

참고1
참고2

차단 테이블 생성

block 이라는 이름으로 일단은 간단하게 생성하였다. 칼럼은 차단자와 차단 대상만으로 구성하였다.

외래키도 다음과 같이 구성하였다. 차단자 혹은 차단대상이 회원탈퇴를 한 경우 저절로 차단도 풀리는 것으로 하였다.

aws lambda (+ pymysql)


user_uid = get_user_uid(curs, event["headers"]["authorization"])
block_target_id = event["pathParameters"]["id"]

# block_user.py
query = f"INSERT INTO `block` VALUES ({user_uid}, {block_target_id})"
curs.execute(query)
conn.commit()

#unblock_user.py
query = f"DELETE FROM `block` WHERE blocker_uid={user_uid} AND blocked_uid={block_target_id};"
curs.execute(query)
conn.commit()

람다 핸들러 안에서 db에 넣는 로직은 위와 같다.
우선 차단자(user_uid)와 차단대상(block_target_id)의 id를 가져온다.
그리고 block 테이블에 INSERT 하는 간단한 작업이다.
차단 해제도 마찬가지로 동작하고, INSERT에서 DELETE로 바뀐 것 말고는 크게 달라진 것은 없다.

게시글 및 댓글 안 보이게끔 하기

가장 중요한 기능이다.
user1이 user2를 차단했다고 가정하자.
user1의 게시물 및 댓글은 user2에게 보여선 안 된다.
반대로 user2의 게시물 및 댓글도 user1에게 보이면 안 된다. 비록 user2는 user1을 차단하지 않았지만 그래도 보이지 않게 하도록 하였다.

# 게시글 안 보이게끔 하기
query = "SELECT * FROM `recipe` r "
if "authorization" in event["headers"]:
	user_uid = get_user_uid(curs, event["headers"]["authorization"])
    query += f"""
            WHERE r.user_uid NOT IN (
                select blocker_uid from `block` where blocked_uid = {user_uid} 
                UNION DISTINCT
                select blocked_uid from `block` where blocker_uid = {user_uid}
            )
            """
# 댓글 안 보이게끔 하기
comment_query = f"select * from `recipe_comment` rc where rc.recipe_id={idVal} "
if "authorization" in event["headers"]:
	user_uid = get_user_uid(curs, event["headers"]["authorization"])
    comment_query += f"""
            AND rc.user_uid NOT IN (
                select blocker_uid from `block` where blocked_uid = {user_uid} 
                UNION DISTINCT
                select blocked_uid from `block` where blocker_uid = {user_uid}
            )
            """
profile
코딩연습

0개의 댓글