{-# LANGUAGE OverloadedLabels #-} module WikiMusic.SSR.Servant.ArtistRoutes where import Principium import Servant import Servant.Multipart import WikiMusic.Interaction.Model.Artist import WikiMusic.Model.Artist 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 () artistsRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Text -> m Html artistsRoute :: forall (m :: * -> *). (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Int -> Maybe Text -> m Html artistsRoute Env env Maybe Text cookie Maybe Text givenSortOrder Maybe Int limit Maybe Int offset Maybe Text searchInput = do Either Text GetArtistsQueryResponse maybeArtists <- case Maybe Text searchInput of Maybe Text Nothing -> IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse)) -> IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) 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 GetArtistsQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> Limit -> Offset -> SortOrder -> Include -> Free f (Either Text GetArtistsQueryResponse) getArtists 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 GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse)) -> IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) 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 GetArtistsQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> Text -> Limit -> Offset -> SortOrder -> Include -> Free f (Either Text GetArtistsQueryResponse) searchArtists 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 GetArtistsQueryResponse -> (GetArtistsQueryResponse -> IO Html) -> m Html forall (m :: * -> *) t a. (MonadIO m, MonadError ServerError m) => Either Text t -> (t -> IO a) -> m a respondWithViewOrErr Either Text GetArtistsQueryResponse maybeArtists (forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @View (Free View Html -> IO Html) -> (GetArtistsQueryResponse -> Free View Html) -> GetArtistsQueryResponse -> IO Html forall b c a. (b -> c) -> (a -> b) -> a -> c . Limit -> Offset -> Env -> ViewVars -> GetArtistsQueryResponse -> Free View Html forall (f :: * -> *). (View :<: f) => Limit -> Offset -> Env -> ViewVars -> GetArtistsQueryResponse -> Free f Html artistListPage 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 #artistSorting) 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 artistRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html artistRoute :: forall (m :: * -> *). (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html artistRoute Env env Maybe Text cookie UUID identifier = do Either Text GetArtistsQueryResponse maybeArtists <- IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse)) -> IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) 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 GetArtistsQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UUID -> Free f (Either Text GetArtistsQueryResponse) getArtist 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 GetArtistsQueryResponse -> (GetArtistsQueryResponse -> IO Html) -> m Html forall (m :: * -> *) t a. (MonadIO m, MonadError ServerError m) => Either Text t -> (t -> IO a) -> m a respondWithViewOrErr Either Text GetArtistsQueryResponse maybeArtists (forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @View (Free View Html -> IO Html) -> (GetArtistsQueryResponse -> Free View Html) -> GetArtistsQueryResponse -> IO Html forall b c a. (b -> c) -> (a -> b) -> a -> c . Env -> ViewVars -> GetArtistsQueryResponse -> Free View Html forall (f :: * -> *). (View :<: f) => Env -> ViewVars -> GetArtistsQueryResponse -> Free f Html artistDetailPage Env env ViewVars vv) where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie artistCreateRoute :: (MonadIO m) => Env -> Maybe Text -> m Html artistCreateRoute :: forall (m :: * -> *). MonadIO m => Env -> Maybe Text -> m Html artistCreateRoute 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 artistCreatePage Env env ViewVars vv) where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie artistCreateFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a artistCreateFormRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a artistCreateFormRoute Env env Maybe Text cookie MultipartData tag multipartData = do Either Text InsertArtistsCommandResponse _ <- IO (Either Text InsertArtistsCommandResponse) -> m (Either Text InsertArtistsCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text InsertArtistsCommandResponse) -> m (Either Text InsertArtistsCommandResponse)) -> IO (Either Text InsertArtistsCommandResponse) -> m (Either Text InsertArtistsCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> InsertArtistsRequest -> Free Backend (Either Text InsertArtistsCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> InsertArtistsRequest -> Free f (Either Text InsertArtistsCommandResponse) createArtist 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) InsertArtistsRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Created artist!", headers = [withLocation "/artists"] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: InsertArtistsRequest r = InsertArtistsRequest { $sel:artists:InsertArtistsRequest :: [InsertArtistsRequestItem] artists = [ InsertArtistsRequestItem { $sel:displayName:InsertArtistsRequestItem :: Text displayName = MultipartData tag -> Text -> Text -> Text forall tag. MultipartData tag -> Text -> Text -> Text fromForm MultipartData tag multipartData Text "" Text "displayName", $sel:spotifyUrl:InsertArtistsRequestItem :: Maybe Text spotifyUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "spotifyUrl", $sel:youtubeUrl:InsertArtistsRequestItem :: Maybe Text youtubeUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "youtubeUrl", $sel:soundcloudUrl:InsertArtistsRequestItem :: Maybe Text soundcloudUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "soundcloudUrl", $sel:wikipediaUrl:InsertArtistsRequestItem :: Maybe Text wikipediaUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "wikipediaUrl", $sel:description:InsertArtistsRequestItem :: Maybe Text description = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "description" } ] } artistLikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a artistLikeRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a artistLikeRoute Env env Maybe Text cookie Maybe Text maybeReferer UUID identifier = do Either Text UpsertArtistOpinionsCommandResponse _ <- IO (Either Text UpsertArtistOpinionsCommandResponse) -> m (Either Text UpsertArtistOpinionsCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text UpsertArtistOpinionsCommandResponse) -> m (Either Text UpsertArtistOpinionsCommandResponse)) -> IO (Either Text UpsertArtistOpinionsCommandResponse) -> m (Either Text UpsertArtistOpinionsCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> UpsertArtistOpinionsRequest -> Free Backend (Either Text UpsertArtistOpinionsCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UpsertArtistOpinionsRequest -> Free f (Either Text UpsertArtistOpinionsCommandResponse) upsertArtistOpinion 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) UpsertArtistOpinionsRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Liked artist!", headers = [withLocation (fromMaybe "/artists" maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: UpsertArtistOpinionsRequest r = UpsertArtistOpinionsRequest { $sel:artistOpinions:UpsertArtistOpinionsRequest :: [UpsertArtistOpinionsRequestItem] artistOpinions = [ UpsertArtistOpinionsRequestItem { $sel:artistIdentifier:UpsertArtistOpinionsRequestItem :: UUID artistIdentifier = UUID identifier, $sel:isLike:UpsertArtistOpinionsRequestItem :: Bool isLike = Bool True } ] } artistDislikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a artistDislikeRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a artistDislikeRoute Env env Maybe Text cookie Maybe Text maybeReferer UUID identifier = do Either Text UpsertArtistOpinionsCommandResponse _ <- IO (Either Text UpsertArtistOpinionsCommandResponse) -> m (Either Text UpsertArtistOpinionsCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text UpsertArtistOpinionsCommandResponse) -> m (Either Text UpsertArtistOpinionsCommandResponse)) -> IO (Either Text UpsertArtistOpinionsCommandResponse) -> m (Either Text UpsertArtistOpinionsCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> UpsertArtistOpinionsRequest -> Free Backend (Either Text UpsertArtistOpinionsCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UpsertArtistOpinionsRequest -> Free f (Either Text UpsertArtistOpinionsCommandResponse) upsertArtistOpinion 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) UpsertArtistOpinionsRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Disliked artist!", headers = [withLocation (fromMaybe "/artists" maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: UpsertArtistOpinionsRequest r = UpsertArtistOpinionsRequest { $sel:artistOpinions:UpsertArtistOpinionsRequest :: [UpsertArtistOpinionsRequestItem] artistOpinions = [ UpsertArtistOpinionsRequestItem { $sel:artistIdentifier:UpsertArtistOpinionsRequestItem :: UUID artistIdentifier = UUID identifier, $sel:isLike:UpsertArtistOpinionsRequestItem :: Bool isLike = Bool False } ] } artistEditRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html artistEditRoute :: forall (m :: * -> *). (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html artistEditRoute Env env Maybe Text cookie UUID identifier = do Either Text GetArtistsQueryResponse maybeArtists <- IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse)) -> IO (Either Text GetArtistsQueryResponse) -> m (Either Text GetArtistsQueryResponse) 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 GetArtistsQueryResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> UUID -> Free f (Either Text GetArtistsQueryResponse) getArtist 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 maybeArtistList :: Either Text (Maybe (NonEmpty Artist)) maybeArtistList = (GetArtistsQueryResponse -> Maybe (NonEmpty Artist)) -> Either Text GetArtistsQueryResponse -> Either Text (Maybe (NonEmpty Artist)) 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 (\GetArtistsQueryResponse x -> [Artist] -> Maybe (NonEmpty Artist) forall a. [a] -> Maybe (NonEmpty a) nonEmpty ([Artist] -> Maybe (NonEmpty Artist)) -> [Artist] -> Maybe (NonEmpty Artist) forall a b. (a -> b) -> a -> b $ Map UUID Artist -> [Artist] forall k a. Map k a -> [a] mapElems (Map UUID Artist -> [Artist]) -> Map UUID Artist -> [Artist] forall a b. (a -> b) -> a -> b $ GetArtistsQueryResponse x GetArtistsQueryResponse -> Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist) -> Map UUID Artist forall k s (is :: IxList) a. Is k A_Getter => s -> Optic' k is s a -> a ^. Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist) #artists) Either Text GetArtistsQueryResponse maybeArtists Either Text (Maybe (NonEmpty Artist)) -> (NonEmpty Artist -> 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 Artist)) maybeArtistList (forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @View (Free View Html -> IO Html) -> (NonEmpty Artist -> Free View Html) -> NonEmpty Artist -> IO Html forall b c a. (b -> c) -> (a -> b) -> a -> c . Env -> ViewVars -> Artist -> Free View Html forall (f :: * -> *). (View :<: f) => Env -> ViewVars -> Artist -> Free f Html artistEditPage Env env ViewVars vv (Artist -> Free View Html) -> (NonEmpty Artist -> Artist) -> NonEmpty Artist -> Free View Html forall b c a. (b -> c) -> (a -> b) -> a -> c . NonEmpty Artist -> Artist forall (f :: * -> *) a. IsNonEmpty f a a "head" => f a -> a head) where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie artistEditFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a artistEditFormRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a artistEditFormRoute 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 -> ArtistDeltaRequest -> Free Backend (Either Text ()) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> ArtistDeltaRequest -> Free f (Either Text ()) editArtist 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) ArtistDeltaRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Updated artist!", headers = [withLocation (maybe "/artists" (replaceText "/edit" "") maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: ArtistDeltaRequest r = ArtistDeltaRequest { $sel:artistDeltas:ArtistDeltaRequest :: [ArtistDelta] artistDeltas = [ ArtistDelta { $sel:identifier:ArtistDelta :: UUID identifier = UUID identifier, $sel:displayName:ArtistDelta :: Maybe Text displayName = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "displayName", $sel:spotifyUrl:ArtistDelta :: Maybe Text spotifyUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "spotifyUrl", $sel:youtubeUrl:ArtistDelta :: Maybe Text youtubeUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "youtubeUrl", $sel:soundcloudUrl:ArtistDelta :: Maybe Text soundcloudUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "soundcloudUrl", $sel:wikipediaUrl:ArtistDelta :: Maybe Text wikipediaUrl = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "wikipediaUrl", $sel:description:ArtistDelta :: Maybe Text description = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "description" } ] } searchArtistRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a searchArtistRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a searchArtistRoute 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 artist page!", 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 "/artists?searchInput=" Text -> Text -> Text forall a. Semigroup a => a -> a -> a <> Text searchData createArtistArtworkRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a createArtistArtworkRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a createArtistArtworkRoute Env env Maybe Text cookie Maybe Text maybeReferer UUID identifier MultipartData tag multipartData = do Either Text InsertArtistArtworksCommandResponse _ <- IO (Either Text InsertArtistArtworksCommandResponse) -> m (Either Text InsertArtistArtworksCommandResponse) forall a. IO a -> m a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO (Either Text InsertArtistArtworksCommandResponse) -> m (Either Text InsertArtistArtworksCommandResponse)) -> IO (Either Text InsertArtistArtworksCommandResponse) -> m (Either Text InsertArtistArtworksCommandResponse) forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a. Exec f => Free f a -> IO a exec @Backend (Env -> AuthToken -> InsertArtistArtworksRequest -> Free Backend (Either Text InsertArtistArtworksCommandResponse) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> InsertArtistArtworksRequest -> Free f (Either Text InsertArtistArtworksCommandResponse) createArtistArtwork 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) InsertArtistArtworksRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Created artist!", headers = [withLocation (maybe "/artists" (<> "#edit-artwork") maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: InsertArtistArtworksRequest r = InsertArtistArtworksRequest { $sel:artistArtworks:InsertArtistArtworksRequest :: [InsertArtistArtworksRequestItem] artistArtworks = [ InsertArtistArtworksRequestItem { $sel:artistIdentifier:InsertArtistArtworksRequestItem :: UUID artistIdentifier = UUID identifier, $sel:orderValue:InsertArtistArtworksRequestItem :: 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:InsertArtistArtworksRequestItem :: 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:InsertArtistArtworksRequestItem :: Maybe Text contentCaption = MultipartData tag -> Text -> Maybe Text forall tag. MultipartData tag -> Text -> Maybe Text maybeFromForm MultipartData tag multipartData Text "contentCaption" } ] } artistDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m a artistDeleteRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m a artistDeleteRoute 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 ()) deleteArtist 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 artist!", headers = [withLocation "/artists"] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie artistArtworkDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a artistArtworkDeleteRoute :: forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a artistArtworkDeleteRoute 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 ()) deleteArtistArtwork 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 "", headers = [withLocation (maybe "/artists" (<> "#edit-artwork") maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie updateArtistArtworkOrderRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a updateArtistArtworkOrderRoute :: forall (m :: * -> *) tag a. (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a updateArtistArtworkOrderRoute 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 -> ArtistArtworkOrderUpdateRequest -> Free Backend (Either Text ()) forall (f :: * -> *). (Backend :<: f) => Env -> AuthToken -> ArtistArtworkOrderUpdateRequest -> Free f (Either Text ()) updateArtistArtworkOrder 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) ArtistArtworkOrderUpdateRequest r) ServerResponse -> m a forall (m :: * -> *) a. (MonadIO m, MonadError ServerError m) => ServerResponse -> m a respondWithHttp ServerResponse httpFound { cause = Just "Updated artist!", headers = [withLocation (maybe "/artists" (<> "#edit-artwork") maybeReferer)] } where vv :: ViewVars vv = Maybe Text -> ViewVars vvFromCookies Maybe Text cookie r :: ArtistArtworkOrderUpdateRequest r = ArtistArtworkOrderUpdateRequest { $sel:artistArtworkOrders:ArtistArtworkOrderUpdateRequest :: [ArtistArtworkOrderUpdate] artistArtworkOrders = [ ArtistArtworkOrderUpdate { $sel:identifier:ArtistArtworkOrderUpdate :: UUID identifier = UUID identifier, $sel:orderValue:ArtistArtworkOrderUpdate :: 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") } ] }