사용자들끼리의 차단 기능을 구현하고자 한다.
block
이라는 이름으로 일단은 간단하게 생성하였다. 칼럼은 차단자와 차단 대상만으로 구성하였다.
외래키도 다음과 같이 구성하였다. 차단자 혹은 차단대상이 회원탈퇴를 한 경우 저절로 차단도 풀리는 것으로 하였다.
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}
)
"""