wikimusic-ssr-1.0.1.6: src/WikiMusic/SSR/Servant/GenreRoutes.hs
{-# 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 env cookie givenSortOrder limit offset searchInput = do
maybeGenres <- case searchInput of
Nothing ->
liftIO
$ exec @Backend
( getGenres
env
(vv ^. #authToken)
limit'
offset'
sortOrder
(Include {value = "artworks,comments,opinions"})
)
Just search ->
liftIO
$ exec @Backend
( searchGenres
env
(vv ^. #authToken)
search
limit'
offset'
sortOrder
(Include {value = "artworks,comments,opinions"})
)
respondWithViewOrErr
maybeGenres
(exec @View . genreListPage limit' offset' env vv)
where
vv = vvFromCookies cookie
sortOrder = maybe (vv ^. #genreSorting) SortOrder givenSortOrder
limit' = maybe (Limit 50) Limit limit
offset' = maybe (Offset 0) Offset offset
genreRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html
genreRoute env cookie identifier = do
maybeGenres <-
liftIO
$ exec @Backend
( getGenre
env
(vv ^. #authToken)
identifier
)
respondWithViewOrErr
maybeGenres
(exec @View . genreDetailPage env vv)
where
vv = vvFromCookies cookie
genreCreateRoute :: (MonadIO m) => Env -> Maybe Text -> m Html
genreCreateRoute env cookie = do
liftIO $ exec @View (genreCreatePage env vv)
where
vv = vvFromCookies cookie
genreCreateFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a
genreCreateFormRoute env cookie multipartData = do
_ <- liftIO $ exec @Backend (createGenre env (vv ^. #authToken) r)
respondWithHttp
httpFound
{ cause = Just "Created genre!",
headers = [withLocation "/genres"]
}
where
vv = vvFromCookies cookie
r =
InsertGenresRequest
{ genres =
[ InsertGenresRequestItem
{ displayName = fromForm multipartData "" "displayName",
spotifyUrl = maybeFromForm multipartData "spotifyUrl",
youtubeUrl = maybeFromForm multipartData "youtubeUrl",
soundcloudUrl = maybeFromForm multipartData "soundcloudUrl",
wikipediaUrl = maybeFromForm multipartData "wikipediaUrl",
description = maybeFromForm multipartData "description"
}
]
}
genreLikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
genreLikeRoute env cookie maybeReferer identifier = do
_ <- liftIO $ exec @Backend (upsertGenreOpinion env (vv ^. #authToken) r)
respondWithHttp
httpFound
{ cause = Just "Liked genre!",
headers = [withLocation (fromMaybe "/genres" maybeReferer)]
}
where
vv = vvFromCookies cookie
r =
UpsertGenreOpinionsRequest
{ genreOpinions =
[ UpsertGenreOpinionsRequestItem
{ genreIdentifier = identifier,
isLike = True
}
]
}
genreDislikeRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
genreDislikeRoute env cookie maybeReferer identifier = do
_ <- liftIO $ exec @Backend (upsertGenreOpinion env (vv ^. #authToken) r)
respondWithHttp
httpFound
{ cause = Just "Disliked genre!",
headers = [withLocation (fromMaybe "/genres" maybeReferer)]
}
where
vv = vvFromCookies cookie
r =
UpsertGenreOpinionsRequest
{ genreOpinions =
[ UpsertGenreOpinionsRequestItem
{ genreIdentifier = identifier,
isLike = False
}
]
}
genreEditRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m Html
genreEditRoute env cookie identifier = do
maybeGenres <-
liftIO
$ exec @Backend
( getGenre
env
(vv ^. #authToken)
identifier
)
let a = second (\x -> nonEmpty $ mapElems $ x ^. #genres) maybeGenres
respondWithViewOrErr'
a
(exec @View . genreEditPage env vv . head)
where
vv = vvFromCookies cookie
genreEditFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
genreEditFormRoute env cookie maybeReferer identifier multipartData = do
editResult <- liftIO $ exec @Backend (editGenre env (vv ^. #authToken) r)
respondWithHttp
httpFound
{ cause = Just "Updated genre!",
headers = [withLocation (fromMaybe "/genres" maybeReferer)]
}
where
vv = vvFromCookies cookie
r =
GenreDeltaRequest
{ genreDeltas =
[ GenreDelta
{ 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"
}
]
}
searchGenreRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a
searchGenreRoute _ multipartData =
respondWithHttp
httpFound
{ cause = Just "Go to search genres!",
headers = [withLocation newRoute]
}
where
searchData = fromForm multipartData "" "searchInput"
newRoute = "/genres?searchInput=" <> searchData
createGenreArtworkRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
createGenreArtworkRoute env cookie maybeReferer identifier multipartData = do
_ <- liftIO $ exec @Backend (createGenreArtwork env (vv ^. #authToken) r)
respondWithHttp
httpFound
{ cause = Just "Created genre artwork!",
headers = [withLocation (maybe "/genres" (<> "#edit-artwork") maybeReferer)]
}
where
vv = vvFromCookies cookie
r =
InsertGenreArtworksRequest
{ genreArtworks =
[ InsertGenreArtworksRequestItem
{ genreIdentifier = identifier,
orderValue = fromMaybe 0 $ readMaybe (unpackText . fromMaybe "0" $ maybeFromForm multipartData "orderValue"),
contentUrl = fromMaybe "" $ maybeFromForm multipartData "contentUrl",
contentCaption = maybeFromForm multipartData "contentCaption"
}
]
}
genreDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> UUID -> m a
genreDeleteRoute env cookie identifier = do
_ <- liftIO $ exec @Backend (deleteGenre env (vv ^. #authToken) identifier)
respondWithHttp
httpFound
{ cause = Just "Deleted genre!",
headers = [withLocation "/genres"]
}
where
vv = vvFromCookies cookie
genreArtworkDeleteRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> m a
genreArtworkDeleteRoute env cookie maybeReferer identifier = do
_ <- liftIO $ exec @Backend (deleteGenreArtwork env (vv ^. #authToken) identifier)
respondWithHttp
httpFound
{ cause = Just "Deleted genre artwork!",
headers = [withLocation (maybe "/genres" (<> "#edit-artwork") maybeReferer)]
}
where
vv = vvFromCookies cookie
updateGenreArtworkOrderRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> Maybe Text -> UUID -> MultipartData tag -> m a
updateGenreArtworkOrderRoute env cookie maybeReferer identifier multipartData = do
_ <- liftIO $ exec @Backend (updateGenreArtworkOrder env (vv ^. #authToken) r)
respondWithHttp
serverResponse
{ code = 302,
cause = Just "Deleted genre artwork!",
headers = [withLocation (maybe "/genres" (<> "#edit-artwork") maybeReferer)]
}
where
vv = vvFromCookies cookie
r =
GenreArtworkOrderUpdateRequest
{ genreArtworkOrders =
[ GenreArtworkOrderUpdate
{ identifier = identifier,
orderValue = fromMaybe 0 $ readMaybe (unpackText . fromMaybe "0" $ maybeFromForm multipartData "orderValue")
}
]
}