1 | {-| |
2 | Module: BattlePlace.WebApi |
3 | Description: Web API definitions. |
4 | License: MIT |
5 | -} |
6 | |
7 | {-# LANGUAGE DataKinds, DeriveGeneric, GeneralizedNewtypeDeriving, StandaloneDeriving, TemplateHaskell, TypeOperators #-} |
8 | |
9 | module 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 | |
26 | import qualified Data.Text as T |
27 | import qualified Data.Vector as V |
28 | import qualified Data.Vector.Unboxed as VU |
29 | import Servant.API |
30 | |
31 | import BattlePlace.Token.Types |
32 | import BattlePlace.Util |
33 | import BattlePlace.WebApi.Auth |
34 | import BattlePlace.WebApi.Types |
35 | |
36 | type 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 | |
63 | data ClientAuthRequest = ClientAuthRequest |
64 | { clientAuthRequest_projectId :: {-# UNPACK #-} !ProjectId |
65 | , clientAuthRequest_auth :: !Auth |
66 | } |
67 | |
68 | data 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 | |
78 | data 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 | |
86 | data MatchResponse = MatchResponse |
87 | { matchResponse_matchToken :: !(InternalToken MatchToken) |
88 | } |
89 | |
90 | data MatchStatusResponse |
91 | = MatchStatusResponse_notFound |
92 | | MatchStatusResponse_inProgress |
93 | | MatchStatusResponse_matched |
94 | { matchStatusResponse_session :: !MatchSession |
95 | } |
96 | | MatchStatusResponse_failed |
97 | { matchStatusResponse_reason :: !MatchFailureReason |
98 | } |
99 | |
100 | data SessionResultRequest |
101 | = SessionResultRequest_finished |
102 | { sessionResultRequest_ranks :: !(V.Vector Int) |
103 | } |
104 | | SessionResultRequest_cancelled |
105 | |
106 | data ClientDataRequest = ClientDataRequest |
107 | { clientDataRequest_after :: !(Maybe T.Text) |
108 | } |
109 | |
110 | data 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 | |
119 | data ServerMatchResponse |
120 | = ServerMatchResponse_registered |
121 | | ServerMatchResponse_unused |
122 | |
123 | data ServerMatchCancelRequest = ServerMatchCancelRequest |
124 | { serverMatchCancelRequest_projectId :: {-# UNPACK #-} !ProjectId |
125 | , serverMatchCancelRequest_projectServerToken :: !ProjectServerToken |
126 | , serverMatchCancelRequest_name :: !ProjectServerName |
127 | } |
128 | |
129 | data ServerMatchCancelResponse |
130 | = ServerMatchCancelResponse_cancelled |
131 | | ServerMatchCancelResponse_unused |
132 | |
133 | data ServerMatchSessionsRequest = ServerMatchSessionsRequest |
134 | { serverMatchSessionsRequest_projectId :: {-# UNPACK #-} !ProjectId |
135 | , serverMatchSessionsRequest_projectServerToken :: !ProjectServerToken |
136 | , serverMatchSessionsRequest_name :: !ProjectServerName |
137 | } |
138 | |
139 | data ServerMatchSessionsResponse = ServerMatchSessionsResponse |
140 | { serverMatchSessionsResponse_sessions :: !(V.Vector MatchServerSession) |
141 | } |
142 | |
143 | data ServerSessionResultRequest |
144 | = ServerSessionResultRequest_finished |
145 | { serverSessionResultRequest_ranks :: !(V.Vector Int) |
146 | } |
147 | | ServerSessionResultRequest_cancelled |
148 | |
149 | declareStruct |
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 | ] |