{-# 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