wikimusic-ssr-0.6.0.1: src/WikiMusic/SSR/Servant/ApiSpec.hs
module WikiMusic.SSR.Servant.ApiSpec
( WikiMusicSSRServant,
BaseEntityRoutes,
PreferenceRoutes,
LoginRoutes,
)
where
import Data.UUID (UUID)
import Relude
import Servant
import Servant.HTML.Blaze as ServantBlaze
import Servant.Multipart
import Text.Blaze.Html as Html
import WikiMusic.SSR.Backend.Rest ()
import WikiMusic.SSR.View.Html ()
type WikiMusicSSRServant =
Get '[ServantBlaze.HTML] NoContent
:<|> "artists"
:> BaseEntityRoutes
:<|> "genres"
:> BaseEntityRoutes
:<|> "songs"
:> BaseEntityRoutes
:<|> "user-preferences"
:> PreferenceRoutes
:<|> "login" :> LoginRoutes
type PostDataForm =
MultipartForm Mem (MultipartData Mem)
:> Post '[ServantBlaze.HTML] (Headers '[Header "Location" Text] NoContent)
type PostNoFields = Post '[ServantBlaze.HTML] (Headers '[Header "Location" Text] NoContent)
type WithReferer = Header "referer" Text
type CookieForm =
WithReferer
:> MultipartForm Mem (MultipartData Mem)
:> Post '[ServantBlaze.HTML] (Headers '[Header "Set-Cookie" Text, Header "Location" Text] NoContent)
type HtmlDoc = Get '[ServantBlaze.HTML] Html
type WithCookie = Header "cookie" Text
type BaseEntityRoutes =
WithCookie
:> QueryParam "sort-order" Text
:> QueryParam "limit" Int
:> QueryParam "offset" Int
:> HtmlDoc
:<|> WithCookie :> Capture "identifier" UUID :> HtmlDoc
:<|> "create" :> WithCookie :> HtmlDoc
:<|> "create" :> WithCookie :> PostDataForm
:<|> "like" :> WithCookie :> WithReferer :> Capture "identifier" UUID :> PostNoFields
:<|> "dislike" :> WithCookie :> WithReferer :> Capture "identifier" UUID :> PostNoFields
:<|> "edit" :> WithCookie :> Capture "identifier" UUID :> HtmlDoc
type PreferenceRoutes =
"locale" :> CookieForm
:<|> "artist-sorting" :> CookieForm
:<|> "genre-sorting" :> CookieForm
:<|> "song-sorting" :> CookieForm
:<|> "dark-mode" :> CookieForm
:<|> "song-ascii-size" :> CookieForm
:<|> "palette" :> CookieForm
type LoginRoutes = WithCookie :> HtmlDoc :<|> PostDataForm