{-# LANGUAGE DataKinds, DeriveGeneric, GeneralizedNewtypeDeriving, StandaloneDeriving, TemplateHaskell, TypeOperators #-}
module BattlePlace.WebApi
( WebApi
, ClientAuthRequest(..)
, ClientAuthResponse(..)
, MatchRequest(..)
, MatchResponse(..)
, MatchStatusResponse(..)
, SessionResultRequest(..)
, ServerMatchRequest(..)
, ServerMatchResponse(..)
, ServerMatchCancelRequest(..)
, ServerMatchCancelResponse(..)
, ServerMatchSessionsRequest(..)
, ServerMatchSessionsResponse(..)
, ServerSessionResultRequest(..)
) where
import qualified Data.Text as T
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import Servant.API
import BattlePlace.Token.Types
import BattlePlace.Util
import BattlePlace.WebApi.Auth
import BattlePlace.WebApi.Types
type WebApi = "v1a" :>
( "client" :>
( "auth" :> ReqBody '[JSON] ClientAuthRequest :> Post '[JSON] ClientAuthResponse
:<|> "match" :>
( AuthProtect ClientToken :> ReqBody '[JSON] MatchRequest :> Post '[JSON] MatchResponse
:<|> AuthProtect ClientToken :> Capture "matchToken" (InternalToken MatchToken) :> Get '[JSON] MatchStatusResponse
:<|> AuthProtect ClientToken :> Capture "matchToken" (InternalToken MatchToken) :> Delete '[JSON] ()
)
:<|> "session" :> Capture "sessionToken" (InternalToken SessionToken) :>
( "result" :> AuthProtect ClientToken :> ReqBody '[JSON] SessionResultRequest :> Post '[JSON] ()
)
:<|> "info" :>
( "stats" :> AuthProtect ClientToken :> Get '[JSON] UserStats
)
)
:<|> "server" :>
( "match" :>
( ReqBody '[JSON] ServerMatchRequest :> Post '[JSON] ServerMatchResponse
:<|> ReqBody '[JSON] ServerMatchCancelRequest :> Delete '[JSON] ServerMatchCancelResponse
:<|> "sessions" :> ReqBody '[JSON] ServerMatchSessionsRequest :> Post '[JSON] ServerMatchSessionsResponse
)
:<|> "session" :> Capture "serverSessionToken" (InternalToken ServerSessionToken) :>
( "result" :> ReqBody '[JSON] ServerSessionResultRequest :> Post '[JSON] ()
)
)
)
data ClientAuthRequest = ClientAuthRequest
{ clientAuthRequest_projectId :: {-# UNPACK #-} !ProjectId
, clientAuthRequest_auth :: !Auth
}
data ClientAuthResponse
= ClientAuthResponse_authenticated
{ clientAuthResponse_clientToken :: !(InternalToken ClientToken)
, clientAuthResponse_name :: !T.Text
, clientAuthResponse_pictureUrl :: !T.Text
}
| ClientAuthResponse_notAuthenticated
{ clientAuthResponse_error :: !T.Text
}
data MatchRequest = MatchRequest
{ matchRequest_teamSizes :: !(VU.Vector MatchTeamSize)
, matchRequest_maxMatchTime :: {-# UNPACK #-} !Int
, matchRequest_matchTag :: !(Maybe MatchTag)
, matchRequest_serverTag :: !(Maybe ServerTag)
, matchRequest_info :: !(Maybe MatchPlayerInfo)
}
data MatchResponse = MatchResponse
{ matchResponse_matchToken :: !(InternalToken MatchToken)
}
data MatchStatusResponse
= MatchStatusResponse_notFound
| MatchStatusResponse_inProgress
| MatchStatusResponse_matched
{ matchStatusResponse_session :: !MatchSession
}
| MatchStatusResponse_failed
{ matchStatusResponse_reason :: !MatchFailureReason
}
data SessionResultRequest
= SessionResultRequest_finished
{ sessionResultRequest_ranks :: !(V.Vector Int)
}
| SessionResultRequest_cancelled
data ClientDataRequest = ClientDataRequest
{ clientDataRequest_after :: !(Maybe T.Text)
}
data ServerMatchRequest = ServerMatchRequest
{ serverMatchRequest_projectId :: {-# UNPACK #-} !ProjectId
, serverMatchRequest_projectServerToken :: !ProjectServerToken
, serverMatchRequest_serverTag :: !(Maybe ServerTag)
, serverMatchRequest_name :: !ProjectServerName
, serverMatchRequest_info :: !(Maybe MatchServerInfo)
, serverMatchRequest_timeout :: !(Maybe Int)
}
data ServerMatchResponse
= ServerMatchResponse_registered
| ServerMatchResponse_unused
data ServerMatchCancelRequest = ServerMatchCancelRequest
{ serverMatchCancelRequest_projectId :: {-# UNPACK #-} !ProjectId
, serverMatchCancelRequest_projectServerToken :: !ProjectServerToken
, serverMatchCancelRequest_name :: !ProjectServerName
}
data ServerMatchCancelResponse
= ServerMatchCancelResponse_cancelled
| ServerMatchCancelResponse_unused
data ServerMatchSessionsRequest = ServerMatchSessionsRequest
{ serverMatchSessionsRequest_projectId :: {-# UNPACK #-} !ProjectId
, serverMatchSessionsRequest_projectServerToken :: !ProjectServerToken
, serverMatchSessionsRequest_name :: !ProjectServerName
}
data ServerMatchSessionsResponse = ServerMatchSessionsResponse
{ serverMatchSessionsResponse_sessions :: !(V.Vector MatchServerSession)
}
data ServerSessionResultRequest
= ServerSessionResultRequest_finished
{ serverSessionResultRequest_ranks :: !(V.Vector Int)
}
| ServerSessionResultRequest_cancelled
declareStruct
[ ''ClientAuthRequest
, ''ClientAuthResponse
, ''MatchRequest
, ''MatchResponse
, ''MatchStatusResponse
, ''SessionResultRequest
, ''ClientDataRequest
, ''ServerMatchRequest
, ''ServerMatchResponse
, ''ServerMatchCancelRequest
, ''ServerMatchCancelResponse
, ''ServerMatchSessionsRequest
, ''ServerMatchSessionsResponse
, ''ServerSessionResultRequest
]