인프런 커뮤니티 질문&답변

Dongmin Kim님의 프로필 이미지
Dongmin Kim

작성한 질문수

Slack 클론 코딩[실시간 채팅 with React]

사용자 차단 로직 구성에 대한 질문

작성

·

1.1K

0

안녕하세요. 정말 좋은 강의와 소스코드 공개 정말 감사드립니다.

강의의 내용보다 더 나간 내용이긴 하지만 혹시나 가능하시다면 하여 질문드립니다.

user1, user2 가 있을 때 user1 이 user2 를 사용자 차단할 경우 게시글 같은 것이 있을 경우

user1 에게도 user2 의 게시물이 안보여야하고 user2 에게도 user1 의 게시물이 안보여야 하고

DM 의 경우에도 (channelchat 과 같은 단톡은 일단 고려하지 않음) 

user1 이 user2 를 차단하였으므로

user1 의 사용자가 표시되는 리스트에 user2 가 안보여야하고

user2 의 사용자가 표시되는 리스트에도 user1 이 보이지 않아야하며

DM 도 user1 이 user2 에게 보낼 수 없고 user2 가 user1 에게도 보낼 수 없고

user1 과 user2 의 DM 이 있다손 치면 그것들이 차단을 했으니 상호간에 삭제되어야하고 (paranoid 방식일지라도)

하는 시나리오가 있을 경우 해당 block 이라는 user vs user 의 다대다 관계를 어떻게 구성하는 것이 좋을지 문의드립니다.

https://stackoverflow.com/questions/54605069/how-should-i-design-a-user-blocking-system


Table User
id (pk)  | user_name
1       | a
2       | b
3       | c

Table Post
id (pk)  | user_id (fk)
1       | 1
2       | 3
3       | 2
4       | 2

Table Block
id (pk) | blocker_id (fk)  | blocked_id (fk)
1       | 1              | 2
2       | 2              | 1

select
* from User join Block on User.id = Block.blocker_id or User.id = Block.blocked_id
select *
from Post p
where p.user_id = @current_user_id and
      not exists (select id
                  from Block
                  where Block.blocker_id = p.user_id or Block.blocked_id = p.user_id)

이런식으로 SQL 을 짜면 된다고 stackoverflow 에서 나와 있는데요

User 의  associate 부분에 이렇게 구성하면 될까요?

static associate(db) {

  db.User.belongsToMany(db.User, {through: "Block"});

}

답변 4

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

db.User.belongsToMany(db.User, {through: "block", as: "Blocker", foreignKey: "BlockedId"});
db.User.belongsToMany(db.User, {through: "block", as: "Blocked", foreignKey: "BlockerId"});
포린키와 as는 서로 반대여야 합니다.
Dongmin Kim님의 프로필 이미지
Dongmin Kim
질문자

감사합니다!! belongsTo 는 targetKey, foreignKey 가 사용되니 곰곰히 생각하니 이렇게 해야하네요. 정말 감사해요. 이런 조언을 받기 정말 힘든데...

0

Dongmin Kim님의 프로필 이미지
Dongmin Kim
질문자

다음과 같이 하니 block 테이블이 이렇게 생성이 되었습니다. 이게 맞는걸까요? 아니면 위에 것이 맞는걸까요?

db.User.belongsToMany(db.User, {through: "block", as: "Blocker", foreignKey: "BlockerId"});
db.User.belongsToMany(db.User, {through: "block", as: "Blocked", foreignKey: "BlockedId"});

0

Dongmin Kim님의 프로필 이미지
Dongmin Kim
질문자

다음과 같이 하였더니 테이블이 생각하는 것과 다르게 생성이 된 것 같은데요. 이렇게 된 게 맞는걸까요?

foreignKey 같은 설정도 추가해야 할까요??

db.User.belongsToMany(db.User, {through: "block", as: "Blocker"});
db.User.belongsToMany(db.User, {through: "block", as: "Blocked"});

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

dm은 보낼수는 있게 하되 받는쪽에서는 알림이 안 가도록 해야 보내는 사람이 자신이 차단된지 모를 것 같네요.

시퀄라이즈 코드에서는 as: 'Blocker'랑

db.User.belongsToMany(db.User, {through: "Block", as: 'Blocked'});

두 개 추가하셔야 쌍방간에 다대다가 연결됩니다.

Dongmin Kim님의 프로필 이미지
Dongmin Kim
질문자

감사합니다!

우선 테이블 구성을 저렇게 하고 나머지 게시물 노출이나 채팅 에 대한 구현은 꾸역꾸역 찾아가며 해봐야겠네요 감사합니다.

Dongmin Kim님의 프로필 이미지
Dongmin Kim

작성한 질문수

질문하기