{-# LANGUAGE OverloadedLabels #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}

module WikiMusic.SSR.Servant.SongRoutes where

import Principium
import Servant
import Servant.Multipart
import WikiMusic.Interaction.Model.Song
import WikiMusic.Model.Other
import WikiMusic.Model.Song
import WikiMusic.SSR.Backend.Rest ()
import WikiMusic.SSR.Free.Backend
import WikiMusic.SSR.Free.View
import WikiMusic.SSR.Servant.Utilities
import WikiMusic.SSR.View.Html ()

songsRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Text -> m Html
songsRoute :: forall (m :: * -> *).
(MonadIO m, MonadError ServerError m) =>
Env
-> Maybe Text
-> Maybe Text
-> Maybe Int
-> Maybe Int
-> Maybe Text
-> m Html
songsRoute Env
env Maybe Text
cookie Maybe Text
givenSortOrder Maybe Int
limit Maybe Int
offset Maybe Text
searchInput = do
  Either Text GetSongsQueryResponse
maybeSongs <- case Maybe Text
searchInput of
    Maybe Text
Nothing ->
      IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
        (IO (Either Text GetSongsQueryResponse)
 -> m (Either Text GetSongsQueryResponse))
-> IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend
          ( Env
-> AuthToken
-> Limit
-> Offset
-> SortOrder
-> Include
-> Free Backend (Either Text GetSongsQueryResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> Limit
-> Offset
-> SortOrder
-> Include
-> Free f (Either Text GetSongsQueryResponse)
getSongs
              Env
env
              (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken)
              Limit
limit'
              Offset
offset'
              SortOrder
sortOrder
              (Include {$sel:value:Include :: Text
value = Text
"artworks,comments,opinions,artists"})
          )
    Just Text
search ->
      IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
        (IO (Either Text GetSongsQueryResponse)
 -> m (Either Text GetSongsQueryResponse))
-> IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend
          ( Env
-> AuthToken
-> Text
-> Limit
-> Offset
-> SortOrder
-> Include
-> Free Backend (Either Text GetSongsQueryResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> Text
-> Limit
-> Offset
-> SortOrder
-> Include
-> Free f (Either Text GetSongsQueryResponse)
searchSongs
              Env
env
              (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken)
              Text
search
              Limit
limit'
              Offset
offset'
              SortOrder
sortOrder
              (Include {$sel:value:Include :: Text
value = Text
"artworks,comments,opinions,artists"})
          )
  Either Text GetSongsQueryResponse
-> (GetSongsQueryResponse -> IO Html) -> m Html
forall (m :: * -> *) t a.
(MonadIO m, MonadError ServerError m) =>
Either Text t -> (t -> IO a) -> m a
respondWithViewOrErr
    Either Text GetSongsQueryResponse
maybeSongs
    (forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @View (Free View Html -> IO Html)
-> (GetSongsQueryResponse -> Free View Html)
-> GetSongsQueryResponse
-> IO Html
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Limit
-> Offset
-> Env
-> ViewVars
-> GetSongsQueryResponse
-> Free View Html
forall (f :: * -> *).
(View :<: f) =>
Limit
-> Offset
-> Env
-> ViewVars
-> GetSongsQueryResponse
-> Free f Html
songListPage Limit
limit' Offset
offset' Env
env ViewVars
vv)
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    sortOrder :: SortOrder
sortOrder = SortOrder -> (Text -> SortOrder) -> Maybe Text -> SortOrder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars SortOrder -> SortOrder
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars SortOrder
#songSorting) Text -> SortOrder
SortOrder Maybe Text
givenSortOrder
    limit' :: Limit
limit' = Limit -> (Int -> Limit) -> Maybe Int -> Limit
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Int -> Limit
Limit Int
50) Int -> Limit
Limit Maybe Int
limit
    offset' :: Offset
offset' = Offset -> (Int -> Offset) -> Maybe Int -> Offset
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Int -> Offset
Offset Int
0) Int -> Offset
Offset Maybe Int
offset

songRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html
songRoute :: forall (m :: * -> *).
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> UUID -> m Html
songRoute Env
env Maybe Text
cookie UUID
identifier = do
  Either Text GetSongsQueryResponse
maybeSongs <-
    IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
      (IO (Either Text GetSongsQueryResponse)
 -> m (Either Text GetSongsQueryResponse))
-> IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend
        ( Env
-> AuthToken
-> UUID
-> Free Backend (Either Text GetSongsQueryResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken -> UUID -> Free f (Either Text GetSongsQueryResponse)
getSong
            Env
env
            (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken)
            UUID
identifier
        )
  Either Text GetSongsQueryResponse
-> (GetSongsQueryResponse -> IO Html) -> m Html
forall (m :: * -> *) t a.
(MonadIO m, MonadError ServerError m) =>
Either Text t -> (t -> IO a) -> m a
respondWithViewOrErr
    Either Text GetSongsQueryResponse
maybeSongs
    (forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @View (Free View Html -> IO Html)
-> (GetSongsQueryResponse -> Free View Html)
-> GetSongsQueryResponse
-> IO Html
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Env -> ViewVars -> GetSongsQueryResponse -> Free View Html
forall (f :: * -> *).
(View :<: f) =>
Env -> ViewVars -> GetSongsQueryResponse -> Free f Html
songDetailPage Env
env ViewVars
vv)
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie

songCreateRoute :: (MonadIO m) => Env -> Maybe Text -> m Html
songCreateRoute :: forall (m :: * -> *). MonadIO m => Env -> Maybe Text -> m Html
songCreateRoute Env
env Maybe Text
cookie = do
  IO Html -> m Html
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Html -> m Html) -> IO Html -> m Html
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @View (Env -> ViewVars -> Free View Html
forall (f :: * -> *).
(View :<: f) =>
Env -> ViewVars -> Free f Html
songCreatePage Env
env ViewVars
vv)
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie

songCreateFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a
songCreateFormRoute :: forall (m :: * -> *) tag a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> MultipartData tag -> m a
songCreateFormRoute Env
env Maybe Text
cookie MultipartData tag
multipartData = do
  Either Text InsertSongsCommandResponse
createResult <- IO (Either Text InsertSongsCommandResponse)
-> m (Either Text InsertSongsCommandResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text InsertSongsCommandResponse)
 -> m (Either Text InsertSongsCommandResponse))
