-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathslack.fsx
More file actions
41 lines (32 loc) · 1.38 KB
/
slack.fsx
File metadata and controls
41 lines (32 loc) · 1.38 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
#r "packages/FSharp.Data/lib/net40/FSharp.Data.dll"
#r "packages/Suave/lib/net40/Suave.dll"
#r "packages/FSharpx.Extras/lib/40/FSharpx.Extras.dll"
#load "common.fsx"
open System
open FSharp.Data
open Suave
open Suave.ServerErrors
open Suave.Successful
open Common
module Slack =
type SlackMessage = JsonProvider<""" { "ok":"false", "error":"not authorized" } """>
let asyncError (ctx:HttpContext) (msg:string) =
async{
let formattedMessage = sprintf """{"ok": "false", "error":"%s"}""" msg
printfn "error => %s" formattedMessage
return! INTERNAL_ERROR formattedMessage ctx
}
let getSlackUrl =
let org = "SLACK_ORG" |> Env.tryGetVar |> FSharpx.Option.getOrElse "wpgdotnet" // don't die if environment variable not set
sprintf "https://%s.slack.com/api/users.admin.invite?t=%O" org
let invite (ctx : HttpContext) email =
async {
let timeStamp = DateTime.Now.ToString("yyyyMMddhhmmss")
let token = "SLACK_TOKEN" |> Env.getVar
let! apiResponse = Http.AsyncRequestString(getSlackUrl timeStamp, body = FormValues ["email", email; "token", token])
let slackResponse = SlackMessage.Parse(apiResponse)
return! OK apiResponse ctx
}
let signUp (ctx:HttpContext) =
ctx.request.formData "email"
|> FSharpx.Choice.choice (invite ctx) (fun i -> asyncError ctx "Missing email")