packages feed

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