packages feed

shomei-servant-0.2.0.0: src/Shomei/Passkey/Api.hs

-- | Passkey-owned registration, management, and passwordless-login routes.
module Shomei.Passkey.Api
  ( PasskeyApi (..),
    RegisterBeginRoute,
    RegisterCompleteRoute,
    ListPasskeysRoute,
    RemovePasskeyRoute,
    PasskeyLoginBeginRoute,
    PasskeyLoginCompleteRoute,
  )
where

import Servant.API
import Servant.API.MultiVerb (MultiVerb)
import Shomei.Id (PasskeyId)
import Shomei.Passkey.Dto
  ( PasskeyLoginCompleteRequest,
    PasskeyRegisterCompleteRequest,
  )
import Shomei.Passkey.Result
import Shomei.Prelude
import Shomei.Servant.Auth (Authenticated)
import Shomei.Servant.PreHandler (CsrfProtected, PreHandlerResponses, RateLimited)
import Shomei.Servant.Result (ApplicationContentTypes, BadRequestPreHandlerResponses)

type RegisterBeginRoute = "passkeys" :> "register" :> "begin" :> Authenticated :> CsrfProtected :> MultiVerb 'POST ApplicationContentTypes RegisterBeginResponses RegisterBeginResult

type RegisterCompleteRoute = "passkeys" :> "register" :> "complete" :> Authenticated :> CsrfProtected :> PreHandlerResponses BadRequestPreHandlerResponses :> ReqBody '[JSON] PasskeyRegisterCompleteRequest :> MultiVerb 'POST ApplicationContentTypes RegisterCompleteResponses RegisterCompleteResult

type ListPasskeysRoute = "passkeys" :> Authenticated :> MultiVerb 'GET ApplicationContentTypes ListPasskeysResponses ListPasskeysResult

type RemovePasskeyRoute = "passkeys" :> Authenticated :> CsrfProtected :> PreHandlerResponses BadRequestPreHandlerResponses :> Capture "passkeyId" PasskeyId :> MultiVerb 'DELETE ApplicationContentTypes RemovePasskeyResponses RemovePasskeyResult

type PasskeyLoginBeginRoute = "login" :> "passkey" :> "begin" :> RateLimited :> MultiVerb 'POST ApplicationContentTypes PasskeyLoginBeginResponses PasskeyLoginBeginResult

type PasskeyLoginCompleteRoute = "login" :> "passkey" :> "complete" :> RateLimited :> RemoteHost :> PreHandlerResponses BadRequestPreHandlerResponses :> ReqBody '[JSON] PasskeyLoginCompleteRequest :> MultiVerb 'POST ApplicationContentTypes PasskeyLoginCompleteResponses PasskeyLoginCompleteResult

data PasskeyApi mode = PasskeyApi
  { registerBegin :: mode :- RegisterBeginRoute,
    registerComplete :: mode :- RegisterCompleteRoute,
    list :: mode :- ListPasskeysRoute,
    remove :: mode :- RemovePasskeyRoute,
    loginBegin :: mode :- PasskeyLoginBeginRoute,
    loginComplete :: mode :- PasskeyLoginCompleteRoute
  }
  deriving stock (Generic)