벨로그 스팸 처리기능 제안서?

·2022년 7월 18일
4

주저리

목록 보기
33/46

내가 작성해놓은 글에 스팸댓글이 달렸다.

근데 못지움

.....?

신고하기도 없고 삭제를 할 수 있는 수단이 없다.

@벨ㄹ...

그래서 코드를 좀 봤다. 어떻게하면 만들 수 있을지

removeComment 코드

주석은 그냥 제가 보면서 붙였습니다 원래는 없어요

=> https://github.com/velopert/velog-server/blob/master/src/graphql/comment.ts

removeComment: async (parent: any, { id }: any, ctx) => {
      // 레포에서 댓글 id로 적힌 값을 가져옴
      const commentRepo = getRepository(Comment);
      const comment = await commentRepo.findOne(id);
      // 댓글 여부 확인
      if (!comment) {
        throw new ApolloError('Comment not found');
      }
      // 로그인 여부 확인
      if (!ctx.user_id) {
        throw new AuthenticationError('Not Logged In');
      }
      ## 댓글 작성자와 리퀘스트를 보낸 유저가 동일한지 확인
      if (ctx.user_id !== comment.fk_user_id) {
        throw new ApolloError('No permission');
      }
      
      // 위에서 긁어온 댓글의 참조키 게시글 ID로 게시글 레포에서 검색한다.
      // 유저정보도 같이 가져올 수 있게끔 관계조건 걸어서 가져옴.
      const post = await getRepository(Post).findOne(comment.fk_post_id, {
        relations: ['user'],
      });

      // 근데 없네? 에러
      if (!post) {
        throw new ApolloError('Post not found');
      }
      
      // 게시글 유저 정보에서 구조분해할당으로 닉네임만 빼옴
      const { username } = post.user;

	  // 댓글 상태값 변경 후 저장
      comment.deleted = true;
      await commentRepo.save(comment);

	  // 사실 여기서부터는 이게 어떤 의미를 가진 엔티티인지 모르겠다.
      // 쿼리빌더를 써본 적이 있다보니 아래의 쿼리문은 해석할 수 있는데 스코어엔티티의 사용목적을 모르겠음
      const postScoreRepo = getRepository(PostScore);
      const score = await postScoreRepo
        .createQueryBuilder()
        .where('fk_post_id = :postId', { postId: comment.fk_post_id })
        .andWhere('fk_user_id = :userId', { userId: ctx.user_id })
        .andWhere("type = 'COMMENT'")
        .orderBy('created_at', 'DESC')
        .getOne();

      if (score) {
        await postScoreRepo.delete(score.id);
      }
      // 이건 SSR에 올려놓은 캐시를 날리는 것 같다. 
      // 새로고침할 때 값 안불러오고 저장되어있는거 바로 불러오는거가 SSR인걸로 안다. 서버사이드렌더링
      await cache.remove(`ssr:/@${username}/${post.url_slug}`);

      try {
        await purgePost(post.id);
      } catch (e) {}

      return true;
    },

대충 이렇게 구성이 되어있는데 벨로그같은 경우 댓글시스템이 어떻게 되어있냐면

그냥 헤더에서 로그인한 유저를 기반으로 권한분기를 해가지고 수정,삭제를 할 수 있게끔 한 것처럼 확인된다.

결국은 권한분기요소를 한개만 더 넣어주면 바로 해결할 수 있는 문제다.

해당 글의 작성자면 해당 글의 댓글에 접근할 수 있게 끔 만들어놓고

      if (ctx.user_id !== comment.fk_user_id || post.fk_user_id !== ctx.user_id ) {
        throw new ApolloError('No permission');
      }

이렇게 한 줄만 추가하면 될 것 같긴한데, 아래 게시글 데이터를 가져오는 과정이 있긴하지만
저건 스코어작업을 위해서 통째로 가져온 것 같아서

일반적으로는 댓글의 유저 아이디 접근이 가능한 것으로 보아
게시글의 유저 아이디 접근도 가능할 것 같다.

