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