{-# LANGUAGE OverloadedLabels #-}

module WikiMusic.Interaction.Genre
  ( fetchGenresAction,
    insertGenresAction,
    insertGenreCommentsAction,
    insertGenreArtworksAction,
    upsertGenreOpinionsAction,
    deleteGenresByIdentifierAction,
    deleteGenreCommentsByIdentifierAction,
    deleteGenreOpinionsByIdentifierAction,
    deleteGenreArtworksByIdentifierAction,
    updateGenreArtworksOrderAction,
    updateGenreAction,
    fetchGenreAction,
    searchGenresAction,
  )
where

import Data.Map qualified as Map
import Data.Text (pack, take, unpack)
import Relude
import WikiMusic.Free.GenreCommand
import WikiMusic.Free.GenreQuery
import WikiMusic.Interaction.Model.Genre
import WikiMusic.Model.Genre
import WikiMusic.Model.Other
import WikiMusic.Protolude
import WikiMusic.Sqlite.GenreCommand ()
import WikiMusic.Sqlite.GenreQuery ()

fetchGenresAction ::
  (GenreQuery :<: f, GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  Limit ->
  Offset ->
  Maybe Text ->
  Maybe Text ->
  Free f (Either GenreError GetGenresQueryResponse)
fetchGenresAction :: forall (f :: * -> *).
(GenreQuery :<: f, GenreCommand :<: f) =>
Env
-> WikiMusicUser
-> Limit
-> Offset
-> Maybe Text
-> Maybe Text
-> Free f (Either GenreError GetGenresQueryResponse)
fetchGenresAction Env
env WikiMusicUser
authUser Limit
limit Offset
offset Maybe Text
maybeSortOrder Maybe Text
maybeInclude =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError GetGenresQueryResponse)
-> Free f (Either GenreError GetGenresQueryResponse)
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastDemo GenreError
AccessUnauthorizedError (Free f (Either GenreError GetGenresQueryResponse)
 -> Free f (Either GenreError GetGenresQueryResponse))
-> Free f (Either GenreError GetGenresQueryResponse)
-> Free f (Either GenreError GetGenresQueryResponse)
forall a b. (a -> b) -> a -> b
$ do
    (Map UUID Genre
genreMap, [UUID]
sortOrderList) <- Env
-> GenreSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Genre, [UUID])
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env
-> GenreSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Genre, [UUID])
fetchGenres Env
env GenreSortOrder
sortOrder Limit
limit Offset
offset

    Map UUID Genre
enrichedGenres <-
      Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
enrichedGenreResponse
        Env
env
        Map UUID Genre
genreMap
        (EnrichGenreParams
-> (Text -> EnrichGenreParams) -> Maybe Text -> EnrichGenreParams
forall b a. b -> (a -> b) -> Maybe a -> b
maybe EnrichGenreParams
noEnrichment Text -> EnrichGenreParams
parseInclude Maybe Text
maybeInclude)

    Either GenreError GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError GetGenresQueryResponse
 -> Free f (Either GenreError GetGenresQueryResponse))
-> (GetGenresQueryResponse
    -> Either GenreError GetGenresQueryResponse)
-> GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GetGenresQueryResponse -> Either GenreError GetGenresQueryResponse
forall a b. b -> Either a b
Right (GetGenresQueryResponse
 -> Free f (Either GenreError GetGenresQueryResponse))
-> GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall a b. (a -> b) -> a -> b
$ GetGenresQueryResponse {$sel:genres:GetGenresQueryResponse :: Map UUID Genre
genres = Map UUID Genre
enrichedGenres, $sel:sortOrder:GetGenresQueryResponse :: [UUID]
sortOrder = [UUID]
sortOrderList}
  where
    sortOrder :: GenreSortOrder
sortOrder = GenreSortOrder -> Maybe GenreSortOrder -> GenreSortOrder
forall a. a -> Maybe a -> a
fromMaybe GenreSortOrder
DescCreatedAt (String -> Maybe GenreSortOrder
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe GenreSortOrder)
-> (Text -> String) -> Text -> Maybe GenreSortOrder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack (Text -> Maybe GenreSortOrder)
-> Maybe Text -> Maybe GenreSortOrder
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Text
maybeSortOrder)

searchGenresAction ::
  (GenreQuery :<: f, GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  Limit ->
  Offset ->
  Maybe Text ->
  Maybe Text ->
  Text ->
  Free f (Either GenreError GetGenresQueryResponse)
searchGenresAction :: forall (f :: * -> *).
(GenreQuery :<: f, GenreCommand :<: f) =>
Env
-> WikiMusicUser
-> Limit
-> Offset
-> Maybe Text
-> Maybe Text
-> Text
-> Free f (Either GenreError GetGenresQueryResponse)
searchGenresAction Env
env WikiMusicUser
authUser Limit
limit Offset
offset Maybe Text
maybeSortOrder Maybe Text
maybeInclude Text
searchInput =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError GetGenresQueryResponse)
-> Free f (Either GenreError GetGenresQueryResponse)
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastDemo GenreError
AccessUnauthorizedError (Free f (Either GenreError GetGenresQueryResponse)
 -> Free f (Either GenreError GetGenresQueryResponse))
-> Free f (Either GenreError GetGenresQueryResponse)
-> Free f (Either GenreError GetGenresQueryResponse)
forall a b. (a -> b) -> a -> b
$ do
    (Map UUID Genre
genreMap, [UUID]
sortOrderList) <- Env
-> SearchInput
-> GenreSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Genre, [UUID])
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env
-> SearchInput
-> GenreSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Genre, [UUID])
searchGenres Env
env (Text -> SearchInput
SearchInput Text
searchInput) GenreSortOrder
sortOrder Limit
limit Offset
offset

    Map UUID Genre
enrichedGenres <-
      Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
enrichedGenreResponse
        Env
env
        Map UUID Genre