-> IO (Either Text InsertSongsCommandResponse)
-> m (Either Text InsertSongsCommandResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken
-> InsertSongsRequest
-> Free Backend (Either Text InsertSongsCommandResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> InsertSongsRequest
-> Free f (Either Text InsertSongsCommandResponse)
createSong Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) InsertSongsRequest
r)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Created song!",
        headers = [withLocation "/songs"]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: InsertSongsRequest
r =
      InsertSongsRequest
        { $sel:songs:InsertSongsRequest :: [InsertSongsRequestItem]
songs =
            [ InsertSongsRequestItem
                { $sel:displayName:InsertSongsRequestItem :: Text
displayName = MultipartData tag -> Text -> Text -> Text
forall tag. MultipartData tag -> Text -> Text -> Text
fromForm MultipartData tag
multipartData Text
"" Text
"displayName",
                  $sel:spotifyUrl:InsertSongsRequestItem :: Maybe Text
spotifyUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"spotifyUrl",
                  $sel:youtubeUrl:InsertSongsRequestItem :: Maybe Text
youtubeUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"youtubeUrl",
                  $sel:soundcloudUrl:InsertSongsRequestItem :: Maybe Text
soundcloudUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"soundcloudUrl",
                  $sel:wikipediaUrl:InsertSongsRequestItem :: Maybe Text
wikipediaUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"wikipediaUrl",
                  $sel:description:InsertSongsRequestItem :: Maybe Text
description = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"description",
                  $sel:musicKey:InsertSongsRequestItem :: Maybe Text
musicKey = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"musicKey",
                  $sel:musicTuning:InsertSongsRequestItem :: Maybe Text
musicTuning = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"musicTuning",
                  $sel:musicCreationDate:InsertSongsRequestItem :: Maybe Text
musicCreationDate = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"musicCreationDate",
                  $sel:albumName:InsertSongsRequestItem :: Maybe Text
albumName = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"albumName",
                  $sel:albumInfoLink:InsertSongsRequestItem :: Maybe Text
albumInfoLink = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"albumInfoLink"
                }
            ]
        }

songLikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
songLikeRoute :: forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> Maybe Text -> UUID -> m a
songLikeRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer UUID
identifier = do
  Either Text UpsertSongOpinionsCommandResponse
res <- IO (Either Text UpsertSongOpinionsCommandResponse)
-> m (Either Text UpsertSongOpinionsCommandResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text UpsertSongOpinionsCommandResponse)
 -> m (Either Text UpsertSongOpinionsCommandResponse))
-> IO (Either Text UpsertSongOpinionsCommandResponse)
-> m (Either Text UpsertSongOpinionsCommandResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken
-> UpsertSongOpinionsRequest
-> Free Backend (Either Text UpsertSongOpinionsCommandResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> UpsertSongOpinionsRequest
-> Free f (Either Text UpsertSongOpinionsCommandResponse)
upsertSongOpinion Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) UpsertSongOpinionsRequest
r)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Liked song!",
        headers = [withLocation (fromMaybe "/songs" maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: UpsertSongOpinionsRequest
r =
      UpsertSongOpinionsRequest
        { $sel:songOpinions:UpsertSongOpinionsRequest :: [UpsertSongOpinionsRequestItem]
songOpinions =
            [ UpsertSongOpinionsRequestItem
                { $sel:songIdentifier:UpsertSongOpinionsRequestItem :: UUID
songIdentifier = UUID
identifier,
                  $sel:isLike:UpsertSongOpinionsRequestItem :: Bool
isLike = Bool
True
                }
            ]
        }

songDislikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
songDislikeRoute :: forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> Maybe Text -> UUID -> m a
songDislikeRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer UUID
identifier = do
  Either Text UpsertSongOpinionsCommandResponse
_ <- IO (Either Text UpsertSongOpinionsCommandResponse)
-> m (Either Text UpsertSongOpinionsCommandResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text UpsertSongOpinionsCommandResponse)
 -> m (Either Text UpsertSongOpinionsCommandResponse))
-> IO (Either Text UpsertSongOpinionsCommandResponse)
-> m (Either Text UpsertSongOpinionsCommandResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken
-> UpsertSongOpinionsRequest
-> Free Backend (Either Text UpsertSongOpinionsCommandResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> UpsertSongOpinionsRequest
-> Free f (Either Text UpsertSongOpinionsCommandResponse)
upsertSongOpinion Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) UpsertSongOpinionsRequest
r)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Disliked song!",
        headers = [withLocation (fromMaybe "/songs" maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: UpsertSongOpinionsRequest
r =
      UpsertSongOpinionsRequest
        { $sel:songOpinions:UpsertSongOpinionsRequest :: [UpsertSongOpinionsRequestItem]
songOpinions =
            [ UpsertSongOpinionsRequestItem
                { $sel:songIdentifier:UpsertSongOpinionsRequestItem :: UUID
songIdentifier = UUID
identifier,
                  $sel:isLike:UpsertSongOpinionsRequestItem :: Bool
isLike = Bool
False
                }
            ]
        }

songEditRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html
songEditRoute :: forall (m :: * -> *).
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> UUID -> m Html
songEditRoute Env
env Maybe Text
cookie UUID
identifier = do
  Either Text GetSongsQueryResponse
maybeSongs <-
    IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
      (IO (Either Text GetSongsQueryResponse)
 -> m (Either Text GetSongsQueryResponse))
-> IO (Either Text GetSongsQueryResponse)
-> m (Either Text GetSongsQueryResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend
        ( Env
-> AuthToken
-> UUID
-> Free Backend (Either Text GetSongsQueryResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken -> UUID -> Free f (Either Text GetSongsQueryResponse)
getSong
            Env
env
            (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken)
            UUID
identifier
        )
  let a :: Either Text (Maybe (NonEmpty Song))
a = (GetSongsQueryResponse -> Maybe (NonEmpty Song))
-> Either Text GetSongsQueryResponse
-> Either Text (Maybe (NonEmpty Song))
forall b c a. (b -> c) -> Either a b -> Either a c
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (\GetSongsQueryResponse
x -> [Song] -> Maybe (NonEmpty Song)
forall a. [a] -> Maybe (NonEmpty a)
nonEmpty ([Song] -> Maybe (NonEmpty Song))
-> [Song] -> Maybe (NonEmpty Song)
forall a b. (a -> b) -> a -> b
$ Map UUID Song -> [Song]
forall k a. Map k a -> [a]
mapElems (Map UUID Song -> [Song]) -> Map UUID Song -> [Song]
forall a b. (a -> b) -> a -> b
$ GetSongsQueryResponse
x GetSongsQueryResponse
-> Optic' A_Lens NoIx GetSongsQueryResponse (Map UUID Song)
-> Map UUID Song
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetSongsQueryResponse (Map UUID Song)
#songs) Either Text GetSongsQueryResponse
maybeSongs
  Either Text (Maybe (NonEmpty Song))
-> (NonEmpty Song -> IO Html) -> m Html
forall (m :: * -> *) t a.
(MonadIO m, MonadError ServerError m) =>
Either Text (Maybe t) -> (t -> IO a) -> m a
respondWithViewOrErr'
    Either Text (Maybe (NonEmpty Song))
a
    (forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @View (Free View Html -> IO Html)
-> (NonEmpty Song -> Free View Html) -> NonEmpty Song -> IO Html
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Env -> ViewVars -> Song -> Free View Html
forall (f :: * -> *).
(View :<: f) =>
Env -> ViewVars -> Song -> Free f Html
songEditPage Env
env ViewVars
vv (Song -> Free View Html)
-> (NonEmpty Song -> Song) -> NonEmpty Song -> Free View Html
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty Song -> Song
forall (f :: * -> *) a. IsNonEmpty f a a "head" => f a -> a
head)
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie

songEditFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
songEditFormRoute :: forall (m :: * -> *) tag a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
songEditFormRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer UUID
identifier MultipartData tag
multipartData = do
  Either Text ()
_ <- IO (Either Text ()) -> m (Either Text ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text ()) -> m (Either Text ()))
-> IO (Either Text ()) -> m (Either Text ())
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken -> SongDeltaRequest -> Free Backend (Either Text ())
forall (f :: * -> *).
(Backend :<: f) =>
Env -> AuthToken -> SongDeltaRequest -> Free f (Either Text ())
editSong Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) SongDeltaRequest
r)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Edited song!",
        headers = [withLocation (maybe "/songs" (replaceText "/edit" "") maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: SongDeltaRequest
r =
      SongDeltaRequest
        { $sel:songDeltas:SongDeltaRequest :: [SongDelta]
songDeltas =
            [ SongDelta
                { $sel:identifier:SongDelta :: UUID
identifier = UUID
identifier,
                  $sel:displayName:SongDelta :: Maybe Text
displayName = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"displayName",
                  $sel:spotifyUrl:SongDelta :: Maybe Text
spotifyUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"spotifyUrl",
                  $sel:youtubeUrl:SongDelta :: Maybe Text
youtubeUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"youtubeUrl",
                  $sel:soundcloudUrl:SongDelta :: Maybe Text
soundcloudUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"soundcloudUrl",
                  $sel:wikipediaUrl:SongDelta :: Maybe Text
wikipediaUrl = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"wikipediaUrl",
                  $sel:description:SongDelta :: Maybe Text
description = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"description",
                  $sel:musicKey:SongDelta :: Maybe Text
musicKey = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"musicKey",
                  $sel:musicTuning:SongDelta :: Maybe Text
musicTuning = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"musicTuning",
                  $sel:musicCreationDate:SongDelta :: Maybe Text
musicCreationDate = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"musicCreationDate",
                  $sel:albumName:SongDelta :: Maybe Text
albumName = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"albumName",
                  $sel:albumInfoLink:SongDelta :: Maybe Text
albumInfoLink = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"albumInfoLink"
                }
            ]
        }

searchSongRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a
searchSongRoute :: forall (m :: * -> *) tag a.
(MonadIO m, MonadError ServerError m) =>
Env -> MultipartData tag -> m a
searchSongRoute Env
_ MultipartData tag
multipartData = do
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Go to search songs page",
        headers = [withLocation newRoute]
      }
  where
    searchQuery :: Text
searchQuery = MultipartData tag -> Text -> Text -> Text
forall tag. MultipartData tag -> Text -> Text -> Text
fromForm MultipartData tag
multipartData Text
"" Text
"searchInput"
    newRoute :: Text
newRoute = Text
"/songs?searchInput=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
searchQuery

createSongArtworkRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
createSongArtworkRoute :: forall (m :: * -> *) tag a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
createSongArtworkRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer UUID
identifier MultipartData tag
multipartData = do
  Either Text InsertSongArtworksCommandResponse
_ <- IO (Either Text InsertSongArtworksCommandResponse)
-> m (Either Text InsertSongArtworksCommandResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text InsertSongArtworksCommandResponse)
 -> m (Either Text InsertSongArtworksCommandResponse))
-> IO (Either Text InsertSongArtworksCommandResponse)
-> m (Either Text InsertSongArtworksCommandResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken
-> InsertSongArtworksRequest
-> Free Backend (Either Text InsertSongArtworksCommandResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> InsertSongArtworksRequest
-> Free f (Either Text InsertSongArtworksCommandResponse)
createSongArtwork Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) InsertSongArtworksRequest
r)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Created song artwork!",
        headers = [withLocation (maybe "/songs" (<> "#edit-artwork") maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: InsertSongArtworksRequest
r =
      InsertSongArtworksRequest
        { $sel:songArtworks:InsertSongArtworksRequest :: [InsertSongArtworksRequestItem]
songArtworks =
            [ InsertSongArtworksRequestItem
                { $sel:songIdentifier:InsertSongArtworksRequestItem :: UUID
songIdentifier = UUID
identifier,
                  $sel:orderValue:InsertSongArtworksRequestItem :: Int
orderValue = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe (Text -> String
unpackText (Text -> String) -> (Maybe Text -> Text) -> Maybe Text -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"0" (Maybe Text -> String) -> Maybe Text -> String
forall a b. (a -> b) -> a -> b
$ MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"orderValue"),
                  $sel:contentUrl:InsertSongArtworksRequestItem :: Text
contentUrl = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" (Maybe Text -> Text) -> Maybe Text -> Text
forall a b. (a -> b) -> a -> b
$ MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"contentUrl",
                  $sel:contentCaption:InsertSongArtworksRequestItem :: Maybe Text
contentCaption = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"contentCaption"
                }
            ]
        }

songDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m a
songDeleteRoute :: forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> UUID -> m a
songDeleteRoute Env
env Maybe Text
cookie UUID
identifier = do
  Either Text ()
_ <- IO (Either Text ()) -> m (Either Text ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text ()) -> m (Either Text ()))
-> IO (Either Text ()) -> m (Either Text ())
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env -> AuthToken -> UUID -> Free Backend (Either Text ())
forall (f :: * -> *).
(Backend :<: f) =>
Env -> AuthToken -> UUID -> Free f (Either Text ())
deleteSong Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) UUID
identifier)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Deleted song!",
        headers = [("Location", "/songs")]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie

songArtworkDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
songArtworkDeleteRoute :: forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> Maybe Text -> UUID -> m a
songArtworkDeleteRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer UUID
identifier = do
  Either Text ()
_ <- IO (Either Text ()) -> m (Either Text ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text ()) -> m (Either Text ()))
-> IO (Either Text ()) -> m (Either Text ())
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env -> AuthToken -> UUID -> Free Backend (Either Text ())
forall (f :: * -> *).
(Backend :<: f) =>
Env -> AuthToken -> UUID -> Free f (Either Text ())
deleteSongArtwork Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) UUID
identifier)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Deleted song artwork!",
        headers = [withLocation (maybe "/songs" (<> "#edit-artwork") maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie

updateSongArtworkOrderRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
updateSongArtworkOrderRoute :: forall (m :: * -> *) tag a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
updateSongArtworkOrderRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer UUID
identifier MultipartData tag
multipartData = do
  Either Text ()
_ <- IO (Either Text ()) -> m (Either Text ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text ()) -> m (Either Text ()))
-> IO (Either Text ()) -> m (Either Text ())
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken
-> SongArtworkOrderUpdateRequest
-> Free Backend (Either Text ())
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> SongArtworkOrderUpdateRequest
-> Free f (Either Text ())
updateSongArtworkOrder Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) SongArtworkOrderUpdateRequest
r)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Updated song artwork!",
        headers = [withLocation (maybe "/songs" (<> "#edit-artwork") maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: SongArtworkOrderUpdateRequest
r =
      SongArtworkOrderUpdateRequest
        { $sel:songArtworkOrders:SongArtworkOrderUpdateRequest :: [SongArtworkOrderUpdate]
songArtworkOrders =
            [ SongArtworkOrderUpdate
                { $sel:identifier:SongArtworkOrderUpdate :: UUID
identifier = UUID
identifier,
                  $sel:orderValue:SongArtworkOrderUpdate :: Int
orderValue =
                    Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0
                      (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe (Text -> String
unpackText (Text -> String) -> (Maybe Text -> Text) -> Maybe Text -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"0" (Maybe Text -> String) -> Maybe Text -> String
forall a b. (a -> b) -> a -> b
$ MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"orderValue")
                }
            ]
        }

songContentCreateFormRoute ::
  (MonadIO m, MonadError ServerError m) =>
  Env ->
  Maybe Text ->
  Maybe Text ->
  UUID ->
  MultipartData tag ->
  m b
songContentCreateFormRoute :: forall (m :: * -> *) tag a.
(MonadIO m, MonadError ServerError m) =>
Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
songContentCreateFormRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer UUID
identifier MultipartData tag
multipartData = do
  Either Text InsertSongContentsCommandResponse
_ <- IO (Either Text InsertSongContentsCommandResponse)
-> m (Either Text InsertSongContentsCommandResponse)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text InsertSongContentsCommandResponse)
 -> m (Either Text InsertSongContentsCommandResponse))
-> IO (Either Text InsertSongContentsCommandResponse)
-> m (Either Text InsertSongContentsCommandResponse)
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken
-> InsertSongContentsRequest
-> Free Backend (Either Text InsertSongContentsCommandResponse)
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken
-> InsertSongContentsRequest
-> Free f (Either Text InsertSongContentsCommandResponse)
createSongContents Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) InsertSongContentsRequest
r)
  ServerResponse -> m b
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Edited song!",
        headers = [withLocation (maybe "/songs" (replaceText "/edit" "" . (<> "#edit-contents")) maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: InsertSongContentsRequest
r =
      InsertSongContentsRequest
        { $sel:songContents:InsertSongContentsRequest :: [InsertSongContentsRequestItem]
songContents =
            [ InsertSongContentsRequestItem
                { $sel:songIdentifier:InsertSongContentsRequestItem :: UUID
songIdentifier = UUID
identifier,
                  $sel:versionName:InsertSongContentsRequestItem :: Text
versionName = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" (Maybe Text -> Text) -> Maybe Text -> Text
forall a b. (a -> b) -> a -> b
$ MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"versionName",
                  $sel:instrumentType:InsertSongContentsRequestItem :: Text
instrumentType = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" (Maybe Text -> Text) -> Maybe Text -> Text
forall a b. (a -> b) -> a -> b
$ MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"instrumentType",
                  $sel:asciiLegend:InsertSongContentsRequestItem :: Maybe Text
asciiLegend = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"asciiLegend",
                  $sel:asciiContents:InsertSongContentsRequestItem :: Maybe Text
asciiContents = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"asciiContents",
                  $sel:pdfContents:InsertSongContentsRequestItem :: Maybe Text
pdfContents = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"pdfContents",
                  $sel:guitarProContents:InsertSongContentsRequestItem :: Maybe Text
guitarProContents = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"guitarProContents"
                }
            ]
        }

songContentEditFormRoute ::
  (MonadIO m, MonadError ServerError m) =>
  Env ->
  Maybe Text ->
  Maybe Text ->
  p ->
  UUID ->
  MultipartData tag ->
  m b
songContentEditFormRoute :: forall (m :: * -> *) p tag b.
(MonadIO m, MonadError ServerError m) =>
Env
-> Maybe Text
-> Maybe Text
-> p
-> UUID
-> MultipartData tag
-> m b
songContentEditFormRoute Env
env Maybe Text
cookie Maybe Text
maybeReferer p
_ UUID
songContentIdentifier MultipartData tag
multipartData = do
  Either Text ()
_ <- IO (Either Text ()) -> m (Either Text ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text ()) -> m (Either Text ()))
-> IO (Either Text ()) -> m (Either Text ())
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env
-> AuthToken
-> SongContentDeltaRequest
-> Free Backend (Either Text ())
forall (f :: * -> *).
(Backend :<: f) =>
Env
-> AuthToken -> SongContentDeltaRequest -> Free f (Either Text ())
editSongContents Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) SongContentDeltaRequest
r)
  ServerResponse -> m b
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Edited song!",
        headers = [withLocation (maybe "/songs" (replaceText "/edit" "") maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie
    r :: SongContentDeltaRequest
r =
      SongContentDeltaRequest
        { $sel:songContentDeltas:SongContentDeltaRequest :: [SongContentDelta]
songContentDeltas =
            [ SongContentDelta
                { $sel:identifier:SongContentDelta :: UUID
identifier = UUID
songContentIdentifier,
                  $sel:versionName:SongContentDelta :: Text
versionName = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" (Maybe Text -> Text) -> Maybe Text -> Text
forall a b. (a -> b) -> a -> b
$ MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"versionName",
                  $sel:instrumentType:SongContentDelta :: Maybe Text
instrumentType = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"instrumentType",
                  $sel:asciiLegend:SongContentDelta :: Maybe Text
asciiLegend = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"asciiLegend",
                  $sel:asciiContents:SongContentDelta :: Maybe Text
asciiContents = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"asciiContents",
                  $sel:pdfContents:SongContentDelta :: Maybe Text
pdfContents = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"pdfContents",
                  $sel:guitarProContents:SongContentDelta :: Maybe Text
guitarProContents = MultipartData tag -> Text -> Maybe Text
forall tag. MultipartData tag -> Text -> Maybe Text
maybeFromForm MultipartData tag
multipartData Text
"guitarProContents"
                }
            ]
        }

songContentDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> UUID -> Maybe Text -> Maybe Text -> m a
songContentDeleteRoute :: forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
Env -> UUID -> Maybe Text -> Maybe Text -> m a
songContentDeleteRoute Env
env UUID
identifier Maybe Text
cookie Maybe Text
maybeReferer = do
  Either Text ()
_ <- IO (Either Text ()) -> m (Either Text ())
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either Text ()) -> m (Either Text ()))
-> IO (Either Text ()) -> m (Either Text ())
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @Backend (Env -> AuthToken -> UUID -> Free Backend (Either Text ())
forall (f :: * -> *).
(Backend :<: f) =>
Env -> AuthToken -> UUID -> Free f (Either Text ())
deleteSongContents Env
env (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars AuthToken -> AuthToken
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars AuthToken
#authToken) UUID
identifier)
  ServerResponse -> m a
forall (m :: * -> *) a.
(MonadIO m, MonadError ServerError m) =>
ServerResponse -> m a
respondWithHttp
    ServerResponse
httpFound
      { cause = Just "Deleted song contents!",
        headers = [withLocation (fromMaybe "/songs" maybeReferer)]
      }
  where
    vv :: ViewVars
vv = Maybe Text -> ViewVars
vvFromCookies Maybe Text
cookie