# Verificação de antes e depois do API Guardian

**URL:** <https://meta.discourse.org/t/guardian-before-and-after-checks-api/307241>\
**Category:** Development\
**Created:** [Maio 8, 2024, 11:53am UTC](https://meta.discourse.org/t/guardian-before-and-after-checks-api/307241 "2024-05-08T11:53:23Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)\
**Post date:** [Maio 8, 2024, 11:53am UTC](https://meta.discourse.org/t/guardian-before-and-after-checks-api/307241/1 "2024-05-08T11:53:23Z")

</div>

Algo que encontrei algumas vezes ao construir plugins é a necessidade de modificar o resultado das verificações `can_*` do `Guardian`. Encontrei novamente no Plugin ActivityPub:

[https://github.com/discourse/discourse-activity-pub/blob/main/extensions/discourse\_activity\_pub\_guardian\_extension.rb](https://github.com/discourse/discourse-activity-pub/blob/main/extensions/discourse_activity_pub_guardian_extension.rb)

Acabei de levantar um PR rascunho que adiciona um novo método de API de plugin do lado do servidor que permite registrar verificações antes e depois dos métodos `can_*` do guardian, oferecendo a capacidade de alterar o resultado do método. Por exemplo

```ruby
add_guardian_check(:before, :edit_post) do |guardian, result, post|
  !post.activity_pub_remote?
end

```

> <https://github.com/discourse/discourse/pull/26936>
>
> Adds a system to allow plugins to more easily modify guardian \`can\_\` method outc…omes.
> 
> \### Example
> 
> Currently the only way to modify guardian \`can\_\` method outcomes is via module pre-pension, for example:
> 
> \`\`\`
> module DiscourseActivityPubGuardianExtension
> def can\_edit\_post?(post)
> return false if post.activity\_pub\_remote?
> super
> end
> 
> def can\_change\_post\_owner?
> return false if activity\_pub\_enabled\_topic?
> super
> end
> 
> def activity\_pub\_enabled\_topic?
> return false unless DiscourseActivityPub.enabled && request&.params&.\[\]("topic\_id")
> topic = Topic.find\_by(id: request.params\["topic\_id"\].to\_i)
> topic&.activity\_pub\_enabled
> end
> end
> ...
> Guardian.prepend DiscourseActivityPubGuardianExtension
> \`\`\` 
> \[See further\](https://github.com/discourse/discourse-activity-pub/blob/main/extensions/discourse\_activity\_pub\_guardian\_extension.rb)
> 
> This change would mean the above could be done via the plugin api like so:
> 
> \`\`\`
> add\_guardian\_check(:before, :edit\_post) do |guardian, result, post|
> !post.activity\_pub\_remote?
> end
> 
> add\_guardian\_check(:before, :change\_post\_owner) do |guardian|
> return true unless DiscourseActivityPub.enabled && guardian.request&.params&.\[\]("topic\_id")
> topic = Topic.find\_by(id: guardian.request.params\["topic\_id"\].to\_i)
> !topic&.activity\_pub\_enabled
> end
> \`\`\`

Estou curioso para obter feedback sobre a abordagem e a execução antes de publicá-la para revisão.

---

_[View the full topic](https://meta.discourse.org/t/guardian-before-and-after-checks-api/307241)._
