oncall-engine/engine/apps/slack
Vadim Stepanov d1373b58d2
Fix orphaned messages in Slack (#2023)
# What this PR does
Reworks Slack handlers for buttons and select menus for AG Slack
messages.

<img width="602" alt="Screenshot 2023-05-31 at 19 34 05"
src="https://github.com/grafana/oncall/assets/20116910/857bf096-7bdd-427b-94b6-15aad873a8ac">


## Current implementation

- It's possible to end up with orphaned Slack messages that are posted
to Slack but have no `SlackMessage` instance in the DB. For such
messages, clicking buttons will result in an exception and HTTP 500. See
private repo
[issue](https://github.com/grafana/oncall-private/issues/1841) for more
info.
- Bug in authorization system, which effectively bypasses any permission
checks. For example, it's possible to resolve an alert group while being
a Viewer.
- No tests covering most buttons.

## Changes in this PR

- Make the system more robust, don't use `SlackMessage` model to figure
out the alert group being interacted on, instead embed `alert_group_pk`
to every button and use it when receiving interaction requests from
Slack.
- Existing orphaned Slack messages will be repaired. Clicking buttons
under orphaned messages will work (and missing `SlackMessage` instance
will be created on interaction). This is possible because some buttons
already have `alert_group_pk` embedded, and it's possible to get this
data on button clicks (even if the clicked button itself doesn't have
`alert_group_pk` embedded).
- Fix authorization. Show warning window when unauthorized:
<img width="511" alt="Screenshot 2023-05-31 at 19 40 02"
src="https://github.com/grafana/oncall/assets/20116910/5abeeaa7-1b61-4a47-b3af-0e21d5cd1907">

- Added tests for all the buttons under AG message. Add tests checking
authorization, actual execution of scenario steps, orphan message
repairing, backward compatibility, etc. Also add tests on
`AlertGroupSlackRenderer` checking that correct data is embedded into
buttons.
- Cosmetic changes such as renaming `incident`  to `Alert Group`.

## Which issue(s) this PR fixes
Related to https://github.com/grafana/oncall-private/issues/1841

## Checklist

- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required)
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-06-01 10:21:30 +00:00
..
migrations Add database migrations linter (#1020) 2023-02-06 16:01:37 +08:00
models Fix orphaned messages in Slack (#2023) 2023-06-01 10:21:30 +00:00
representatives Refactor maintenance (#1340) 2023-02-23 07:13:03 +00:00
scenarios Fix orphaned messages in Slack (#2023) 2023-06-01 10:21:30 +00:00
slack_client Add Slack Api error "message_limit_exceeded" to SlackAPIRateLimitException (#1721) 2023-04-11 12:49:19 +02:00
templates/admin World, meet OnCall! 2022-06-03 08:09:47 -06:00
tests Fix orphaned messages in Slack (#2023) 2023-06-01 10:21:30 +00:00
__init__.py World, meet OnCall! 2022-06-03 08:09:47 -06:00
admin.py World, meet OnCall! 2022-06-03 08:09:47 -06:00
alert_group_slack_service.py Cleanup ScenarioStep (#1213) 2023-02-21 20:22:11 +01:00
constants.py Handle slack payload metadata limit in paging command (#2007) 2023-05-25 13:42:59 +00:00
slack_formatter.py World, meet OnCall! 2022-06-03 08:09:47 -06:00
tasks.py Fix ratelimit message: incident -> alert groups (#1481) 2023-03-09 03:37:16 +00:00
urls.py World, meet OnCall! 2022-06-03 08:09:47 -06:00
utils.py Use formatted UTC time for fallback in slack message (#225) 2022-07-18 07:55:05 -06:00
views.py Revert slack org does not exist changes breaking escalate command (#2057) 2023-05-30 15:13:48 +00:00