genreMap
        (EnrichGenreParams
-> (Text -> EnrichGenreParams) -> Maybe Text -> EnrichGenreParams
forall b a. b -> (a -> b) -> Maybe a -> b
maybe EnrichGenreParams
noEnrichment Text -> EnrichGenreParams
parseInclude Maybe Text
maybeInclude)

    Either GenreError GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError GetGenresQueryResponse
 -> Free f (Either GenreError GetGenresQueryResponse))
-> (GetGenresQueryResponse
    -> Either GenreError GetGenresQueryResponse)
-> GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GetGenresQueryResponse -> Either GenreError GetGenresQueryResponse
forall a b. b -> Either a b
Right (GetGenresQueryResponse
 -> Free f (Either GenreError GetGenresQueryResponse))
-> GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall a b. (a -> b) -> a -> b
$ GetGenresQueryResponse {$sel:genres:GetGenresQueryResponse :: Map UUID Genre
genres = Map UUID Genre
enrichedGenres, $sel:sortOrder:GetGenresQueryResponse :: [UUID]
sortOrder = [UUID]
sortOrderList}
  where
    sortOrder :: GenreSortOrder
sortOrder = GenreSortOrder -> Maybe GenreSortOrder -> GenreSortOrder
forall a. a -> Maybe a -> a
fromMaybe GenreSortOrder
DescCreatedAt (String -> Maybe GenreSortOrder
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe GenreSortOrder)
-> (Text -> String) -> Text -> Maybe GenreSortOrder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack (Text -> Maybe GenreSortOrder)
-> Maybe Text -> Maybe GenreSortOrder
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Text
maybeSortOrder)

fetchGenreAction ::
  (GenreQuery :<: f, GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  UUID ->
  Maybe Text ->
  Maybe Text ->
  Free f (Either GenreError GetGenresQueryResponse)
fetchGenreAction :: forall (f :: * -> *).
(GenreQuery :<: f, GenreCommand :<: f) =>
Env
-> WikiMusicUser
-> UUID
-> Maybe Text
-> Maybe Text
-> Free f (Either GenreError GetGenresQueryResponse)
fetchGenreAction Env
env WikiMusicUser
authUser UUID
identifier Maybe Text
maybeSortOrder Maybe Text
maybeInclude =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError GetGenresQueryResponse)
-> Free f (Either GenreError GetGenresQueryResponse)
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastDemo GenreError
AccessUnauthorizedError (Free f (Either GenreError GetGenresQueryResponse)
 -> Free f (Either GenreError GetGenresQueryResponse))
-> Free f (Either GenreError GetGenresQueryResponse)
-> Free f (Either GenreError GetGenresQueryResponse)
forall a b. (a -> b) -> a -> b
$ do
    (Map UUID Genre
genreMap, [UUID]
sortOrderList) <- Env -> GenreSortOrder -> [UUID] -> Free f (Map UUID Genre, [UUID])
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env -> GenreSortOrder -> [UUID] -> Free f (Map UUID Genre, [UUID])
fetchGenresByUUID Env
env GenreSortOrder
sortOrder [UUID
identifier]

    Map UUID Genre
enrichedGenres <-
      Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
enrichedGenreResponse
        Env
env
        Map UUID Genre
genreMap
        (EnrichGenreParams
-> (Text -> EnrichGenreParams) -> Maybe Text -> EnrichGenreParams
forall b a. b -> (a -> b) -> Maybe a -> b
maybe EnrichGenreParams
noEnrichment Text -> EnrichGenreParams
parseInclude Maybe Text
maybeInclude)

    Either GenreCommandError ()
_ <- Env -> [UUID] -> Free f (Either GenreCommandError ())
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [UUID] -> Free f (Either GenreCommandError ())
incrementViewsByOne Env
env (Map UUID Genre -> [UUID]
forall k a. Map k a -> [k]
Map.keys Map UUID Genre
genreMap)

    Either GenreError GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError GetGenresQueryResponse
 -> Free f (Either GenreError GetGenresQueryResponse))
-> (GetGenresQueryResponse
    -> Either GenreError GetGenresQueryResponse)
-> GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GetGenresQueryResponse -> Either GenreError GetGenresQueryResponse
forall a b. b -> Either a b
Right (GetGenresQueryResponse
 -> Free f (Either GenreError GetGenresQueryResponse))
-> GetGenresQueryResponse
-> Free f (Either GenreError GetGenresQueryResponse)
forall a b. (a -> b) -> a -> b
$ GetGenresQueryResponse {$sel:genres:GetGenresQueryResponse :: Map UUID Genre
genres = Map UUID Genre
enrichedGenres, $sel:sortOrder:GetGenresQueryResponse :: [UUID]
sortOrder = [UUID]
sortOrderList}
  where
    sortOrder :: GenreSortOrder
sortOrder = GenreSortOrder -> Maybe GenreSortOrder -> GenreSortOrder
forall a. a -> Maybe a -> a
fromMaybe GenreSortOrder
DescCreatedAt (String -> Maybe GenreSortOrder
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe GenreSortOrder)
-> (Text -> String) -> Text -> Maybe GenreSortOrder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack (Text -> Maybe GenreSortOrder)
-> Maybe Text -> Maybe GenreSortOrder
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Text
maybeSortOrder)

insertGenresAction ::
  (GenreCommand :<: f, GenreQuery :<: f) =>
  Env ->
  WikiMusicUser ->
  InsertGenresRequest ->
  Free f (Either GenreError InsertGenresCommandResponse)
insertGenresAction :: forall (f :: * -> *).
(GenreCommand :<: f, GenreQuery :<: f) =>
Env
-> WikiMusicUser
-> InsertGenresRequest
-> Free f (Either GenreError InsertGenresCommandResponse)
insertGenresAction Env
env WikiMusicUser
authUser InsertGenresRequest
request =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError InsertGenresCommandResponse)
-> Free f (Either GenreError InsertGenresCommandResponse)
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastLowRank GenreError
AccessUnauthorizedError (Free f (Either GenreError InsertGenresCommandResponse)
 -> Free f (Either GenreError InsertGenresCommandResponse))
