@@ -120,4 +120,36 @@ module Slack : Api.Slack = struct
120
120
)
121
121
| Error e -> Lwt. return @@ fmt_error " error while querying %s: %s\n failed to unfurl Slack links" url e
122
122
)
123
+
124
+ let access_token_of_code ~(ctx : Context.t ) ~code =
125
+ let secrets = Context. get_secrets_exn ctx in
126
+ let body = `Form [ " code" , code ] in
127
+ match secrets.slack_client_id with
128
+ | None -> Lwt. return @@ Error " slack_client_id is undefined"
129
+ | Some client_id ->
130
+ match secrets.slack_client_secret with
131
+ | None -> Lwt. return @@ Error " slack_client_secret is undefined"
132
+ | Some client_secret ->
133
+ let auth_header = Base64. encode_string @@ sprintf " %s:%s" client_id client_secret in
134
+ let headers = [ Printf. sprintf " Authorization: Basic %s" auth_header ] in
135
+ ( match % lwt Common. http_request ~body ~headers `POST " https://slack.com/api/oauth.v2.access" with
136
+ | Error e -> Lwt. return @@ Error e
137
+ | Ok data ->
138
+ let response = Slack_j. oauth_access_res_of_string data in
139
+ ( match response.access_token, response.error with
140
+ | Some access_token , _ -> Lwt. return @@ Ok access_token
141
+ | None , Some e -> Lwt. return @@ Error e
142
+ | None , None -> Lwt. return @@ Error " an unknown error occurred while getting access token"
143
+ )
144
+ )
145
+
146
+ let update_access_token_of_context ~ctx ~code =
147
+ let secrets = Context. get_secrets_exn ctx in
148
+ match % lwt access_token_of_code ~ctx ~code with
149
+ | Error e -> Lwt. return @@ Error e
150
+ | Ok access_token ->
151
+ let secrets = { secrets with slack_access_token = Some access_token } in
152
+ ctx.secrets < - Some secrets;
153
+ let data = Config_j. string_of_secrets secrets |> Yojson.Basic. from_string |> Yojson.Basic. pretty_to_string in
154
+ Lwt. return @@ write_to_local_file ~data ctx.secrets_filepath
123
155
end
0 commit comments