{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.ElastiCache.CreateUserGroup
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- For Redis engine version 6.0 onwards: Creates a Redis user group. For
-- more information, see
-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Clusters.RBAC.html Using Role Based Access Control (RBAC)>
module Amazonka.ElastiCache.CreateUserGroup
  ( -- * Creating a Request
    CreateUserGroup (..),
    newCreateUserGroup,

    -- * Request Lenses
    createUserGroup_tags,
    createUserGroup_userIds,
    createUserGroup_userGroupId,
    createUserGroup_engine,

    -- * Destructuring the Response
    UserGroup (..),
    newUserGroup,

    -- * Response Lenses
    userGroup_arn,
    userGroup_engine,
    userGroup_minimumEngineVersion,
    userGroup_pendingChanges,
    userGroup_replicationGroups,
    userGroup_status,
    userGroup_userGroupId,
    userGroup_userIds,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.ElastiCache.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newCreateUserGroup' smart constructor.
data CreateUserGroup = CreateUserGroup'
  { -- | A list of tags to be added to this resource. A tag is a key-value pair.
    -- A tag key must be accompanied by a tag value, although null is accepted.
    CreateUserGroup -> Maybe [Tag]
tags :: Prelude.Maybe [Tag],
    -- | The list of user IDs that belong to the user group.
    CreateUserGroup -> Maybe (NonEmpty Text)
userIds :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
    -- | The ID of the user group.
    CreateUserGroup -> Text
userGroupId :: Prelude.Text,
    -- | The current supported value is Redis.
    CreateUserGroup -> Text
engine :: Prelude.Text
  }
  deriving (CreateUserGroup -> CreateUserGroup -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateUserGroup -> CreateUserGroup -> Bool
$c/= :: CreateUserGroup -> CreateUserGroup -> Bool
== :: CreateUserGroup -> CreateUserGroup -> Bool
$c== :: CreateUserGroup -> CreateUserGroup -> Bool
Prelude.Eq, ReadPrec [CreateUserGroup]
ReadPrec CreateUserGroup
Int -> ReadS CreateUserGroup
ReadS [CreateUserGroup]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateUserGroup]
$creadListPrec :: ReadPrec [CreateUserGroup]
readPrec :: ReadPrec CreateUserGroup
$creadPrec :: ReadPrec CreateUserGroup
readList :: ReadS [CreateUserGroup]
$creadList :: ReadS [CreateUserGroup]
readsPrec :: Int -> ReadS CreateUserGroup
$creadsPrec :: Int -> ReadS CreateUserGroup
Prelude.Read, Int -> CreateUserGroup -> ShowS
[CreateUserGroup] -> ShowS
CreateUserGroup -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateUserGroup] -> ShowS
$cshowList :: [CreateUserGroup] -> ShowS
show :: CreateUserGroup -> String
$cshow :: CreateUserGroup -> String
showsPrec :: Int -> CreateUserGroup -> ShowS
$cshowsPrec :: Int -> CreateUserGroup -> ShowS
Prelude.Show, forall x. Rep CreateUserGroup x -> CreateUserGroup
forall x. CreateUserGroup -> Rep CreateUserGroup x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateUserGroup x -> CreateUserGroup
$cfrom :: forall x. CreateUserGroup -> Rep CreateUserGroup x
Prelude.Generic)

-- |
-- Create a value of 'CreateUserGroup' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'tags', 'createUserGroup_tags' - A list of tags to be added to this resource. A tag is a key-value pair.
-- A tag key must be accompanied by a tag value, although null is accepted.
--
-- 'userIds', 'createUserGroup_userIds' - The list of user IDs that belong to the user group.
--
-- 'userGroupId', 'createUserGroup_userGroupId' - The ID of the user group.
--
-- 'engine', 'createUserGroup_engine' - The current supported value is Redis.
newCreateUserGroup ::
  -- | 'userGroupId'
  Prelude.Text ->
  -- | 'engine'
  Prelude.Text ->
  CreateUserGroup
newCreateUserGroup :: Text -> Text -> CreateUserGroup
newCreateUserGroup Text
pUserGroupId_ Text
pEngine_ =
  CreateUserGroup'
    { $sel:tags:CreateUserGroup' :: Maybe [Tag]
tags = forall a. Maybe a
Prelude.Nothing,
      $sel:userIds:CreateUserGroup' :: Maybe (NonEmpty Text)
userIds = forall a. Maybe a
Prelude.Nothing,
      $sel:userGroupId:CreateUserGroup' :: Text
userGroupId = Text
pUserGroupId_,
      $sel:engine:CreateUserGroup' :: Text
engine = Text
pEngine_
    }