아무튼 이렇게 하면 작성자가 모든 댓글의 영향력을 끼칠 수 있어서 해결이 된다고 생각하는데, 문제가 하나 있다.

나같은 경우에는 스팸 댓글이기 때문에 삭제를 하고싶었다.

그런데 스팸 댓글이 아니라, 그냥 마음에 안드는 댓글을 삭제한다고 하면, 이건 말이 조금 달라진다.
왜냐하면 의견은 누구나 자유롭게 낼 수 있고, 그 의견에 묵살하는 것은 가능하지만
다른 사람들이 그 의견을 볼 수 없게 삭제할 수 있는 것은 과한 기능이라고 생각한다.

그래서 결국 필요한 것은 스팸 기능이 될 것 같은데. 이런 고민을 가지고 있다가 벨로그 레포를 보니 이런 이슈가 있었다.

스팸 기능에 대한 생각

이미 누군가 올렸다(ㅋㅋ)

하지만 이게 1인 개발이다보니 할 수 있는 여력에 제한이 있어서, 기능을 구현하는 것도 고민을 해봐야한다.

만약에 나라면, 이런식으로 만들것 같다.
어디서 가져왔냐면, 게임 커뮤니티 인벤에서 사용하고 있는 시스템인데

사용자들이 해당글, 혹은 댓글에 비추천 버튼을 누를 수 있다.
해당 비추천의 개수가 일정량을 넘어설 경우 블라인드처리가 된다.

이정도는 나도 만들 수 있을 것 같은데(?)
상태값 하나 주고, 비추천이 정해놓은 개수가 찍힐 경우 typeorm subscriber update 를 통해서
상태값을 변환하면 되지 않을까? 라고 생각을 해보고 있다.

댓글은 단순하게 상태값만 바꿔서 블라인드 처리를 해놓고
게시글의 경우에는 소프트딜리트로 만들어가지고 리스트에는 보여지지 않게끔 해야한다고 생각한다.

댓글같은 경우에는 보이긴 하고, 누군가의 의견과는 맞지 않기 때문에 저렇게 하면 된다고 생각하는데
게시글같은 경우에는 인력이 필요하다고 생각하고 있다.

솔직히 중국어로 적혀있는 글은 다 벤때리는 것을 생각해봤지만
그냥 중국 사용자가 자신의 기술블로그로 사용할 수 있으니까, 이런 일자무식 마인드는 위험해서

사용자들에 의해 블라인드처리가 된다면
해당 유저에게 메일이 보내진다. 댓글달리면 메일오는것처럼.

그리고 거기에 항소(?)를 할 수 있게 답변을 보내고 관리자가 확인을 한 후 음 그럴만하네~ 라고 하면
소프트딜리트로 지워놓은 것을 초기화하면 된다고 생각한다.

왜냐하면 광고성 글을 적은 사람이 미쳤다고 항소메일을

보낼 수도 있겠네......욕 잔득 적어서 보낼 수도 있겠다...^^(인간의 사악함은 끝이 없으니)
이 경우에는 고민을 더 해봐야할 것 같다.

왜냐하면 광고성 글이 만약에 한국어도 영어도 아니라면...
필터링 시스템이 의미가 없다. 언어가 달라서 인식을 못하는데(...)

고민은 벨로퍼트님이 더 하시겠지만 그냥 이런저런 생각이 나서 적었고
전달해드려야지


근데 클라이언트 레포에 코멘트 코드 뒤져보면

이런거 있던데 이미 작업해두신게 아닐까 싶기도하고


아니 저 댓글 지워줘요 흑흑
profile
물류 서비스 Backend Software Developer

2개의 댓글

comment-user-thumbnail
2022년 7월 18일

금방 작업 할 것 같은데!
이번 분기 안에 넣어볼게요 :)

자기 벨로그에 달린 댓글 삭제나.. 신고 기능이나.. 다 계획중이랍니다 ! 빨리 실행을 해보는걸로..!!

1개의 답글