ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

58 lines
1.8 KiB

  1. class PostVersionRecorder
  2. def self.record! post:, event_type:, created_by_user:
  3. new(post:, event_type:, created_by_user:).record!
  4. end
  5. def initialize post:, event_type:, created_by_user:
  6. @post = post
  7. @event_type = event_type
  8. @created_by_user = created_by_user
  9. end
  10. def record!
  11. @post.with_lock do
  12. latest = @post.post_versions.order(version_no: :desc).first
  13. attrs = snapshot_attributes
  14. return latest if @event_type == :update && latest && same_snapshot?(latest, attrs)
  15. PostVersion.create!(
  16. post: @post,
  17. version_no: (latest&.version_no || 0) + 1,
  18. event_type: @event_type,
  19. title: attrs[:title],
  20. url: attrs[:url],
  21. thumbnail_base: attrs[:thumbnail_base],
  22. tags: attrs[:tags],
  23. parent: attrs[:parent],
  24. original_created_from: attrs[:original_created_from],
  25. original_created_before: attrs[:original_created_before],
  26. created_at: Time.current,
  27. created_by_user: @created_by_user)
  28. end
  29. end
  30. private
  31. def snapshot_attributes
  32. { title: @post.title,
  33. url: @post.url,
  34. thumbnail_base: @post.thumbnail_base,
  35. tags: @post.snapshot_tag_names.join(' '),
  36. parent: @post.parent,
  37. original_created_from: @post.original_created_from,
  38. original_created_before: @post.original_created_before }
  39. end
  40. def same_snapshot? version, attrs
  41. true &&
  42. version.title == attrs[:title] &&
  43. version.url == attrs[:url] &&
  44. version.thumbnail_base == attrs[:thumbnail_base] &&
  45. version.tags == attrs[:tags] &&
  46. version.parent_id == attrs[:parent]&.id &&
  47. version.original_created_from == attrs[:original_created_from] &&
  48. version.original_created_before == attrs[:original_created_before]
  49. end
  50. end