depiedencap-rag/lib/demo_purge.rb
grgmro 39cffbc1bb depiedencap-rag — export public initial
Plugin Discourse RAG (grain post, rerank cross-encoder, citations
whitelistées, gate déterministe, réécriture de requête multi-tour)
+ documentation du chantier (design, éval, sécurité, pipeline).

Export sanitisé depuis le monorepo privé via scripts/export_rag_public.py
(aucun endpoint interne, IP, compte démo ou chemin d'infrastructure).
WIP : agent en test sur groupe restreint, pas encore public sur le forum.
2026-09-17 09:26:45 +02:00

63 lines
1.9 KiB
Ruby

# frozen_string_literal: true
module DepiedencapAiCitations
# Purge MP du compte partagé **demo uniquement**.
# Jamais un autre membre : username figé, refus staff, MP sans autre humain.
class DemoPurge
# Figé volontairement — pas de SiteSetting (un admin pourrait viser un autre compte).
USERNAME = "demo"
def self.demo_user?(user)
return false if user.blank?
return false if user.id.to_i <= 0
return false unless user.username_lower == USERNAME
return false if user.staff? || user.admin? || user.moderator?
true
end
def self.wipe!(user)
return 0 unless SiteSetting.depiedencap_ai_citations_enabled
return 0 unless demo_user?(user)
locked = User.find_by(username_lower: USERNAME)
return 0 if locked.blank? || locked.id != user.id
return 0 if locked.staff? || locked.admin? || locked.moderator?
topic_ids =
Topic
.joins(:topic_allowed_users)
.where(archetype: Archetype.private_message)
.where(topic_allowed_users: { user_id: locked.id })
.distinct
.pluck(:id)
deleted = 0
topic_ids.each do |tid|
topic = Topic.with_deleted.find_by(id: tid)
next if topic.nil? || topic.deleted_at.present?
next unless topic.private_message?
human_ids =
TopicAllowedUser.where(topic_id: tid).where("user_id > 0").pluck(:user_id).uniq
next unless human_ids == [locked.id]
first = topic.first_post || topic.posts.with_deleted.order(:post_number).first
next if first.nil?
PostDestroyer.new(
Discourse.system_user,
first,
context: "depiedencap demo purge",
force_destroy: true,
).destroy
deleted += 1
rescue StandardError => e
Rails.logger.warn(
"DepiedencapAiCitations::DemoPurge topic=#{tid}: #{e.class} #{e.message}",
)
end
deleted
end
end
end