반응(Reactions)을 이용해 배지 부여하기

흥미로운 방법인 것 같습니다. 더 자세한 내용을 공유해 주시기를 원하신다면 자세히 알고 싶습니다!

물론이죠. :slight_smile:

가장 기본적인 형태로 설명하자면, '이 게시물은 배지를 받을 자격이 있다’는 의미를 나타내는 리액션을 선택합니다. 회원들이 이 리액션을 사용해 게시물을 추천할 수 있고, 쿼리는 해당 리액션을 받은 게시물을 자동으로 수집합니다. 이후 쿼리가 제공하는 목록에서 배지를 수동으로 부여하거나, 목록을 완전히 신뢰한다면 일괄 부여할 수도 있습니다. 아니면 배지의 커스텀 SQL을 설정해 시스템이 자동으로 처리하게 할 수도 있습니다. :magic_wand:

쿼리에 추가 조건을 적용하여 더 정밀하게 대상 범위를 좁힐 수도 있습니다. 예를 들어 ‘특정 리액션이 x개 이상 달린 게시물’ 또는 'TL2 이상 권한이 있는 사용자가 부여한 리액션만 유효’와 같은 조건을 설정할 수 있습니다.

현재 제공되는 이모지 중 마음에 드는 것이 없다면 커스텀 이모지에도 적용할 수 있습니다.

감사합니다! 이것저것 찾아봤는데 이 내용과 정확히 일치하는 쿼리를 찾지 못했어요. 혹시 쿼리를 공유해 주실 수 있을까요? 저는 아직 직접 만들어 본 적이 없지만, 이 부분은 꼭 배워야 할 것 같아요!

제가 직접 만져본 것이 하나 있긴 하지만, 새로운 시각으로 다시 보기 위해 잠시 제쳐두고 아직 다시 손대지 못했기 때문에 아직 다듬어야 할 부분이 있을 수 있습니다. #data-reporting 카테고리에서 ‘data-team’ 그룹의 멤버가 :chefs_kiss: 리액션을 남긴 게시글이 최소 10개 이상인 사용자에게 배지를 수여하는 것입니다:

SELECT p.user_id, MIN(p.created_at) granted_at
FROM badge_posts p
  JOIN topic_tags tt ON tt.topic_id = p.topic_id
WHERE tt.tag_id = 615
  AND EXISTS (
         SELECT 1
            FROM discourse_reactions_reactions dr 
             JOIN discourse_reactions_reaction_users dru ON dr.id = dru.reaction_id
             JOIN group_users gu ON gu.user_id = dru.user_id
            WHERE dr.post_id = p.id
              AND dr.reaction_value = 'chefs_kiss'
              AND gu.group_id = 175
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 10

다만, MIN을 사용했더니 수여 날짜가 잘못 계산되는 문제가 있어서 마음에 들지 않았습니다.

조건이 매우 많고 자동 처리되므로 다소 복잡한 편에 속한다고 생각합니다. 더 간단한 로직이라면 훨씬 적은 노력으로 구현할 수 있을 것 같습니다.

도와주셔서 감사합니다! 우리가 원래 주제에서 벗어나고 있으니, 이 내용은 새 주제로 옮기는 것이 좋을 것 같습니다. 하지만 ChatGPT의 도움을 받아 작성한 쿼리를 공유합니다. 이 쿼리는 특정 반응을 주거나 받은 사용자, 반응 횟수, 반응 날짜, 그리고 해당 게시물로 가는 URL을 반환합니다. 다만, 게시물 URL을 클릭 가능한 링크로 만드는 것만은 해결하지 못했는데, 이는 주제 URL에만 적용되는 것 같습니다.

WITH reaction_pairs AS (
    SELECT 
      p.user_id AS received_reaction_user_id, 
      dru.user_id AS gave_reaction_user_id, 
      dr.post_id,
      t.id AS topic_id,
      t.slug AS topic_slug,
      p.post_number,
      dru.created_at AS reaction_date
    FROM 
      discourse_reactions_reactions dr
      JOIN discourse_reactions_reaction_users dru ON dr.id = dru.reaction_id
      JOIN posts p ON dr.post_id = p.id
      JOIN topics t ON p.topic_id = t.id
    WHERE 
      dr.reaction_value = 'Your_Specific_Reaction_Here'
)
SELECT 
  ur1.id AS user_id, 
  ur2.username AS "반응을 준 사용자",
  'Your_Community_URL' || 't/' || rp.topic_slug || '/' || rp.topic_id || '/' || rp.post_number AS "게시물 URL",
  rp.reaction_date AS "반응 날짜",
  COUNT(*) AS "반응 수"
FROM 
  reaction_pairs rp
  JOIN users ur1 ON rp.received_reaction_user_id = ur1.id
  JOIN users ur2 ON rp.gave_reaction_user_id = ur2.id
GROUP BY 
  ur1.id, 
  ur2.username, 
  rp.topic_slug, 
  rp.topic_id, 
  rp.post_number, 
  rp.reaction_date
ORDER BY 
  "반응 수" DESC, "반응 날짜" DESC

이 부분이 마법을 부리려면 열 이름에 _url을 붙여야 합니다. 즉:

'Your_Community_URL' || 't/' || rp.topic_slug || '/' || rp.topic_id || '/' || rp.post_number AS post_url