-
Notifications
You must be signed in to change notification settings - Fork 289
Expand file tree
/
Copy pathcallback_options.py
More file actions
121 lines (102 loc) · 3.62 KB
/
callback_options.py
File metadata and controls
121 lines (102 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import logging
from logging import Logger
from typing import Optional, Callable, TYPE_CHECKING
from slack_sdk.oauth import RedirectUriPageRenderer, OAuthStateUtils
from slack_sdk.oauth.installation_store import Installation
from slack_bolt.oauth.internals import CallbackResponseBuilder
from slack_bolt.request import BoltRequest
from slack_bolt.response import BoltResponse
if TYPE_CHECKING:
from slack_bolt.oauth.oauth_settings import OAuthSettings
class SuccessArgs:
def __init__(
self,
*,
request: BoltRequest,
installation: Installation,
settings: "OAuthSettings",
default: "CallbackOptions",
):
"""The arguments for a success function.
Args:
request: The request.
installation: The installation data.
settings: The settings for Slack OAuth flow.
default: The default `CallbackOptions`
"""
self.request = request
self.installation = installation
self.settings = settings
self.default = default
class FailureArgs:
def __init__(
self,
*,
request: BoltRequest,
reason: str,
error: Optional[Exception] = None,
suggested_status_code: int,
settings: "OAuthSettings",
default: "CallbackOptions",
):
"""The arguments for a failure function.
Args:
request: The request.
reason: The response.
error: An exception if exists.
suggested_status_code: The recommended HTTP status code for the failure.
settings: The settings for Slack OAuth flow.
default: The default `CallbackOptions`.
"""
self.request = request
self.reason = reason
self.error = error
self.suggested_status_code = suggested_status_code
self.settings = settings
self.default = default
class CallbackOptions:
success: Callable[[SuccessArgs], BoltResponse]
failure: Callable[[FailureArgs], BoltResponse]
def __init__(
self,
success: Callable[[SuccessArgs], BoltResponse],
failure: Callable[[FailureArgs], BoltResponse],
):
"""The configurations for OAuth flow.
Args:
success: A handler for successful installation.
failure: A handler for any types of installation failures.
"""
self.success = success
self.failure = failure
class DefaultCallbackOptions(CallbackOptions):
success: Callable[[SuccessArgs], BoltResponse]
failure: Callable[[FailureArgs], BoltResponse]
def __init__(
self,
*,
logger: Logger,
state_utils: OAuthStateUtils,
redirect_uri_page_renderer: RedirectUriPageRenderer,
):
self._response_builder = CallbackResponseBuilder(
logger=logger or logging.getLogger(__name__),
state_utils=state_utils,
redirect_uri_page_renderer=redirect_uri_page_renderer,
)
self.success = self._success_handler
self.failure = self._failure_handler
# --------------------------
# Internal methods
# --------------------------
def _success_handler(self, args: SuccessArgs) -> BoltResponse:
return self._response_builder._build_callback_success_response(
request=args.request,
installation=args.installation,
)
def _failure_handler(self, args: FailureArgs) -> BoltResponse:
return self._response_builder._build_callback_failure_response(
request=args.request,
reason=args.reason,
status=args.suggested_status_code,
)