1{-|
2Module: BattlePlace.WebApi
3Description: Web API definitions.
4License: MIT
5-}
6
7{-# LANGUAGE DataKinds, DeriveGeneric, GeneralizedNewtypeDeriving, StandaloneDeriving, TemplateHaskell, TypeOperators #-}
8
9module BattlePlace.WebApi
10 ( WebApi
11 , ClientAuthRequest(..)
12 , ClientAuthResponse(..)
13 , MatchRequest(..)
14 , MatchResponse(..)
15 , MatchStatusResponse(..)
16 , SessionResultRequest(..)
17 , ServerMatchRequest(..)
18 , ServerMatchResponse(..)
19 , ServerMatchCancelRequest(..)
20 , ServerMatchCancelResponse(..)
21 , ServerMatchSessionsRequest(..)
22 , ServerMatchSessionsResponse(..)
23 , ServerSessionResultRequest(..)
24 ) where
25
26import qualified Data.Text as T
27import qualified Data.Vector as V
28import qualified Data.Vector.Unboxed as VU
29import Servant.API
30
31import BattlePlace.Token.Types
32import BattlePlace.Util
33import BattlePlace.WebApi.Auth
34import BattlePlace.WebApi.Types
35
36type WebApi = "v1a" :>
37 ( "client" :>
38 ( "auth" :> ReqBody '[JSON] ClientAuthRequest :> Post '[JSON] ClientAuthResponse
39 :<|> "match" :>
40 ( AuthProtect ClientToken :> ReqBody '[JSON] MatchRequest :> Post '[JSON] MatchResponse
41 :<|> AuthProtect ClientToken :> Capture "matchToken" (InternalToken MatchToken) :> Get '[JSON] MatchStatusResponse
42 :<|> AuthProtect ClientToken :> Capture "matchToken" (InternalToken MatchToken) :> Delete '[JSON] ()
43 )
44 :<|> "session" :> Capture "sessionToken" (InternalToken SessionToken) :>
45 ( "result" :> AuthProtect ClientToken :> ReqBody '[JSON] SessionResultRequest :> Post '[JSON] ()
46 )
47 :<|> "info" :>
48 ( "stats" :> AuthProtect ClientToken :> Get '[JSON] UserStats
49 )
50 )
51 :<|> "server" :>
52 ( "match" :>
53 ( ReqBody '[JSON] ServerMatchRequest :> Post '[JSON] ServerMatchResponse
54 :<|> ReqBody '[JSON] ServerMatchCancelRequest :> Delete '[JSON] ServerMatchCancelResponse
55 :<|> "sessions" :> ReqBody '[JSON] ServerMatchSessionsRequest :> Post '[JSON] ServerMatchSessionsResponse
56 )
57 :<|> "session" :> Capture "serverSessionToken" (InternalToken ServerSessionToken) :>
58 ( "result" :> ReqBody '[JSON] ServerSessionResultRequest :> Post '[JSON] ()
59 )
60 )
61 )
62
63data ClientAuthRequest = ClientAuthRequest
64 { clientAuthRequest_projectId :: {-# UNPACK #-} !ProjectId
65 , clientAuthRequest_auth :: !Auth
66 }
67
68data ClientAuthResponse
69 = ClientAuthResponse_authenticated
70 { clientAuthResponse_clientToken :: !(InternalToken ClientToken)
71 , clientAuthResponse_name :: !T.Text
72 , clientAuthResponse_pictureUrl :: !T.Text
73 }
74 | ClientAuthResponse_notAuthenticated
75 { clientAuthResponse_error :: !T.Text
76 }
77
78data MatchRequest = MatchRequest
79 { matchRequest_teamSizes :: !(VU.Vector MatchTeamSize)
80 , matchRequest_maxMatchTime :: {-# UNPACK #-} !Int
81 , matchRequest_matchTag :: !(Maybe MatchTag)
82 , matchRequest_serverTag :: !(Maybe ServerTag)
83 , matchRequest_info :: !(Maybe MatchPlayerInfo)
84 }
85
86data MatchResponse = MatchResponse
87 { matchResponse_matchToken :: !(InternalToken MatchToken)
88 }
89
90data MatchStatusResponse
91 = MatchStatusResponse_notFound
92 | MatchStatusResponse_inProgress
93 | MatchStatusResponse_matched
94 { matchStatusResponse_session :: !MatchSession
95 }
96 | MatchStatusResponse_failed
97 { matchStatusResponse_reason :: !MatchFailureReason
98 }
99
100data SessionResultRequest
101 = SessionResultRequest_finished
102 { sessionResultRequest_ranks :: !(V.Vector Int)
103 }
104 | SessionResultRequest_cancelled
105
106data ClientDataRequest = ClientDataRequest
107 { clientDataRequest_after :: !(Maybe T.Text)
108 }
109
110data ServerMatchRequest = ServerMatchRequest
111 { serverMatchRequest_projectId :: {-# UNPACK #-} !ProjectId
112 , serverMatchRequest_projectServerToken :: !ProjectServerToken
113 , serverMatchRequest_serverTag :: !(Maybe ServerTag)
114 , serverMatchRequest_name :: !ProjectServerName
115 , serverMatchRequest_info :: !(Maybe MatchServerInfo)
116 , serverMatchRequest_timeout :: !(Maybe Int)
117 }
118
119data ServerMatchResponse
120 = ServerMatchResponse_registered
121 | ServerMatchResponse_unused
122
123data ServerMatchCancelRequest = ServerMatchCancelRequest
124 { serverMatchCancelRequest_projectId :: {-# UNPACK #-} !ProjectId
125 , serverMatchCancelRequest_projectServerToken :: !ProjectServerToken
126 , serverMatchCancelRequest_name :: !ProjectServerName
127 }
128
129data ServerMatchCancelResponse
130 = ServerMatchCancelResponse_cancelled
131 | ServerMatchCancelResponse_unused
132
133data ServerMatchSessionsRequest = ServerMatchSessionsRequest
134 { serverMatchSessionsRequest_projectId :: {-# UNPACK #-} !ProjectId
135 , serverMatchSessionsRequest_projectServerToken :: !ProjectServerToken
136 , serverMatchSessionsRequest_name :: !ProjectServerName
137 }
138
139data ServerMatchSessionsResponse = ServerMatchSessionsResponse
140 { serverMatchSessionsResponse_sessions :: !(V.Vector MatchServerSession)
141 }
142
143data ServerSessionResultRequest
144 = ServerSessionResultRequest_finished
145 { serverSessionResultRequest_ranks :: !(V.Vector Int)
146 }
147 | ServerSessionResultRequest_cancelled
148
149declareStruct
150 [ ''ClientAuthRequest
151 , ''ClientAuthResponse
152 , ''MatchRequest
153 , ''MatchResponse
154 , ''MatchStatusResponse
155 , ''SessionResultRequest
156 , ''ClientDataRequest
157 , ''ServerMatchRequest
158 , ''ServerMatchResponse
159 , ''ServerMatchCancelRequest
160 , ''ServerMatchCancelResponse
161 , ''ServerMatchSessionsRequest
162 , ''ServerMatchSessionsResponse
163 , ''ServerSessionResultRequest
164 ]