Mon Script framework to rearrange topics and categories a une nouvelle fonction qui va un peu au-delà du réarrangement des sujets et des catégories !
Je me souviens généralement de prévenir que je ne connais ni le ruby ni le ruby on rails, donc mon code est idiosyncratique plutôt qu’idiomatique. Mais il semble fonctionner jusqu’à présent dans mes tests !
def migrateRetortToReactions(allowed:, likes: nil, emojimap: nil)
# migrer autant que possible sans remplacer les likes existants
# c'est une conversion nécessairement avec perte, et elle est cohérente uniquement par l'ordre de PostDetail
# aucune tentative n'est faite pour préférer un enregistrement PostDetail à un autre
emojimap = {} if emojimap.nil?
allowed.each do |a|
emojimap[a] = a
end
retort = "retort".freeze
emojiType = "emoji".freeze
usermap = Hash.new { |hash, username| hash[username] = User.find_by_username(username) }
postmap = Hash.new { |hash, post_id| hash[post_id] = Post.find(post_id) }
likeType = PostActionType.where(name_key: "like").pluck(:id).first
PostDetail.where(extra: retort).each do |pd|
begin
p = postmap[pd.post_id]
rescue
# PostDetail incohérent par rapport à la suppression
$stderr.puts sprintf("Impossible de trouver le post pour %d : %s / %s", pd.post_id, pd.key, pd.value)
next
end
emoji = pd.key.split('|').first
users = JSON.parse(pd.value)
users.each do |user|
u = usermap[user]
next if u.nil? # le changement de nom d'utilisateur ou la suppression d'utilisateur laisse des Retorts orphelins
if likes.include?(emoji)
pa = PostAction.where(post_id: p.id, user_id: u.id, post_action_type_id: likeType).first
next unless pa.nil?
$stderr.puts sprintf("Ajout d'un like pour Retort %s pour l'utilisateur %s dans %s", emoji, user, p.url)
PostActionCreator.create(u, p, :like, created_at: pd.created_at, silent: true)
elsif emojimap.has_key?(emoji)
e = emojimap[emoji]
r = DiscourseReactions::Reaction.where(post_id: p.id, reaction_type: emojiType, reaction_value: e).first_or_create
ru = DiscourseReactions::ReactionUser.where(user_id: u.id, post_id: p.id).first
next unless ru.nil?
$stderr.puts sprintf("Conversion de Retort %s en Reaction %s pour l'utilisateur %s dans %s", emoji, e, user, p.url)
DiscourseReactions::ReactionUser.create(reaction_id: r.id, user_id: u.id, post_id: p.id, created_at: pd.created_at)
else
$stderr.puts sprintf("Ignoré Retort non mappé %s pour l'utilisateur %s dans %s", emoji, user, p.url)
end
end
end
end
J’utilise le framework que j’ai construit pour fournir une configuration yaml qui ressemble à ceci :
- migrateRetortToReactions:
allowed:
- rofl
- astonished
- crossed_fingers
- sob
- thinking
- grimacing
- frowning_face
- drum
likes:
- dart
- +1
- joy
- "100"
- brain
- heart
- heart_eyes
- hearts
emojimap:
rage: sob
four_leaf_clover: crossed_fingers
cry: sob
open_mouth: astonished
scream: frowning_face
Cependant, vous pourriez simplement envelopper cela dans un script ruby, y compris en transformant ces arguments en code ruby littéral, le placer dans le répertoire script/ et l’exécuter.