refactor wo pluck

kayrozen 44ad4860 07bc2952

Changed files
+85 -110
config
+1 -1
config/locales/server.en.yml
··· 2 2 en: 3 3 site_settings: 4 4 shadowban_enabled: "Enable shadowban" 5 - shadowban_approved_group_name: "Group name for approved users (users NOT in this group will be shadowbanned)" 5 + shadowban_allowed_group: "Group name for approved users (users NOT in this group will be shadowbanned)" 6 6 shadowban_show_to_staff: "Show shadowbanned posts to staff"
+1 -1
config/locales/server.fr.yml
··· 2 2 fr: 3 3 site_settings: 4 4 shadowban_enabled: "Activer le shadowban" 5 - shadowban_approved_group_name: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)" 5 + shadowban_allowed_group: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)" 6 6 shadowban_show_to_staff: "Afficher les publications shadowban au staff"
+5 -6
config/settings.yml
··· 1 1 # config/settings.yml 2 - shadowban: 2 + shadowban-all-plugin: 3 3 shadowban_enabled: 4 4 default: false 5 - client: true 6 - shadowban_approved_group_name: 7 - default: "approved_users" 8 - client: false 5 + type: bool 6 + shadowban_allowed_group: 7 + default: "" 9 8 type: string 10 9 shadowban_show_to_staff: 11 10 default: true 12 - client: true 11 + type: bool
+78 -102
plugin.rb
··· 1 - # name: shadowban 2 - # about: Hide posts from users NOT in a specific group (whitelist approach) 3 - # version: 0.2.0 4 - # authors: Michael Howell (notriddle), Modified for whitelist groups 1 + # name: shadowban-group 2 + # about: Hide posts from all users except those in a specific group 3 + # version: 0.0.2 4 + # authors: Modified from Michael Howell (notriddle) 5 5 # url: https://github.com/notriddle/discourse-shadowban 6 6 enabled_site_setting :shadowban_enabled 7 7 8 8 after_initialize do 9 9 10 - # Méthode helper pour récupérer les IDs des utilisateurs autorisés (non-shadowban) 11 - def approved_user_ids 12 - return [] unless SiteSetting.shadowban_approved_group_name.present? 10 + # Méthode helper pour vérifier si un utilisateur est dans le groupe autorisé 11 + def self.user_in_allowed_group?(user) 12 + return false unless user 13 + return true if user.staff? && SiteSetting.shadowban_show_to_staff 13 14 14 - Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do 15 - group = Group.find_by(name: SiteSetting.shadowban_approved_group_name) 16 - return [] unless group 17 - 18 - # Récupère les IDs des utilisateurs du groupe approuvé 19 - group.users.pluck(:id) 20 - end 21 - end 22 - 23 - # Méthode pour vérifier si un utilisateur est shadowban (NOT in approved group) 24 - def user_is_shadowbanned?(user_id) 25 - return false unless SiteSetting.shadowban_enabled 26 - return false unless SiteSetting.shadowban_approved_group_name.present? 27 - return false if user_id.nil? 15 + group_name = SiteSetting.shadowban_allowed_group 16 + return true if group_name.blank? # Si aucun groupe n'est défini, tous les utilisateurs sont autorisés 28 17 29 - # Si l'utilisateur n'est PAS dans le groupe approuvé, il est shadowban 30 - !approved_user_ids.include?(user_id) 31 - end 32 - 33 - # Invalide le cache quand les membres du groupe changent 34 - DiscourseEvent.on(:user_added_to_group) do |user, group| 35 - if group.name == SiteSetting.shadowban_approved_group_name 36 - Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}") 37 - end 38 - end 39 - 40 - DiscourseEvent.on(:user_removed_from_group) do |user, group| 41 - if group.name == SiteSetting.shadowban_approved_group_name 42 - Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}") 43 - end 18 + user.groups.where(name: group_name).exists? 44 19 end 45 20 46 - # Invalide le cache quand le nom du groupe change 47 - DiscourseEvent.on(:site_setting_changed) do |name, old_value, new_value| 48 - if name == :shadowban_approved_group_name 49 - Rails.cache.delete("approved_user_ids_#{old_value}") if old_value.present? 50 - end 21 + # Méthode helper pour vérifier si un utilisateur est shadowban 22 + def self.user_shadowbanned?(user) 23 + return false unless user 24 + return false if user.staff? && SiteSetting.shadowban_show_to_staff 25 + 26 + group_name = SiteSetting.shadowban_allowed_group 27 + return false if group_name.blank? # Si aucun groupe n'est défini, personne n'est shadowban 28 + 29 + !user.groups.where(name: group_name).exists? 51 30 end 52 31 53 32 module ::DiscourseShadowbanTopicView 54 33 def filter_post_types(posts) 55 34 result = super(posts) 56 35 57 - # Le staff peut toujours voir tous les posts 36 + # Si l'utilisateur actuel peut voir les posts shadowban, on ne filtre pas 58 37 if SiteSetting.shadowban_show_to_staff && @user&.staff? 59 38 return result 60 39 end 61 - 62 - # Filtre les posts des utilisateurs shadowban 63 - if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present? 64 - approved_ids = approved_user_ids 65 - if approved_ids.any? 66 - # Montre seulement les posts des utilisateurs approuvés + les posts de l'utilisateur actuel 67 - result = result.where( 68 - 'posts.user_id IN (?) OR posts.user_id = ?', 69 - approved_ids, 70 - @user&.id || 0 71 - ) 72 - else 73 - # Si aucun utilisateur approuvé, montre seulement les posts de l'utilisateur actuel 74 - result = result.where('posts.user_id = ?', @user&.id || 0) 75 - end 76 - end 40 + 41 + group_name = SiteSetting.shadowban_allowed_group 42 + return result if group_name.blank? 77 43 78 - result 44 + # Exclure les posts des utilisateurs qui ne sont PAS dans le groupe autorisé 45 + # sauf si c'est l'utilisateur lui-même qui regarde ses propres posts 46 + result.where( 47 + 'posts.user_id IN ( 48 + SELECT u.id FROM users u 49 + INNER JOIN group_users gu ON u.id = gu.user_id 50 + INNER JOIN groups g ON gu.group_id = g.id 51 + WHERE g.name = ? 52 + ) OR posts.user_id = ?', 53 + group_name, 54 + @user&.id || 0 55 + ) 79 56 end 80 57 end 81 58 ··· 87 64 def default_results(options = {}) 88 65 result = super(options) 89 66 90 - # Le staff peut toujours voir tous les topics 67 + # Si l'utilisateur actuel peut voir les topics shadowban, on ne filtre pas 91 68 if SiteSetting.shadowban_show_to_staff && @user&.staff? 92 69 return result 93 70 end 94 - 95 - # Filtre les topics des utilisateurs shadowban 96 - if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present? 97 - approved_ids = approved_user_ids 98 - if approved_ids.any? 99 - # Montre seulement les topics des utilisateurs approuvés + les topics de l'utilisateur actuel 100 - result = result.where( 101 - 'topics.user_id IN (?) OR topics.user_id = ?', 102 - approved_ids, 103 - @user&.id || 0 104 - ) 105 - else 106 - # Si aucun utilisateur approuvé, montre seulement les topics de l'utilisateur actuel 107 - result = result.where('topics.user_id = ?', @user&.id || 0) 108 - end 109 - end 71 + 72 + group_name = SiteSetting.shadowban_allowed_group 73 + return result if group_name.blank? 110 74 111 - result 75 + # Exclure les topics créés par des utilisateurs qui ne sont PAS dans le groupe autorisé 76 + # sauf si c'est l'utilisateur lui-même qui regarde ses propres topics 77 + result.where( 78 + 'topics.user_id IN ( 79 + SELECT u.id FROM users u 80 + INNER JOIN group_users gu ON u.id = gu.user_id 81 + INNER JOIN groups g ON gu.group_id = g.id 82 + WHERE g.name = ? 83 + ) OR topics.user_id = ?', 84 + group_name, 85 + @user&.id || 0 86 + ) 112 87 end 113 88 end 114 89 ··· 118 93 119 94 module ::DiscourseShadowbanPostAlerter 120 95 def create_notification(user, type, post, opts = {}) 121 - # Le staff reçoit toujours les notifications 122 - if SiteSetting.shadowban_show_to_staff && user&.staff? 123 - return super(user, type, post, opts) 124 - end 125 - 126 - # Ne pas envoyer de notification si le post vient d'un utilisateur shadowban 127 - unless user_is_shadowbanned?(post.user_id) 96 + # Ne pas créer de notification si l'auteur du post est shadowban 97 + # sauf si le destinataire est staff et peut voir les posts shadowban 98 + if (SiteSetting.shadowban_show_to_staff && user&.staff?) || 99 + !DiscourseShadowbanGroup.user_shadowbanned?(post.user) 128 100 super(user, type, post, opts) 129 101 end 130 102 end ··· 136 108 137 109 module ::DiscourseShadowbanPostCreator 138 110 def update_topic_stats 139 - # Ne pas mettre à jour les stats si l'utilisateur est shadowban 140 - unless user_is_shadowbanned?(@post.user_id) 111 + # Ne pas mettre à jour les statistiques si l'utilisateur est shadowban 112 + unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) 141 113 super 142 114 end 143 115 end 144 116 145 117 def update_user_counts 146 118 # Ne pas mettre à jour les compteurs si l'utilisateur est shadowban 147 - unless user_is_shadowbanned?(@post.user_id) 119 + unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) 148 120 super 149 121 end 150 122 end ··· 154 126 prepend ::DiscourseShadowbanPostCreator 155 127 end 156 128 157 - # Ajoute une méthode helper disponible globalement 158 - def self.approved_user_ids 159 - return [] unless SiteSetting.shadowban_approved_group_name.present? 160 - 161 - Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do 162 - group = Group.find_by(name: SiteSetting.shadowban_approved_group_name) 163 - return [] unless group 164 - group.users.pluck(:id) 129 + # Créer un module pour les méthodes helper 130 + module ::DiscourseShadowbanGroup 131 + def self.user_in_allowed_group?(user) 132 + return false unless user 133 + return true if user.staff? && SiteSetting.shadowban_show_to_staff 134 + 135 + group_name = SiteSetting.shadowban_allowed_group 136 + return true if group_name.blank? 137 + 138 + user.groups.where(name: group_name).exists? 165 139 end 166 - end 167 140 168 - def self.user_is_shadowbanned?(user_id) 169 - return false unless SiteSetting.shadowban_enabled 170 - return false unless SiteSetting.shadowban_approved_group_name.present? 171 - return false if user_id.nil? 172 - 173 - !approved_user_ids.include?(user_id) 141 + def self.user_shadowbanned?(user) 142 + return false unless user 143 + return false if user.staff? && SiteSetting.shadowban_show_to_staff 144 + 145 + group_name = SiteSetting.shadowban_allowed_group 146 + return false if group_name.blank? 147 + 148 + !user.groups.where(name: group_name).exists? 149 + end 174 150 end 175 151 end