-- | A list of tags to be added to this resource. A tag is a key-value pair.
-- A tag key must be accompanied by a tag value, although null is accepted.
createUserGroup_tags :: Lens.Lens' CreateUserGroup (Prelude.Maybe [Tag])
createUserGroup_tags :: Lens' CreateUserGroup (Maybe [Tag])
createUserGroup_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateUserGroup' {Maybe [Tag]
tags :: Maybe [Tag]
$sel:tags:CreateUserGroup' :: CreateUserGroup -> Maybe [Tag]
tags} -> Maybe [Tag]
tags) (\s :: CreateUserGroup
s@CreateUserGroup' {} Maybe [Tag]
a -> CreateUserGroup
s {$sel:tags:CreateUserGroup' :: Maybe [Tag]
tags = Maybe [Tag]
a} :: CreateUserGroup) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The list of user IDs that belong to the user group.
createUserGroup_userIds :: Lens.Lens' CreateUserGroup (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
createUserGroup_userIds :: Lens' CreateUserGroup (Maybe (NonEmpty Text))
createUserGroup_userIds = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateUserGroup' {Maybe (NonEmpty Text)
userIds :: Maybe (NonEmpty Text)
$sel:userIds:CreateUserGroup' :: CreateUserGroup -> Maybe (NonEmpty Text)
userIds} -> Maybe (NonEmpty Text)
userIds) (\s :: CreateUserGroup
s@CreateUserGroup' {} Maybe (NonEmpty Text)
a -> CreateUserGroup
s {$sel:userIds:CreateUserGroup' :: Maybe (NonEmpty Text)
userIds = Maybe (NonEmpty Text)
a} :: CreateUserGroup) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The ID of the user group.
createUserGroup_userGroupId :: Lens.Lens' CreateUserGroup Prelude.Text
createUserGroup_userGroupId :: Lens' CreateUserGroup Text
createUserGroup_userGroupId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateUserGroup' {Text
userGroupId :: Text
$sel:userGroupId:CreateUserGroup' :: CreateUserGroup -> Text
userGroupId} -> Text
userGroupId) (\s :: CreateUserGroup
s@CreateUserGroup' {} Text
a -> CreateUserGroup
s {$sel:userGroupId:CreateUserGroup' :: Text
userGroupId = Text
a} :: CreateUserGroup)

-- | The current supported value is Redis.
createUserGroup_engine :: Lens.Lens' CreateUserGroup Prelude.Text
createUserGroup_engine :: Lens' CreateUserGroup Text
createUserGroup_engine = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateUserGroup' {Text
engine :: Text
$sel:engine:CreateUserGroup' :: CreateUserGroup -> Text
engine} -> Text
engine) (\s :: CreateUserGroup
s@CreateUserGroup' {} Text
a -> CreateUserGroup
s {$sel:engine:CreateUserGroup' :: Text
engine = Text
a} :: CreateUserGroup)

instance Core.AWSRequest CreateUserGroup where
  type AWSResponse CreateUserGroup = UserGroup
  request :: (Service -> Service) -> CreateUserGroup -> Request CreateUserGroup
request Service -> Service
overrides =
    forall a. ToRequest a => Service -> a -> Request a
Request.postQuery (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy CreateUserGroup
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateUserGroup)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
Text
-> (Int
    -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXMLWrapper
      Text
"CreateUserGroupResult"
      (\Int
s ResponseHeaders
h [Node]
x -> forall a. FromXML a => [Node] -> Either String a
Data.parseXML [Node]
x)

instance Prelude.Hashable CreateUserGroup where
  hashWithSalt :: Int -> CreateUserGroup -> Int
hashWithSalt Int
_salt CreateUserGroup' {Maybe [Tag]
Maybe (NonEmpty Text)
Text
engine :: Text
userGroupId :: Text
userIds :: Maybe (NonEmpty Text)
tags :: Maybe [Tag]
$sel:engine:CreateUserGroup' :: CreateUserGroup -> Text
$sel:userGroupId:CreateUserGroup' :: CreateUserGroup -> Text
$sel:userIds:CreateUserGroup' :: CreateUserGroup -> Maybe (NonEmpty Text)
$sel:tags:CreateUserGroup' :: CreateUserGroup -> Maybe [Tag]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [Tag]
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Text)
userIds
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
userGroupId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
engine

instance Prelude.NFData CreateUserGroup where
  rnf :: CreateUserGroup -> ()
rnf CreateUserGroup' {Maybe [Tag]
Maybe (NonEmpty Text)
Text
engine :: Text
userGroupId :: Text
userIds :: Maybe (NonEmpty Text)
tags :: Maybe [Tag]
$sel:engine:CreateUserGroup' :: CreateUserGroup -> Text
$sel:userGroupId:CreateUserGroup' :: CreateUserGroup -> Text
$sel:userIds:CreateUserGroup' :: CreateUserGroup -> Maybe (NonEmpty Text)
$sel:tags:CreateUserGroup' :: CreateUserGroup -> Maybe [Tag]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Tag]
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Text)
userIds
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
userGroupId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
engine

instance Data.ToHeaders CreateUserGroup where
  toHeaders :: CreateUserGroup -> ResponseHeaders
toHeaders = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

instance Data.ToPath CreateUserGroup where
  toPath :: CreateUserGroup -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery CreateUserGroup where
  toQuery :: CreateUserGroup -> QueryString
toQuery CreateUserGroup' {Maybe [Tag]
Maybe (NonEmpty Text)
Text
engine :: Text
userGroupId :: Text
userIds :: Maybe (NonEmpty Text)
tags :: Maybe [Tag]
$sel:engine:CreateUserGroup' :: CreateUserGroup -> Text
$sel:userGroupId:CreateUserGroup' :: CreateUserGroup -> Text
$sel:userIds:CreateUserGroup' :: CreateUserGroup -> Maybe (NonEmpty Text)
$sel:tags:CreateUserGroup' :: CreateUserGroup -> Maybe [Tag]
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"CreateUserGroup" :: Prelude.ByteString),
        ByteString
"Version"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2015-02-02" :: Prelude.ByteString),
        ByteString
"Tags"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: forall a. ToQuery a => a -> QueryString
Data.toQuery
            (forall a.
(IsList a, ToQuery (Item a)) =>
ByteString -> a -> QueryString
Data.toQueryList ByteString
"Tag" forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [Tag]
tags),
        ByteString
"UserIds"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: forall a. ToQuery a => a -> QueryString
Data.toQuery
            (forall a.
(IsList a, ToQuery (Item a)) =>
ByteString -> a -> QueryString
Data.toQueryList ByteString
"member" forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe (NonEmpty Text)
userIds),
        ByteString
"UserGroupId" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
userGroupId,
        ByteString
"Engine" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
engine
      ]