packages feed

wikimusic-ssr-1.0.1.6: src/WikiMusic/SSR/Servant/ArtistRoutes.hs

{-# 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 env cookie givenSortOrder limit offset searchInput = do
  maybeArtists <- case searchInput of
    Nothing ->
      liftIO
        $ exec @Backend
          ( getArtists
              env
              (vv ^. #authToken)
              limit'
              offset'
              sortOrder
              (Include {value = "artworks,comments,opinions"})
          )
    Just search ->
      liftIO
        $ exec @Backend
          ( searchArtists
              env
              (vv ^. #authToken)
              search
              limit'
              offset'
              sortOrder
              (Include {value = "artworks,comments,opinions"})
          )
  respondWithViewOrErr
    maybeArtists
    (exec @View . artistListPage limit' offset' env vv)
  where
    vv = vvFromCookies cookie
    sortOrder = maybe (vv ^. #artistSorting) SortOrder givenSortOrder
    limit' = maybe (Limit 50) Limit limit
    offset' = maybe (Offset 0) Offset offset

artistRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html
artistRoute env cookie identifier = do
  maybeArtists <-
    liftIO
      $ exec @Backend
        ( getArtist
            env
            (vv ^. #authToken)
            identifier
        )
  respondWithViewOrErr
    maybeArtists
    (exec @View . artistDetailPage env vv)
  where
    vv = vvFromCookies cookie

artistCreateRoute :: (MonadIO m) => Env -> Maybe Text -> m Html
artistCreateRoute env cookie = do
  liftIO $ exec @View (artistCreatePage env vv)
  where
    vv = vvFromCookies cookie

artistCreateFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a
artistCreateFormRoute env cookie multipartData = do
  _ <- liftIO $ exec @Backend (createArtist env (vv ^. #authToken) r)
  respondWithHttp
    httpFound
      { cause = Just "Created artist!",
        headers = [withLocation "/artists"]
      }
  where
    vv = vvFromCookies cookie
    r =
      InsertArtistsRequest
        { artists =
            [ InsertArtistsRequestItem
                { displayName = fromForm multipartData "" "displayName",
                  spotifyUrl = maybeFromForm multipartData "spotifyUrl",
                  youtubeUrl = maybeFromForm multipartData "youtubeUrl",
                  soundcloudUrl = maybeFromForm multipartData "soundcloudUrl",
                  wikipediaUrl = maybeFromForm multipartData "wikipediaUrl",
                  description = maybeFromForm multipartData "description"
                }
            ]
        }

artistLikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
artistLikeRoute env cookie maybeReferer identifier = do
  _ <- liftIO $ exec @Backend (upsertArtistOpinion env (vv ^. #authToken) r)

  respondWithHttp
    httpFound
      { cause = Just "Liked artist!",
        headers = [withLocation (fromMaybe "/artists" maybeReferer)]
      }
  where
    vv = vvFromCookies cookie
    r =
      UpsertArtistOpinionsRequest
        { artistOpinions =
            [ UpsertArtistOpinionsRequestItem
                { artistIdentifier = identifier,
                  isLike = True
                }
            ]
        }

artistDislikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
artistDislikeRoute env cookie maybeReferer identifier = do
  _ <- liftIO $ exec @Backend (upsertArtistOpinion env (vv ^. #authToken) r)
  respondWithHttp
    httpFound
      { cause = Just "Disliked artist!",
        headers = [withLocation (fromMaybe "/artists" maybeReferer)]
      }
  where
    vv = vvFromCookies cookie
    r =
      UpsertArtistOpinionsRequest
        { artistOpinions =
            [ UpsertArtistOpinionsRequestItem
                { artistIdentifier = identifier,
                  isLike = False
                }
            ]
        }

artistEditRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html
artistEditRoute env cookie identifier = do
  maybeArtists <-
    liftIO
      $ exec @Backend
        ( getArtist
            env
            (vv ^. #authToken)
            identifier
        )
  let maybeArtistList = second (\x -> nonEmpty $ mapElems $ x ^. #artists) maybeArtists

  respondWithViewOrErr'
    maybeArtistList
    (exec @View . artistEditPage env vv . head)
  where
    vv = vvFromCookies cookie

artistEditFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
artistEditFormRoute env cookie maybeReferer identifier multipartData = do
  _ <- liftIO $ exec @Backend (editArtist env (vv ^. #authToken) r)
  respondWithHttp
    httpFound
      { cause = Just "Updated artist!",
        headers = [withLocation (maybe "/artists" (replaceText "/edit" "") maybeReferer)]
      }
  where
    vv = vvFromCookies cookie
    r =
      ArtistDeltaRequest
        { artistDeltas =
            [ ArtistDelta
                { identifier = identifier,
                  displayName = maybeFromForm multipartData "displayName",
                  spotifyUrl = maybeFromForm multipartData "spotifyUrl",
                  youtubeUrl = maybeFromForm multipartData "youtubeUrl",
                  soundcloudUrl = maybeFromForm multipartData "soundcloudUrl",
                  wikipediaUrl = maybeFromForm multipartData "wikipediaUrl",
                  description = maybeFromForm multipartData "description"
                }
            ]
        }

searchArtistRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a
searchArtistRoute _ multipartData =
  respondWithHttp
    httpFound
      { cause = Just "Go to search artist page!",
        headers = [withLocation newRoute]
      }
  where
    searchData = fromForm multipartData "" "searchInput"
    newRoute = "/artists?searchInput=" <> searchData

createArtistArtworkRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
createArtistArtworkRoute env cookie maybeReferer identifier multipartData = do
  _ <- liftIO $ exec @Backend (createArtistArtwork env (vv ^. #authToken) r)
  respondWithHttp
    httpFound
      { cause = Just "Created artist!",
        headers = [withLocation (maybe "/artists" (<> "#edit-artwork") maybeReferer)]
      }
  where
    vv = vvFromCookies cookie
    r =
      InsertArtistArtworksRequest
        { artistArtworks =
            [ InsertArtistArtworksRequestItem
                { artistIdentifier = identifier,
                  orderValue = fromMaybe 0 $ readMaybe (unpackText . fromMaybe "0" $ maybeFromForm multipartData "orderValue"),
                  contentUrl = fromMaybe "" $ maybeFromForm multipartData "contentUrl",
                  contentCaption = maybeFromForm multipartData "contentCaption"
                }
            ]
        }

artistDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m a
artistDeleteRoute env cookie identifier = do
  _ <- liftIO $ exec @Backend (deleteArtist env (vv ^. #authToken) identifier)

  respondWithHttp
    httpFound
      { cause = Just "Deleted artist!",
        headers = [withLocation "/artists"]
      }
  where
    vv = vvFromCookies cookie

artistArtworkDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
artistArtworkDeleteRoute env cookie maybeReferer identifier = do
  _ <- liftIO $ exec @Backend (deleteArtistArtwork env (vv ^. #authToken) identifier)
  respondWithHttp
    httpFound
      { cause = Just "",
        headers = [withLocation (maybe "/artists" (<> "#edit-artwork") maybeReferer)]
      }
  where
    vv = vvFromCookies cookie

updateArtistArtworkOrderRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
updateArtistArtworkOrderRoute env cookie maybeReferer identifier multipartData = do
  _ <- liftIO $ exec @Backend (updateArtistArtworkOrder env (vv ^. #authToken) r)
  respondWithHttp
    httpFound
      { cause = Just "Updated artist!",
        headers = [withLocation (maybe "/artists" (<> "#edit-artwork") maybeReferer)]
      }
  where
    vv = vvFromCookies cookie
    r =
      ArtistArtworkOrderUpdateRequest
        { artistArtworkOrders =
            [ ArtistArtworkOrderUpdate
                { identifier = identifier,
                  orderValue = fromMaybe 0 $ readMaybe (unpackText . fromMaybe "0" $ maybeFromForm multipartData "orderValue")
                }
            ]
        }