inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

1277

Dongmin Kim

작성한 질문수 6

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"});

}

Socket.io 웹팩 babel react typescript 클론코딩

답변 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는 서로 반대여야 합니다.

0

Dongmin Kim

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

0

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

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

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'});

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

0

Dongmin Kim

감사합니다!

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

기본 셋팅과 관련하여

0

106

1

초기 셋팅 back과 front만 남겨두고 다 지운 후 진행 방법

0

109

2

focus 시에만 화면 업데이트 되는 이유 + 해결방법

0

165

2

useEffect 개수 관리

0

122

2

라이브러리 서치 방법

0

118

2

함수 정의 패턴

0

80

1

npm run dev 에러

0

156

3

npx webpack 후 에러

0

187

2

'void' 형식 식의 truthiness를 테스트할 수 없습니다.ts(1345)

0

153

2

사용자 가입시 에러발생 (TypeError: Cannot read properties of null (reading 'addMembers')

1

192

2

초기세팅중 packge.json 에러떠요

0

163

2

CORS - Access-Control-Allow-Origin 누락 문제

0

439

3

로그인 페이지 무한 새로고침 현상

0

608

2

Module not found: Error: Can't resolve './App' 에러

0

970

1

배포 방법

0

306

2

npm run dev 시 빌드가 매우 느려졌습니다

0

1011

2

alias 경로 설정 오류

0

462

2

fetcher 함수의 data 값이 두번 찍히는 이유

0

284

1

제네릭 질문

0

225

2

ts-node 대신 tsx 사용여부

0

379

1

배포 관련 질문

0

249

1

[nginx + https] 서비스를 실행하면 niginx가 아닌 서비스 화면을 보여주게 하고 싶습니다.

0

396

2

[배포하기] webpack에 aws 퍼블릭 IPv4 주소 와 포트 주소를 작성하고 나서 빌드후 실행하면 오류가 발생합니다.

0

341

1

users 호출 시 쿠키가 담기지 않는 이슈 질문드립니다.

0

252

2