-> Free f (Either GenreError InsertGenresCommandResponse)
-> Free f (Either GenreError InsertGenresCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
    [Genre]
newGenres <- (InsertGenresRequestItem -> Free f Genre)
-> [InsertGenresRequestItem] -> Free f [Genre]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (UUID -> InsertGenresRequestItem -> Free f Genre
forall (f :: * -> *).
(GenreCommand :<: f) =>
UUID -> InsertGenresRequestItem -> Free f Genre
newGenreFromRequest (WikiMusicUser
authUser WikiMusicUser -> Optic' A_Lens NoIx WikiMusicUser UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx WikiMusicUser UUID
#identifier)) (InsertGenresRequest
request InsertGenresRequest
-> Optic' An_Iso NoIx InsertGenresRequest [InsertGenresRequestItem]
-> [InsertGenresRequestItem]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' An_Iso NoIx InsertGenresRequest [InsertGenresRequestItem]
#genres)

    let entityValidation :: Genre -> (Text, Validation [Text])
entityValidation Genre
x = (Genre
x Genre -> Optic' A_Lens NoIx Genre Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre Text
#displayName, Genre -> Validation [Text]
validateGenre Genre
x)
        validationResults :: Map Text (Validation [Text])
validationResults = [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall l. IsList l => [Item l] -> l
fromList ([Item (Map Text (Validation [Text]))]
 -> Map Text (Validation [Text]))
-> [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall a b. (a -> b) -> a -> b
$ (Genre -> (Text, Validation [Text]))
-> [Genre] -> [(Text, Validation [Text])]
forall a b. (a -> b) -> [a] -> [b]
map Genre -> (Text, Validation [Text])
entityValidation [Genre]
newGenres
        newGenreIdentifiers :: [UUID]
newGenreIdentifiers = (Genre -> UUID) -> [Genre] -> [UUID]
forall a b. (a -> b) -> [a] -> [b]
map (Genre -> Optic' A_Lens NoIx Genre UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre UUID
#identifier) [Genre]
newGenres

    Map Text (Validation [Text])
-> Free f (Either GenreError InsertGenresCommandResponse)
-> Free f (Either GenreError InsertGenresCommandResponse)
forall (f :: * -> *) b.
Applicative f =>
Map Text (Validation [Text])
-> f (Either GenreError b) -> f (Either GenreError b)
ifAllValid Map Text (Validation [Text])
validationResults (Free f (Either GenreError InsertGenresCommandResponse)
 -> Free f (Either GenreError InsertGenresCommandResponse))
-> Free f (Either GenreError InsertGenresCommandResponse)
-> Free f (Either GenreError InsertGenresCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
      Map UUID Genre
_ <- Env -> [Genre] -> Free f (Map UUID Genre)
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [Genre] -> Free f (Map UUID Genre)
insertGenres Env
env [Genre]
newGenres
      (Map UUID Genre
genreMap, [UUID]
sortOrder) <- Env -> GenreSortOrder -> [UUID] -> Free f (Map UUID Genre, [UUID])
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env -> GenreSortOrder -> [UUID] -> Free f (Map UUID Genre, [UUID])
fetchGenresByUUID Env
env GenreSortOrder
DescCreatedAt [UUID]
newGenreIdentifiers
      Map UUID Genre
enrichedInsertedGenres <- Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env
-> Map UUID Genre -> EnrichGenreParams -> Free f (Map UUID Genre)
enrichedGenreResponse Env
env Map UUID Genre
genreMap EnrichGenreParams
fullEnrichment
      Either GenreError InsertGenresCommandResponse
-> Free f (Either GenreError InsertGenresCommandResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
        (Either GenreError InsertGenresCommandResponse
 -> Free f (Either GenreError InsertGenresCommandResponse))
-> (InsertGenresCommandResponse
    -> Either GenreError InsertGenresCommandResponse)
-> InsertGenresCommandResponse
-> Free f (Either GenreError InsertGenresCommandResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InsertGenresCommandResponse
-> Either GenreError InsertGenresCommandResponse
forall a b. b -> Either a b
Right
        (InsertGenresCommandResponse
 -> Free f (Either GenreError InsertGenresCommandResponse))
-> InsertGenresCommandResponse
-> Free f (Either GenreError InsertGenresCommandResponse)
forall a b. (a -> b) -> a -> b
$ InsertGenresQueryResponse
          { $sel:genres:InsertGenresQueryResponse :: Map UUID Genre
genres = Map UUID Genre
enrichedInsertedGenres,
            $sel:sortOrder:InsertGenresQueryResponse :: [UUID]
sortOrder = [UUID]
sortOrder,
            $sel:validationResults:InsertGenresQueryResponse :: Map Text (Validation [Text])
validationResults = Map Text (Validation [Text])
validationResults
          }

insertGenreCommentsAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  InsertGenreCommentsRequest ->
  Free f (Either GenreError InsertGenreCommentsCommandResponse)
insertGenreCommentsAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env
-> WikiMusicUser
-> InsertGenreCommentsRequest
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
insertGenreCommentsAction Env
env WikiMusicUser
authUser InsertGenreCommentsRequest
request =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastDemo GenreError
AccessUnauthorizedError (Free f (Either GenreError InsertGenreCommentsCommandResponse)
 -> Free f (Either GenreError InsertGenreCommentsCommandResponse))
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
    [GenreComment]
newComments <- (InsertGenreCommentsRequestItem -> Free f GenreComment)
-> [InsertGenreCommentsRequestItem] -> Free f [GenreComment]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (UUID -> InsertGenreCommentsRequestItem -> Free f GenreComment
forall (f :: * -> *).
(GenreCommand :<: f) =>
UUID -> InsertGenreCommentsRequestItem -> Free f GenreComment
newGenreCommentFromRequest (WikiMusicUser
authUser WikiMusicUser -> Optic' A_Lens NoIx WikiMusicUser UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx WikiMusicUser UUID
#identifier)) (InsertGenreCommentsRequest
request InsertGenreCommentsRequest
-> Optic'
     An_Iso
     NoIx
     InsertGenreCommentsRequest
     [InsertGenreCommentsRequestItem]
-> [InsertGenreCommentsRequestItem]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic'
  An_Iso
  NoIx
  InsertGenreCommentsRequest
  [InsertGenreCommentsRequestItem]
#genreComments)

    let entityValidation :: GenreComment -> (Text, Validation [Text])
entityValidation GenreComment
x = (Int -> Text -> Text
Data.Text.take Int
20 (GenreComment
x GenreComment -> Optic' A_Lens NoIx GenreComment Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic A_Lens NoIx GenreComment GenreComment Comment Comment
#comment Optic A_Lens NoIx GenreComment GenreComment Comment Comment
-> Optic A_Lens NoIx Comment Comment Text Text
-> Optic' A_Lens NoIx GenreComment Text
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens NoIx Comment Comment Text Text
#contents), GenreComment -> Validation [Text]
validateGenreComment GenreComment
x)
        validationResults :: Map Text (Validation [Text])
validationResults = [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall l. IsList l => [Item l] -> l
fromList ([Item (Map Text (Validation [Text]))]
 -> Map Text (Validation [Text]))
-> [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall a b. (a -> b) -> a -> b
$ (GenreComment -> (Text, Validation [Text]))
-> [GenreComment] -> [(Text, Validation [Text])]
forall a b. (a -> b) -> [a] -> [b]
map GenreComment -> (Text, Validation [Text])
entityValidation [GenreComment]
newComments

    Map Text (Validation [Text])
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
forall (f :: * -> *) b.
Applicative f =>
Map Text (Validation [Text])
-> f (Either GenreError b) -> f (Either GenreError b)
ifAllValid Map Text (Validation [Text])
validationResults (Free f (Either GenreError InsertGenreCommentsCommandResponse)
 -> Free f (Either GenreError InsertGenreCommentsCommandResponse))
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
      Map UUID GenreComment
insertedComments <- Env -> [GenreComment] -> Free f (Map UUID GenreComment)
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [GenreComment] -> Free f (Map UUID GenreComment)
insertGenreComments Env
env [GenreComment]
newComments
      Either GenreError InsertGenreCommentsCommandResponse
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
        (Either GenreError InsertGenreCommentsCommandResponse
 -> Free f (Either GenreError InsertGenreCommentsCommandResponse))
-> (InsertGenreCommentsCommandResponse
    -> Either GenreError InsertGenreCommentsCommandResponse)
-> InsertGenreCommentsCommandResponse
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InsertGenreCommentsCommandResponse
-> Either GenreError InsertGenreCommentsCommandResponse
forall a b. b -> Either a b
Right
        (InsertGenreCommentsCommandResponse
 -> Free f (Either GenreError InsertGenreCommentsCommandResponse))
-> InsertGenreCommentsCommandResponse
-> Free f (Either GenreError InsertGenreCommentsCommandResponse)
forall a b. (a -> b) -> a -> b
$ InsertGenreCommentsCommandResponse
          { $sel:genreComments:InsertGenreCommentsCommandResponse :: Map UUID GenreComment
genreComments = Map UUID GenreComment
insertedComments,
            $sel:validationResults:InsertGenreCommentsCommandResponse :: Map Text (Validation [Text])
validationResults = Map Text (Validation [Text])
validationResults
          }

upsertGenreOpinionsAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  UpsertGenreOpinionsRequest ->
  Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
upsertGenreOpinionsAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env
-> WikiMusicUser
-> UpsertGenreOpinionsRequest
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
upsertGenreOpinionsAction Env
env WikiMusicUser
authUser UpsertGenreOpinionsRequest
request =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastDemo GenreError
AccessUnauthorizedError (Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
 -> Free f (Either GenreError UpsertGenreOpinionsCommandResponse))
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
    [GenreOpinion]
newOpinions <- (UpsertGenreOpinionsRequestItem -> Free f GenreOpinion)
-> [UpsertGenreOpinionsRequestItem] -> Free f [GenreOpinion]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (UUID -> UpsertGenreOpinionsRequestItem -> Free f GenreOpinion
forall (f :: * -> *).
(GenreCommand :<: f) =>
UUID -> UpsertGenreOpinionsRequestItem -> Free f GenreOpinion
newGenreOpinionFromRequest (WikiMusicUser
authUser WikiMusicUser -> Optic' A_Lens NoIx WikiMusicUser UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx WikiMusicUser UUID
#identifier)) (UpsertGenreOpinionsRequest
request UpsertGenreOpinionsRequest
-> Optic'
     An_Iso
     NoIx
     UpsertGenreOpinionsRequest
     [UpsertGenreOpinionsRequestItem]
-> [UpsertGenreOpinionsRequestItem]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic'
  An_Iso
  NoIx
  UpsertGenreOpinionsRequest
  [UpsertGenreOpinionsRequestItem]
#genreOpinions)

    let entityValidation :: GenreOpinion -> (UUID, Validation [Text])
entityValidation GenreOpinion
x = (GenreOpinion
x GenreOpinion -> Optic' A_Lens NoIx GenreOpinion UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GenreOpinion UUID
#genreIdentifier, GenreOpinion -> Validation [Text]
validateGenreOpinion GenreOpinion
x)
        validationResults :: Map Text (Validation [Text])
validationResults = [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall l. IsList l => [Item l] -> l
fromList ([Item (Map Text (Validation [Text]))]
 -> Map Text (Validation [Text]))
-> [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall a b. (a -> b) -> a -> b
$ (GenreOpinion -> (Text, Validation [Text]))
-> [GenreOpinion] -> [(Text, Validation [Text])]
forall a b. (a -> b) -> [a] -> [b]
map ((UUID -> Text)
-> (UUID, Validation [Text]) -> (Text, Validation [Text])
forall a b c. (a -> b) -> (a, c) -> (b, c)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (String -> Text
pack (String -> Text) -> (UUID -> String) -> UUID -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) ((UUID, Validation [Text]) -> (Text, Validation [Text]))
-> (GenreOpinion -> (UUID, Validation [Text]))
-> GenreOpinion
-> (Text, Validation [Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreOpinion -> (UUID, Validation [Text])
entityValidation) [GenreOpinion]
newOpinions

    Map Text (Validation [Text])
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
forall (f :: * -> *) b.
Applicative f =>
Map Text (Validation [Text])
-> f (Either GenreError b) -> f (Either GenreError b)
ifAllValid Map Text (Validation [Text])
validationResults (Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
 -> Free f (Either GenreError UpsertGenreOpinionsCommandResponse))
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
      Map UUID GenreOpinion
upsertedOpinions <- Env -> [GenreOpinion] -> Free f (Map UUID GenreOpinion)
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [GenreOpinion] -> Free f (Map UUID GenreOpinion)
upsertGenreOpinions Env
env [GenreOpinion]
newOpinions
      Either GenreError UpsertGenreOpinionsCommandResponse
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
        (Either GenreError UpsertGenreOpinionsCommandResponse
 -> Free f (Either GenreError UpsertGenreOpinionsCommandResponse))
-> (UpsertGenreOpinionsCommandResponse
    -> Either GenreError UpsertGenreOpinionsCommandResponse)
-> UpsertGenreOpinionsCommandResponse
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UpsertGenreOpinionsCommandResponse
-> Either GenreError UpsertGenreOpinionsCommandResponse
forall a b. b -> Either a b
Right
        (UpsertGenreOpinionsCommandResponse
 -> Free f (Either GenreError UpsertGenreOpinionsCommandResponse))
-> UpsertGenreOpinionsCommandResponse
-> Free f (Either GenreError UpsertGenreOpinionsCommandResponse)
forall a b. (a -> b) -> a -> b
$ UpsertGenreOpinionsCommandResponse
          { $sel:genreOpinions:UpsertGenreOpinionsCommandResponse :: Map UUID GenreOpinion
genreOpinions = Map UUID GenreOpinion
upsertedOpinions,
            $sel:validationResults:UpsertGenreOpinionsCommandResponse :: Map Text (Validation [Text])
validationResults = Map Text (Validation [Text])
validationResults
          }

insertGenreArtworksAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  InsertGenreArtworksRequest ->
  Free f (Either GenreError InsertGenreArtworksCommandResponse)
insertGenreArtworksAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env
-> WikiMusicUser
-> InsertGenreArtworksRequest
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
insertGenreArtworksAction Env
env WikiMusicUser
authUser InsertGenreArtworksRequest
request =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastLowRank GenreError
AccessUnauthorizedError (Free f (Either GenreError InsertGenreArtworksCommandResponse)
 -> Free f (Either GenreError InsertGenreArtworksCommandResponse))
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
    [GenreArtwork]
newArtworks <- (InsertGenreArtworksRequestItem -> Free f GenreArtwork)
-> [InsertGenreArtworksRequestItem] -> Free f [GenreArtwork]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (UUID -> InsertGenreArtworksRequestItem -> Free f GenreArtwork
forall (f :: * -> *).
(GenreCommand :<: f) =>
UUID -> InsertGenreArtworksRequestItem -> Free f GenreArtwork
newGenreArtworkFromRequest (WikiMusicUser
authUser WikiMusicUser -> Optic' A_Lens NoIx WikiMusicUser UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx WikiMusicUser UUID
#identifier)) (InsertGenreArtworksRequest
request InsertGenreArtworksRequest
-> Optic'
     An_Iso
     NoIx
     InsertGenreArtworksRequest
     [InsertGenreArtworksRequestItem]
-> [InsertGenreArtworksRequestItem]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic'
  An_Iso
  NoIx
  InsertGenreArtworksRequest
  [InsertGenreArtworksRequestItem]
#genreArtworks)

    let entityValidation :: GenreArtwork -> (UUID, Validation [Text])
entityValidation GenreArtwork
x = (GenreArtwork
x GenreArtwork -> Optic' A_Lens NoIx GenreArtwork UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GenreArtwork UUID
#genreIdentifier, GenreArtwork -> Validation [Text]
validateGenreArtwork GenreArtwork
x)
        validationResults :: Map Text (Validation [Text])
validationResults = [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall l. IsList l => [Item l] -> l
fromList ([Item (Map Text (Validation [Text]))]
 -> Map Text (Validation [Text]))
-> [Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall a b. (a -> b) -> a -> b
$ (GenreArtwork -> (Text, Validation [Text]))
-> [GenreArtwork] -> [(Text, Validation [Text])]
forall a b. (a -> b) -> [a] -> [b]
map ((UUID -> Text)
-> (UUID, Validation [Text]) -> (Text, Validation [Text])
forall a b c. (a -> b) -> (a, c) -> (b, c)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (String -> Text
pack (String -> Text) -> (UUID -> String) -> UUID -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) ((UUID, Validation [Text]) -> (Text, Validation [Text]))
-> (GenreArtwork -> (UUID, Validation [Text]))
-> GenreArtwork
-> (Text, Validation [Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreArtwork -> (UUID, Validation [Text])
entityValidation) [GenreArtwork]
newArtworks

    Map Text (Validation [Text])
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
forall (f :: * -> *) b.
Applicative f =>
Map Text (Validation [Text])
-> f (Either GenreError b) -> f (Either GenreError b)
ifAllValid Map Text (Validation [Text])
validationResults (Free f (Either GenreError InsertGenreArtworksCommandResponse)
 -> Free f (Either GenreError InsertGenreArtworksCommandResponse))
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
forall a b. (a -> b) -> a -> b
$ do
      Map UUID GenreArtwork
insertedArtworks <- Env -> [GenreArtwork] -> Free f (Map UUID GenreArtwork)
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [GenreArtwork] -> Free f (Map UUID GenreArtwork)
insertGenreArtworks Env
env [GenreArtwork]
newArtworks
      Either GenreError InsertGenreArtworksCommandResponse
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
        (Either GenreError InsertGenreArtworksCommandResponse
 -> Free f (Either GenreError InsertGenreArtworksCommandResponse))
-> (InsertGenreArtworksCommandResponse
    -> Either GenreError InsertGenreArtworksCommandResponse)
-> InsertGenreArtworksCommandResponse
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InsertGenreArtworksCommandResponse
-> Either GenreError InsertGenreArtworksCommandResponse
forall a b. b -> Either a b
Right
        (InsertGenreArtworksCommandResponse
 -> Free f (Either GenreError InsertGenreArtworksCommandResponse))
-> InsertGenreArtworksCommandResponse
-> Free f (Either GenreError InsertGenreArtworksCommandResponse)
forall a b. (a -> b) -> a -> b
$ InsertGenreArtworksCommandResponse
          { $sel:genreArtworks:InsertGenreArtworksCommandResponse :: Map UUID GenreArtwork
genreArtworks = Map UUID GenreArtwork
insertedArtworks,
            $sel:validationResults:InsertGenreArtworksCommandResponse :: Map Text (Validation [Text])
validationResults = Map Text (Validation [Text])
validationResults
          }

deleteGenresByIdentifierAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  UUID ->
  Free f (Either GenreError ())
deleteGenresByIdentifierAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> WikiMusicUser -> UUID -> Free f (Either GenreError ())
deleteGenresByIdentifierAction Env
env WikiMusicUser
authUser UUID
identifier =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError ())
-> Free f (Either GenreError ())
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastMaintainer GenreError
AccessUnauthorizedError (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
    Either GenreCommandError ()
operationResults <- Env -> [UUID] -> Free f (Either GenreCommandError ())
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [UUID] -> Free f (Either GenreCommandError ())
deleteGenres Env
env [UUID
identifier]
    Either GenreError () -> Free f (Either GenreError ())
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError () -> Free f (Either GenreError ()))
-> (Either GenreError () -> Either GenreError ())
-> Either GenreError ()
-> Free f (Either GenreError ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either GenreError () -> Either GenreError ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Either GenreError () -> Free f (Either GenreError ()))
-> Either GenreError () -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ (GenreCommandError -> GenreError)
-> Either GenreCommandError () -> Either GenreError ()
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (Text -> GenreError
SomeError (Text -> GenreError)
-> (GenreCommandError -> Text) -> GenreCommandError -> GenreError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack (String -> Text)
-> (GenreCommandError -> String) -> GenreCommandError -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreCommandError -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) Either GenreCommandError ()
operationResults

deleteGenreCommentsByIdentifierAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  UUID ->
  Free f (Either GenreError ())
deleteGenreCommentsByIdentifierAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> WikiMusicUser -> UUID -> Free f (Either GenreError ())
deleteGenreCommentsByIdentifierAction Env
env WikiMusicUser
authUser UUID
identifier =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError ())
-> Free f (Either GenreError ())
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastMaintainer GenreError
AccessUnauthorizedError (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
    Either GenreCommandError ()
operationResults <- Env -> [UUID] -> Free f (Either GenreCommandError ())
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [UUID] -> Free f (Either GenreCommandError ())
deleteGenreComments Env
env [UUID
identifier]
    Either GenreError () -> Free f (Either GenreError ())
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError () -> Free f (Either GenreError ()))
-> (Either GenreError () -> Either GenreError ())
-> Either GenreError ()
-> Free f (Either GenreError ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either GenreError () -> Either GenreError ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Either GenreError () -> Free f (Either GenreError ()))
-> Either GenreError () -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ (GenreCommandError -> GenreError)
-> Either GenreCommandError () -> Either GenreError ()
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (Text -> GenreError
SomeError (Text -> GenreError)
-> (GenreCommandError -> Text) -> GenreCommandError -> GenreError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack (String -> Text)
-> (GenreCommandError -> String) -> GenreCommandError -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreCommandError -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) Either GenreCommandError ()
operationResults

deleteGenreOpinionsByIdentifierAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  UUID ->
  Free f (Either GenreError ())
deleteGenreOpinionsByIdentifierAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> WikiMusicUser -> UUID -> Free f (Either GenreError ())
deleteGenreOpinionsByIdentifierAction Env
env WikiMusicUser
authUser UUID
identifier =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError ())
-> Free f (Either GenreError ())
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastMaintainer GenreError
AccessUnauthorizedError (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
    Either GenreCommandError ()
operationResults <- Env -> [UUID] -> Free f (Either GenreCommandError ())
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [UUID] -> Free f (Either GenreCommandError ())
deleteGenreOpinions Env
env [UUID
identifier]
    Either GenreError () -> Free f (Either GenreError ())
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError () -> Free f (Either GenreError ()))
-> (Either GenreError () -> Either GenreError ())
-> Either GenreError ()
-> Free f (Either GenreError ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either GenreError () -> Either GenreError ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Either GenreError () -> Free f (Either GenreError ()))
-> Either GenreError () -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ (GenreCommandError -> GenreError)
-> Either GenreCommandError () -> Either GenreError ()
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (Text -> GenreError
SomeError (Text -> GenreError)
-> (GenreCommandError -> Text) -> GenreCommandError -> GenreError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack (String -> Text)
-> (GenreCommandError -> String) -> GenreCommandError -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreCommandError -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) Either GenreCommandError ()
operationResults

deleteGenreArtworksByIdentifierAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  UUID ->
  Free f (Either GenreError ())
deleteGenreArtworksByIdentifierAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> WikiMusicUser -> UUID -> Free f (Either GenreError ())
deleteGenreArtworksByIdentifierAction Env
env WikiMusicUser
authUser UUID
identifier =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError ())
-> Free f (Either GenreError ())
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastMaintainer GenreError
AccessUnauthorizedError (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
    Either GenreCommandError ()
operationResults <- Env -> [UUID] -> Free f (Either GenreCommandError ())
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [UUID] -> Free f (Either GenreCommandError ())
deleteGenreArtworks Env
env [UUID
identifier]
    Either GenreError () -> Free f (Either GenreError ())
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError () -> Free f (Either GenreError ()))
-> (Either GenreError () -> Either GenreError ())
-> Either GenreError ()
-> Free f (Either GenreError ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either GenreError () -> Either GenreError ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Either GenreError () -> Free f (Either GenreError ()))
-> Either GenreError () -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ (GenreCommandError -> GenreError)
-> Either GenreCommandError () -> Either GenreError ()
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (Text -> GenreError
SomeError (Text -> GenreError)
-> (GenreCommandError -> Text) -> GenreCommandError -> GenreError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack (String -> Text)
-> (GenreCommandError -> String) -> GenreCommandError -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreCommandError -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) Either GenreCommandError ()
operationResults

updateGenreArtworksOrderAction ::
  (GenreCommand :<: f) =>
  Env ->
  WikiMusicUser ->
  GenreArtworkOrderUpdateRequest ->
  Free f (Either GenreError ())
updateGenreArtworksOrderAction :: forall (f :: * -> *).
(GenreCommand :<: f) =>
Env
-> WikiMusicUser
-> GenreArtworkOrderUpdateRequest
-> Free f (Either GenreError ())
updateGenreArtworksOrderAction Env
env WikiMusicUser
authUser GenreArtworkOrderUpdateRequest
request =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError ())
-> Free f (Either GenreError ())
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastLowRank GenreError
AccessUnauthorizedError (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
    let genreArtworkOrderUpdates :: [GenreArtworkOrderUpdate]
genreArtworkOrderUpdates = GenreArtworkOrderUpdateRequest
request GenreArtworkOrderUpdateRequest
-> Optic'
     An_Iso
     NoIx
     GenreArtworkOrderUpdateRequest
     [GenreArtworkOrderUpdate]
-> [GenreArtworkOrderUpdate]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic'
  An_Iso
  NoIx
  GenreArtworkOrderUpdateRequest
  [GenreArtworkOrderUpdate]
#genreArtworkOrders
        entityValidation :: GenreArtworkOrderUpdate -> (UUID, Validation [Text])
entityValidation GenreArtworkOrderUpdate
x = (GenreArtworkOrderUpdate
x GenreArtworkOrderUpdate
-> Optic' A_Lens NoIx GenreArtworkOrderUpdate UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GenreArtworkOrderUpdate UUID
#identifier, GenreArtworkOrderUpdate -> Validation [Text]
validateGenreArtworkOrderUpdate GenreArtworkOrderUpdate
x)
        validationResults :: Map Text (Validation [Text])
validationResults = [(Text, Validation [Text])] -> Map Text (Validation [Text])
[Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall l. IsList l => [Item l] -> l
fromList ([(Text, Validation [Text])] -> Map Text (Validation [Text]))
-> ([GenreArtworkOrderUpdate] -> [(Text, Validation [Text])])
-> [GenreArtworkOrderUpdate]
-> Map Text (Validation [Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenreArtworkOrderUpdate -> (Text, Validation [Text]))
-> [GenreArtworkOrderUpdate] -> [(Text, Validation [Text])]
forall a b. (a -> b) -> [a] -> [b]
map ((UUID -> Text)
-> (UUID, Validation [Text]) -> (Text, Validation [Text])
forall a b c. (a -> b) -> (a, c) -> (b, c)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (String -> Text
pack (String -> Text) -> (UUID -> String) -> UUID -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) ((UUID, Validation [Text]) -> (Text, Validation [Text]))
-> (GenreArtworkOrderUpdate -> (UUID, Validation [Text]))
-> GenreArtworkOrderUpdate
-> (Text, Validation [Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreArtworkOrderUpdate -> (UUID, Validation [Text])
entityValidation) ([GenreArtworkOrderUpdate] -> Map Text (Validation [Text]))
-> [GenreArtworkOrderUpdate] -> Map Text (Validation [Text])
forall a b. (a -> b) -> a -> b
$ [GenreArtworkOrderUpdate]
genreArtworkOrderUpdates

    Map Text (Validation [Text])
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall (f :: * -> *) b.
Applicative f =>
Map Text (Validation [Text])
-> f (Either GenreError b) -> f (Either GenreError b)
ifAllValid Map Text (Validation [Text])
validationResults (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
      Either Text ()
operationResults <- Env -> [GenreArtworkOrderUpdate] -> Free f (Either Text ())
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env -> [GenreArtworkOrderUpdate] -> Free f (Either Text ())
updateGenreArtworkOrder Env
env [GenreArtworkOrderUpdate]
genreArtworkOrderUpdates
      Either GenreError () -> Free f (Either GenreError ())
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError () -> Free f (Either GenreError ()))
-> (Either GenreError () -> Either GenreError ())
-> Either GenreError ()
-> Free f (Either GenreError ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either GenreError () -> Either GenreError ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Either GenreError () -> Free f (Either GenreError ()))
-> Either GenreError () -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ (Text -> GenreError) -> Either Text () -> Either GenreError ()
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first Text -> GenreError
SomeError Either Text ()
operationResults

updateGenreAction ::
  (GenreCommand :<: f, GenreQuery :<: f) =>
  Env ->
  WikiMusicUser ->
  GenreDeltaRequest ->
  Free f (Either GenreError ())
updateGenreAction :: forall (f :: * -> *).
(GenreCommand :<: f, GenreQuery :<: f) =>
Env
-> WikiMusicUser
-> GenreDeltaRequest
-> Free f (Either GenreError ())
updateGenreAction Env
env WikiMusicUser
authUser GenreDeltaRequest
request =
  WikiMusicUser
-> ([UserRole] -> Bool)
-> GenreError
-> Free f (Either GenreError ())
-> Free f (Either GenreError ())
forall (f :: * -> *) p b.
Applicative f =>
WikiMusicUser
-> ([UserRole] -> Bool) -> p -> f (Either p b) -> f (Either p b)
doWithRoles' WikiMusicUser
authUser [UserRole] -> Bool
isAtLeastLowRank GenreError
AccessUnauthorizedError (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
    let δ :: [GenreDelta]
δ = GenreDeltaRequest
request GenreDeltaRequest
-> Optic' An_Iso NoIx GenreDeltaRequest [GenreDelta]
-> [GenreDelta]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' An_Iso NoIx GenreDeltaRequest [GenreDelta]
#genreDeltas
        entityValidation :: GenreDelta -> (UUID, Validation [Text])
entityValidation GenreDelta
x = (GenreDelta
x GenreDelta -> Optic' A_Lens NoIx GenreDelta UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GenreDelta UUID
#identifier, GenreDelta -> Validation [Text]
validateGenreDelta GenreDelta
x)
        validationResults :: Map Text (Validation [Text])
validationResults = [(Text, Validation [Text])] -> Map Text (Validation [Text])
[Item (Map Text (Validation [Text]))]
-> Map Text (Validation [Text])
forall l. IsList l => [Item l] -> l
fromList ([(Text, Validation [Text])] -> Map Text (Validation [Text]))
-> ([GenreDelta] -> [(Text, Validation [Text])])
-> [GenreDelta]
-> Map Text (Validation [Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenreDelta -> (Text, Validation [Text]))
-> [GenreDelta] -> [(Text, Validation [Text])]
forall a b. (a -> b) -> [a] -> [b]
map ((UUID -> Text)
-> (UUID, Validation [Text]) -> (Text, Validation [Text])
forall a b c. (a -> b) -> (a, c) -> (b, c)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (String -> Text
pack (String -> Text) -> (UUID -> String) -> UUID -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> String
forall b a. (Show a, IsString b) => a -> b
Relude.show) ((UUID, Validation [Text]) -> (Text, Validation [Text]))
-> (GenreDelta -> (UUID, Validation [Text]))
-> GenreDelta
-> (Text, Validation [Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenreDelta -> (UUID, Validation [Text])
entityValidation) ([GenreDelta] -> Map Text (Validation [Text]))
-> [GenreDelta] -> Map Text (Validation [Text])
forall a b. (a -> b) -> a -> b
$ [GenreDelta]
δ

    Map Text (Validation [Text])
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall (f :: * -> *) b.
Applicative f =>
Map Text (Validation [Text])
-> f (Either GenreError b) -> f (Either GenreError b)
ifAllValid Map Text (Validation [Text])
validationResults (Free f (Either GenreError ()) -> Free f (Either GenreError ()))
-> Free f (Either GenreError ()) -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ do
      let genreIds :: [UUID]
genreIds = (GenreDelta -> UUID) -> [GenreDelta] -> [UUID]
forall a b. (a -> b) -> [a] -> [b]
map (GenreDelta -> Optic' A_Lens NoIx GenreDelta UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GenreDelta UUID
#identifier) [GenreDelta]
δ
          deltaMap :: Map UUID GenreDelta
deltaMap = [Item (Map UUID GenreDelta)] -> Map UUID GenreDelta
forall l. IsList l => [Item l] -> l
fromList ([Item (Map UUID GenreDelta)] -> Map UUID GenreDelta)
-> [Item (Map UUID GenreDelta)] -> Map UUID GenreDelta
forall a b. (a -> b) -> a -> b
$ (GenreDelta -> (UUID, GenreDelta))
-> [GenreDelta] -> [(UUID, GenreDelta)]
forall a b. (a -> b) -> [a] -> [b]
map (\GenreDelta
x -> (GenreDelta
x GenreDelta -> Optic' A_Lens NoIx GenreDelta UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GenreDelta UUID
#identifier, GenreDelta
x)) [GenreDelta]
δ

      Map UUID Genre
genreRecords <- (Map UUID Genre, [UUID]) -> Map UUID Genre
forall a b. (a, b) -> a
fst ((Map UUID Genre, [UUID]) -> Map UUID Genre)
-> Free f (Map UUID Genre, [UUID]) -> Free f (Map UUID Genre)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Env -> GenreSortOrder -> [UUID] -> Free f (Map UUID Genre, [UUID])
forall (f :: * -> *).
(GenreQuery :<: f) =>
Env -> GenreSortOrder -> [UUID] -> Free f (Map UUID Genre, [UUID])
fetchGenresByUUID Env
env GenreSortOrder
DescCreatedAt [UUID]
genreIds

      let genreRecordAndDeltaPairMap :: Map UUID (Genre, Maybe GenreDelta)
genreRecordAndDeltaPairMap = (UUID -> Genre -> (Genre, Maybe GenreDelta))
-> Map UUID Genre -> Map UUID (Genre, Maybe GenreDelta)
forall k a b. (k -> a -> b) -> Map k a -> Map k b
Map.mapWithKey (\UUID
k Genre
v -> (Genre
v, Map UUID GenreDelta
deltaMap Map UUID GenreDelta -> UUID -> Maybe GenreDelta
forall k a. Ord k => Map k a -> k -> Maybe a
Map.!? UUID
k)) Map UUID Genre
genreRecords

      Either Text ()
operationResults <- Env
-> Map UUID (Genre, Maybe GenreDelta) -> Free f (Either Text ())
forall (f :: * -> *).
(GenreCommand :<: f) =>
Env
-> Map UUID (Genre, Maybe GenreDelta) -> Free f (Either Text ())
updateGenres Env
env Map UUID (Genre, Maybe GenreDelta)
genreRecordAndDeltaPairMap
      Either GenreError () -> Free f (Either GenreError ())
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either GenreError () -> Free f (Either GenreError ()))
-> (Either GenreError () -> Either GenreError ())
-> Either GenreError ()
-> Free f (Either GenreError ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either GenreError () -> Either GenreError ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Either GenreError () -> Free f (Either GenreError ()))
-> Either GenreError () -> Free f (Either GenreError ())
forall a b. (a -> b) -> a -> b
$ (Text -> GenreError) -> Either Text () -> Either GenreError ()
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first Text -> GenreError
SomeError Either Text ()
operationResults