{-# 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")
                }
            ]
        }