{-# LANGUAGE OverloadedLabels #-} module WikiMusic.SSR.Servant.GenreRoutes where import Principium import Servant import Servant.Multipart import WikiMusic.Interaction.Model.Genre import WikiMusic.Model.Genre import WikiMusic.Model.Other 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 () genresRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Text -> m Html genresRoute :: forall (m :: * -> *). (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Text -> m Html genresRoute Env env Maybe Text cookie Maybe Text givenSortOrder Maybe Int limit Maybe Int offset Maybe Text searchInput = do Either Text GetGenresQueryResponse maybeGenres <- case Maybe Text searchInput of Maybe Text Nothing -> IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse)) -> IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) 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 GetGenresQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> Limit -> Offset -> SortOrder -> Include -> Free f (Either Text GetGenresQueryResponse) getGenres 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"}) ) Just Text search -> IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse)) -> IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) 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 GetGenresQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> Text -> Limit -> Offset -> SortOrder -> Include -> Free f (Either Text GetGenresQueryResponse) searchGenres 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"}) ) Either Text GetGenresQueryResponse -> (GetGenresQueryResponse -> IO Html) -> m Html forall (m :: * -> *) t a. (MonadIO m, MonadError ServerError m) => Either Text t -> (t -> IO a) -> m a respondWithViewOrErr Either Text GetGenresQueryResponse maybeGenres (forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @View (Free View Html -> IO Html) -> (GetGenresQueryResponse -> Free View Html) -> GetGenresQueryResponse -> IO Html forall b c a. (b -> c) -> (a -> b) -> a -> c . Limit -> Offset -> Env -> ViewVars -> GetGenresQueryResponse -> Free View Html forall (f :: * -> *). (View :<: f) => Limit -> Offset -> Env -> ViewVars -> GetGenresQueryResponse -> Free f Html genreListPage 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 #genreSorting) 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 genreRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html genreRoute :: forall (m :: * -> *). (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html genreRoute Env env Maybe Text cookie UUID identifier = do Either Text GetGenresQueryResponse maybeGenres <- IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse)) -> IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) 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 GetGenresQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UUID -> Free f (Either Text GetGenresQueryResponse) getGenre 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 GetGenresQueryResponse -> (GetGenresQueryResponse -> IO Html) -> m Html forall (m :: * -> *) t a. (MonadIO m, MonadError ServerError m) => Either Text t -> (t -> IO a) -> m a respondWithViewOrErr Either Text GetGenresQueryResponse maybeGenres (forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @View (Free View Html -> IO Html) -> (GetGenresQueryResponse -> Free View Html) -> GetGenresQueryResponse -> IO Html forall b c a. (b -> c) -> (a -> b) -> a -> c . Env -> ViewVars -> GetGenresQueryResponse -> Free View Html forall (f :: * -> *). (View :<: f) => Env -> ViewVars -> GetGenresQueryResponse -> Free f Html genreDetailPage Env env ViewVars vv) where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie genreCreateRoute :: (MonadIO m) => Env -> Maybe Text -> m Html genreCreateRoute :: forall (m :: * -> *). MonadIO m => Env -> Maybe Text -> m Html genreCreateRoute 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 genreCreatePage Env env ViewVars vv) where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie genreCreateFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a genreCreateFormRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a genreCreateFormRoute Env env Maybe Text cookie MultipartData tag multipartData = do Either Text InsertGenresCommandResponse _ <- IO (Either Text InsertGenresCommandResponse) -> m (Either Text InsertGenresCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text InsertGenresCommandResponse) -> m (Either Text InsertGenresCommandResponse)) -> IO (Either Text InsertGenresCommandResponse) -> m (Either Text InsertGenresCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> InsertGenresRequest -> Free Backend (Either Text InsertGenresCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> InsertGenresRequest -> Free f (Either Text InsertGenresCommandResponse) createGenre 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) InsertGenresRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Created genre!", headers = [withLocation "/genres"] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: InsertGenresRequest r = InsertGenresRequest { $sel:genres:InsertGenresRequest :: [InsertGenresRequestItem] genres = [ InsertGenresRequestItem { $sel:displayName:InsertGenresRequestItem :: Text displayName = MultipartData tag -> Text -> Text -> Text forall tag. MultipartData tag -> Text -> Text -> Text fromForm MultipartData tag multipartData Text "" Text "displayName", $sel:spotifyUrl:InsertGenresRequestItem :: Maybe Text spotifyUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "spotifyUrl", $sel:youtubeUrl:InsertGenresRequestItem :: Maybe Text youtubeUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "youtubeUrl", $sel:soundcloudUrl:InsertGenresRequestItem :: Maybe Text soundcloudUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "soundcloudUrl", $sel:wikipediaUrl:InsertGenresRequestItem :: Maybe Text wikipediaUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "wikipediaUrl", $sel:description:InsertGenresRequestItem :: Maybe Text description = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "description" } ] } genreLikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a genreLikeRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a genreLikeRoute Env env Maybe Text cookie Maybe Text maybeReferer UUID identifier = do Either Text UpsertGenreOpinionsCommandResponse _ <- IO (Either Text UpsertGenreOpinionsCommandResponse) -> m (Either Text UpsertGenreOpinionsCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text UpsertGenreOpinionsCommandResponse) -> m (Either Text UpsertGenreOpinionsCommandResponse)) -> IO (Either Text UpsertGenreOpinionsCommandResponse) -> m (Either Text UpsertGenreOpinionsCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> UpsertGenreOpinionsRequest -> Free Backend (Either Text UpsertGenreOpinionsCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UpsertGenreOpinionsRequest -> Free f (Either Text UpsertGenreOpinionsCommandResponse) upsertGenreOpinion 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) UpsertGenreOpinionsRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Liked genre!", headers = [withLocation (fromMaybe "/genres" maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: UpsertGenreOpinionsRequest r = UpsertGenreOpinionsRequest { $sel:genreOpinions:UpsertGenreOpinionsRequest :: [UpsertGenreOpinionsRequestItem] genreOpinions = [ UpsertGenreOpinionsRequestItem { $sel:genreIdentifier:UpsertGenreOpinionsRequestItem :: UUID genreIdentifier = UUID identifier, $sel:isLike:UpsertGenreOpinionsRequestItem :: Bool isLike = Bool True } ] } genreDislikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a genreDislikeRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a genreDislikeRoute Env env Maybe Text cookie Maybe Text maybeReferer UUID identifier = do Either Text UpsertGenreOpinionsCommandResponse _ <- IO (Either Text UpsertGenreOpinionsCommandResponse) -> m (Either Text UpsertGenreOpinionsCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text UpsertGenreOpinionsCommandResponse) -> m (Either Text UpsertGenreOpinionsCommandResponse)) -> IO (Either Text UpsertGenreOpinionsCommandResponse) -> m (Either Text UpsertGenreOpinionsCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> UpsertGenreOpinionsRequest -> Free Backend (Either Text UpsertGenreOpinionsCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UpsertGenreOpinionsRequest -> Free f (Either Text UpsertGenreOpinionsCommandResponse) upsertGenreOpinion 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) UpsertGenreOpinionsRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Disliked genre!", headers = [withLocation (fromMaybe "/genres" maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: UpsertGenreOpinionsRequest r = UpsertGenreOpinionsRequest { $sel:genreOpinions:UpsertGenreOpinionsRequest :: [UpsertGenreOpinionsRequestItem] genreOpinions = [ UpsertGenreOpinionsRequestItem { $sel:genreIdentifier:UpsertGenreOpinionsRequestItem :: UUID genreIdentifier = UUID identifier, $sel:isLike:UpsertGenreOpinionsRequestItem :: Bool isLike = Bool False } ] } genreEditRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html genreEditRoute :: forall (m :: * -> *). (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html genreEditRoute Env env Maybe Text cookie UUID identifier = do Either Text GetGenresQueryResponse maybeGenres <- IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse)) -> IO (Either Text GetGenresQueryResponse) -> m (Either Text GetGenresQueryResponse) 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 GetGenresQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UUID -> Free f (Either Text GetGenresQueryResponse) getGenre 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 Genre)) a = (GetGenresQueryResponse -> Maybe (NonEmpty Genre)) -> Either Text GetGenresQueryResponse -> Either Text (Maybe (NonEmpty Genre)) 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 (\GetGenresQueryResponse x -> [Genre] -> Maybe (NonEmpty Genre) forall a. [a] -> Maybe (NonEmpty a) nonEmpty ([Genre] -> Maybe (NonEmpty Genre)) -> [Genre] -> Maybe (NonEmpty Genre) forall a b. (a -> b) -> a -> b $ Map UUID Genre -> [Genre] forall k a. Map k a -> [a] mapElems (Map UUID Genre -> [Genre]) -> Map UUID Genre -> [Genre] forall a b. (a -> b) -> a -> b $ GetGenresQueryResponse x GetGenresQueryResponse -> Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre) -> Map UUID Genre forall k s (is :: IxList) a. Is k A_Getter => s -> Optic' k is s a -> a ^. Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre) #genres) Either Text GetGenresQueryResponse maybeGenres Either Text (Maybe (NonEmpty Genre)) -> (NonEmpty Genre -> 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 Genre)) a (forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @View (Free View Html -> IO Html) -> (NonEmpty Genre -> Free View Html) -> NonEmpty Genre -> IO Html forall b c a. (b -> c) -> (a -> b) -> a -> c . Env -> ViewVars -> Genre -> Free View Html forall (f :: * -> *). (View :<: f) => Env -> ViewVars -> Genre -> Free f Html genreEditPage Env env ViewVars vv (Genre -> Free View Html) -> (NonEmpty Genre -> Genre) -> NonEmpty Genre -> Free View Html forall b c a. (b -> c) -> (a -> b) -> a -> c . NonEmpty Genre -> Genre forall (f :: * -> *) a. IsNonEmpty f a a "head" => f a -> a head) where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie genreEditFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a genreEditFormRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a genreEditFormRoute Env env Maybe Text cookie Maybe Text maybeReferer UUID identifier MultipartData tag multipartData = do Either Text () editResult <- 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 -> GenreDeltaRequest -> Free Backend (Either Text ()) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> GenreDeltaRequest -> Free f (Either Text ()) editGenre 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) GenreDeltaRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Updated genre!", headers = [withLocation (fromMaybe "/genres" maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: GenreDeltaRequest r = GenreDeltaRequest { $sel:genreDeltas:GenreDeltaRequest :: [GenreDelta] genreDeltas = [ GenreDelta { $sel:identifier:GenreDelta :: UUID identifier = UUID identifier, $sel:displayName:GenreDelta :: Maybe Text displayName = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "displayName", $sel:spotifyUrl:GenreDelta :: Maybe Text spotifyUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "spotifyUrl", $sel:youtubeUrl:GenreDelta :: Maybe Text youtubeUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "youtubeUrl", $sel:soundcloudUrl:GenreDelta :: Maybe Text soundcloudUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "soundcloudUrl", $sel:wikipediaUrl:GenreDelta :: Maybe Text wikipediaUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "wikipediaUrl", $sel:description:GenreDelta :: Maybe Text description = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "description" } ] } searchGenreRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a searchGenreRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a searchGenreRoute Env _ MultipartData tag multipartData = ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Go to search genres!", headers = [withLocation newRoute] } where searchData :: Text searchData = MultipartData tag -> Text -> Text -> Text forall tag. MultipartData tag -> Text -> Text -> Text fromForm MultipartData tag multipartData Text "" Text "searchInput" newRoute :: Text newRoute = Text "/genres?searchInput=" Text -> Text -> Text forall a. Semigroup a => a -> a -> a <> Text searchData createGenreArtworkRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a createGenreArtworkRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a createGenreArtworkRoute Env env Maybe Text cookie Maybe Text maybeReferer UUID identifier MultipartData tag multipartData = do Either Text InsertGenreArtworksCommandResponse _ <- IO (Either Text InsertGenreArtworksCommandResponse) -> m (Either Text InsertGenreArtworksCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text InsertGenreArtworksCommandResponse) -> m (Either Text InsertGenreArtworksCommandResponse)) -> IO (Either Text InsertGenreArtworksCommandResponse) -> m (Either Text InsertGenreArtworksCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> InsertGenreArtworksRequest -> Free Backend (Either Text InsertGenreArtworksCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> InsertGenreArtworksRequest -> Free f (Either Text InsertGenreArtworksCommandResponse) createGenreArtwork 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) InsertGenreArtworksRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Created genre artwork!", headers = [withLocation (maybe "/genres" (<> "#edit-artwork") maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: InsertGenreArtworksRequest r = InsertGenreArtworksRequest { $sel:genreArtworks:InsertGenreArtworksRequest :: [InsertGenreArtworksRequestItem] genreArtworks = [ InsertGenreArtworksRequestItem { $sel:genreIdentifier:InsertGenreArtworksRequestItem :: UUID genreIdentifier = UUID identifier, $sel:orderValue:InsertGenreArtworksRequestItem :: 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:InsertGenreArtworksRequestItem :: 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:InsertGenreArtworksRequestItem :: Maybe Text contentCaption = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "contentCaption" } ] } genreDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m a genreDeleteRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m a genreDeleteRoute 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 ()) deleteGenre 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 genre!", headers = [withLocation "/genres"] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie genreArtworkDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a genreArtworkDeleteRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a genreArtworkDeleteRoute 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 ()) deleteGenreArtwork 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 genre artwork!", headers = [withLocation (maybe "/genres" (<> "#edit-artwork") maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie updateGenreArtworkOrderRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a updateGenreArtworkOrderRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a updateGenreArtworkOrderRoute 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 -> GenreArtworkOrderUpdateRequest -> Free Backend (Either Text ()) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> GenreArtworkOrderUpdateRequest -> Free f (Either Text ()) updateGenreArtworkOrder 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) GenreArtworkOrderUpdateRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse serverResponse { code = 302, cause = Just "Deleted genre artwork!", headers = [withLocation (maybe "/genres" (<> "#edit-artwork") maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: GenreArtworkOrderUpdateRequest r = GenreArtworkOrderUpdateRequest { $sel:genreArtworkOrders:GenreArtworkOrderUpdateRequest :: [GenreArtworkOrderUpdate] genreArtworkOrders = [ GenreArtworkOrderUpdate { $sel:identifier:GenreArtworkOrderUpdate :: UUID identifier = UUID identifier, $sel:orderValue:GenreArtworkOrderUpdate :: 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") } ] }