{-# 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.Lightsail.SetResourceAccessForBucket
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Sets the Amazon Lightsail resources that can access the specified
-- Lightsail bucket.
--
-- Lightsail buckets currently support setting access for Lightsail
-- instances in the same Amazon Web Services Region.
module Amazonka.Lightsail.SetResourceAccessForBucket
  ( -- * Creating a Request
    SetResourceAccessForBucket (..),
    newSetResourceAccessForBucket,

    -- * Request Lenses
    setResourceAccessForBucket_resourceName,
    setResourceAccessForBucket_bucketName,
    setResourceAccessForBucket_access,

    -- * Destructuring the Response
    SetResourceAccessForBucketResponse (..),
    newSetResourceAccessForBucketResponse,

    -- * Response Lenses
    setResourceAccessForBucketResponse_operations,
    setResourceAccessForBucketResponse_httpStatus,
  )
where

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

-- | /See:/ 'newSetResourceAccessForBucket' smart constructor.
data SetResourceAccessForBucket = SetResourceAccessForBucket'
  { -- | The name of the Lightsail instance for which to set bucket access. The
    -- instance must be in a running or stopped state.
    SetResourceAccessForBucket -> Text
resourceName :: Prelude.Text,
    -- | The name of the bucket for which to set access to another Lightsail
    -- resource.
    SetResourceAccessForBucket -> Text
bucketName :: Prelude.Text,
    -- | The access setting.
    --
    -- The following access settings are available:
    --
    -- -   @allow@ - Allows access to the bucket and its objects.
    --
    -- -   @deny@ - Denies access to the bucket and its objects. Use this
    --     setting to remove access for a resource previously set to @allow@.
    SetResourceAccessForBucket -> ResourceBucketAccess
access :: ResourceBucketAccess
  }
  deriving (SetResourceAccessForBucket -> SetResourceAccessForBucket -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SetResourceAccessForBucket -> SetResourceAccessForBucket -> Bool
$c/= :: SetResourceAccessForBucket -> SetResourceAccessForBucket -> Bool
== :: SetResourceAccessForBucket -> SetResourceAccessForBucket -> Bool
$c== :: SetResourceAccessForBucket -> SetResourceAccessForBucket -> Bool
Prelude.Eq, ReadPrec [SetResourceAccessForBucket]
ReadPrec SetResourceAccessForBucket
Int -> ReadS SetResourceAccessForBucket
ReadS [SetResourceAccessForBucket]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SetResourceAccessForBucket]
$creadListPrec :: ReadPrec [SetResourceAccessForBucket]
readPrec :: ReadPrec SetResourceAccessForBucket
$creadPrec :: ReadPrec SetResourceAccessForBucket
readList :: ReadS [SetResourceAccessForBucket]
$creadList :: ReadS [SetResourceAccessForBucket]
readsPrec :: Int -> ReadS SetResourceAccessForBucket
$creadsPrec :: Int -> ReadS SetResourceAccessForBucket
Prelude.Read, Int -> SetResourceAccessForBucket -> ShowS
[SetResourceAccessForBucket] -> ShowS
SetResourceAccessForBucket -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SetResourceAccessForBucket] -> ShowS
$cshowList :: [SetResourceAccessForBucket] -> ShowS
show :: SetResourceAccessForBucket -> String
$cshow :: SetResourceAccessForBucket -> String
showsPrec :: Int -> SetResourceAccessForBucket -> ShowS
$cshowsPrec :: Int -> SetResourceAccessForBucket -> ShowS
Prelude.Show, forall x.
Rep SetResourceAccessForBucket x -> SetResourceAccessForBucket
forall x.
SetResourceAccessForBucket -> Rep SetResourceAccessForBucket x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep SetResourceAccessForBucket x -> SetResourceAccessForBucket
$cfrom :: forall x.
SetResourceAccessForBucket -> Rep SetResourceAccessForBucket x
Prelude.Generic)

-- |
-- Create a value of 'SetResourceAccessForBucket' 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:
--
-- 'resourceName', 'setResourceAccessForBucket_resourceName' - The name of the Lightsail instance for which to set bucket access. The
-- instance must be in a running or stopped state.
--
-- 'bucketName', 'setResourceAccessForBucket_bucketName' - The name of the bucket for which to set access to another Lightsail
-- resource.
--
-- 'access', 'setResourceAccessForBucket_access' - The access setting.
--
-- The following access settings are available:
--
-- -   @allow@ - Allows access to the bucket and its objects.
--
-- -   @deny@ - Denies access to the bucket and its objects. Use this
--     setting to remove access for a resource previously set to @allow@.
newSetResourceAccessForBucket ::
  -- | 'resourceName'
  Prelude.Text ->
  -- | 'bucketName'
  Prelude.Text ->
  -- | 'access'
  ResourceBucketAccess ->
  SetResourceAccessForBucket
newSetResourceAccessForBucket :: Text -> Text -> ResourceBucketAccess -> SetResourceAccessForBucket
newSetResourceAccessForBucket
  Text
pResourceName_
  Text
pBucketName_
  ResourceBucketAccess
pAccess_ =
    SetResourceAccessForBucket'
      { $sel:resourceName:SetResourceAccessForBucket' :: Text
resourceName =
          Text
pResourceName_,
        $sel:bucketName:SetResourceAccessForBucket' :: Text
bucketName = Text
pBucketName_,
        $sel:access:SetResourceAccessForBucket' :: ResourceBucketAccess
access = ResourceBucketAccess
pAccess_
      }

-- | The name of the Lightsail instance for which to set bucket access. The
-- instance must be in a running or stopped state.
setResourceAccessForBucket_resourceName :: Lens.Lens' SetResourceAccessForBucket Prelude.Text
setResourceAccessForBucket_resourceName :: Lens' SetResourceAccessForBucket Text
setResourceAccessForBucket_resourceName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetResourceAccessForBucket' {Text
resourceName :: Text
$sel:resourceName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
resourceName} -> Text
resourceName) (\s :: SetResourceAccessForBucket
s@SetResourceAccessForBucket' {} Text
a -> SetResourceAccessForBucket
s {$sel:resourceName:SetResourceAccessForBucket' :: Text
resourceName = Text
a} :: SetResourceAccessForBucket)

-- | The name of the bucket for which to set access to another Lightsail
-- resource.
setResourceAccessForBucket_bucketName :: Lens.Lens' SetResourceAccessForBucket Prelude.Text
setResourceAccessForBucket_bucketName :: Lens' SetResourceAccessForBucket Text
setResourceAccessForBucket_bucketName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetResourceAccessForBucket' {Text
bucketName :: Text
$sel:bucketName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
bucketName} -> Text
bucketName) (\s :: SetResourceAccessForBucket
s@SetResourceAccessForBucket' {} Text
a -> SetResourceAccessForBucket
s {$sel:bucketName:SetResourceAccessForBucket' :: Text
bucketName = Text
a} :: SetResourceAccessForBucket)

-- | The access setting.
--
-- The following access settings are available:
--
-- -   @allow@ - Allows access to the bucket and its objects.
--
-- -   @deny@ - Denies access to the bucket and its objects. Use this
--     setting to remove access for a resource previously set to @allow@.
setResourceAccessForBucket_access :: Lens.Lens' SetResourceAccessForBucket ResourceBucketAccess
setResourceAccessForBucket_access :: Lens' SetResourceAccessForBucket ResourceBucketAccess
setResourceAccessForBucket_access = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetResourceAccessForBucket' {ResourceBucketAccess
access :: ResourceBucketAccess
$sel:access:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> ResourceBucketAccess
access} -> ResourceBucketAccess
access) (\s :: SetResourceAccessForBucket
s@SetResourceAccessForBucket' {} ResourceBucketAccess
a -> SetResourceAccessForBucket
s {$sel:access:SetResourceAccessForBucket' :: ResourceBucketAccess
access = ResourceBucketAccess
a} :: SetResourceAccessForBucket)

instance Core.AWSRequest SetResourceAccessForBucket where
  type
    AWSResponse SetResourceAccessForBucket =
      SetResourceAccessForBucketResponse
  request :: (Service -> Service)
-> SetResourceAccessForBucket -> Request SetResourceAccessForBucket
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy SetResourceAccessForBucket
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse SetResourceAccessForBucket)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe [Operation] -> Int -> SetResourceAccessForBucketResponse
SetResourceAccessForBucketResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"operations" forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty)
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable SetResourceAccessForBucket where
  hashWithSalt :: Int -> SetResourceAccessForBucket -> Int
hashWithSalt Int
_salt SetResourceAccessForBucket' {Text
ResourceBucketAccess
access :: ResourceBucketAccess
bucketName :: Text
resourceName :: Text
$sel:access:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> ResourceBucketAccess
$sel:bucketName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
$sel:resourceName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
resourceName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
bucketName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` ResourceBucketAccess
access

instance Prelude.NFData SetResourceAccessForBucket where
  rnf :: SetResourceAccessForBucket -> ()
rnf SetResourceAccessForBucket' {Text
ResourceBucketAccess
access :: ResourceBucketAccess
bucketName :: Text
resourceName :: Text
$sel:access:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> ResourceBucketAccess
$sel:bucketName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
$sel:resourceName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
resourceName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
bucketName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf ResourceBucketAccess
access

instance Data.ToHeaders SetResourceAccessForBucket where
  toHeaders :: SetResourceAccessForBucket -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"Lightsail_20161128.SetResourceAccessForBucket" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON SetResourceAccessForBucket where
  toJSON :: SetResourceAccessForBucket -> Value
toJSON SetResourceAccessForBucket' {Text
ResourceBucketAccess
access :: ResourceBucketAccess
bucketName :: Text
resourceName :: Text
$sel:access:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> ResourceBucketAccess
$sel:bucketName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
$sel:resourceName:SetResourceAccessForBucket' :: SetResourceAccessForBucket -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"resourceName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
resourceName),
            forall a. a -> Maybe a
Prelude.Just (Key
"bucketName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
bucketName),
            forall a. a -> Maybe a
Prelude.Just (Key
"access" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= ResourceBucketAccess
access)
          ]
      )

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

instance Data.ToQuery SetResourceAccessForBucket where
  toQuery :: SetResourceAccessForBucket -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newSetResourceAccessForBucketResponse' smart constructor.
data SetResourceAccessForBucketResponse = SetResourceAccessForBucketResponse'
  { -- | An array of objects that describe the result of the action, such as the
    -- status of the request, the timestamp of the request, and the resources
    -- affected by the request.
    SetResourceAccessForBucketResponse -> Maybe [Operation]
operations :: Prelude.Maybe [Operation],
    -- | The response's http status code.
    SetResourceAccessForBucketResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (SetResourceAccessForBucketResponse
-> SetResourceAccessForBucketResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SetResourceAccessForBucketResponse
-> SetResourceAccessForBucketResponse -> Bool
$c/= :: SetResourceAccessForBucketResponse
-> SetResourceAccessForBucketResponse -> Bool
== :: SetResourceAccessForBucketResponse
-> SetResourceAccessForBucketResponse -> Bool
$c== :: SetResourceAccessForBucketResponse
-> SetResourceAccessForBucketResponse -> Bool
Prelude.Eq, ReadPrec [SetResourceAccessForBucketResponse]
ReadPrec SetResourceAccessForBucketResponse
Int -> ReadS SetResourceAccessForBucketResponse
ReadS [SetResourceAccessForBucketResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SetResourceAccessForBucketResponse]
$creadListPrec :: ReadPrec [SetResourceAccessForBucketResponse]
readPrec :: ReadPrec SetResourceAccessForBucketResponse
$creadPrec :: ReadPrec SetResourceAccessForBucketResponse
readList :: ReadS [SetResourceAccessForBucketResponse]
$creadList :: ReadS [SetResourceAccessForBucketResponse]
readsPrec :: Int -> ReadS SetResourceAccessForBucketResponse
$creadsPrec :: Int -> ReadS SetResourceAccessForBucketResponse
Prelude.Read, Int -> SetResourceAccessForBucketResponse -> ShowS
[SetResourceAccessForBucketResponse] -> ShowS
SetResourceAccessForBucketResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SetResourceAccessForBucketResponse] -> ShowS
$cshowList :: [SetResourceAccessForBucketResponse] -> ShowS
show :: SetResourceAccessForBucketResponse -> String
$cshow :: SetResourceAccessForBucketResponse -> String
showsPrec :: Int -> SetResourceAccessForBucketResponse -> ShowS
$cshowsPrec :: Int -> SetResourceAccessForBucketResponse -> ShowS
Prelude.Show, forall x.
Rep SetResourceAccessForBucketResponse x
-> SetResourceAccessForBucketResponse
forall x.
SetResourceAccessForBucketResponse
-> Rep SetResourceAccessForBucketResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep SetResourceAccessForBucketResponse x
-> SetResourceAccessForBucketResponse
$cfrom :: forall x.
SetResourceAccessForBucketResponse
-> Rep SetResourceAccessForBucketResponse x
Prelude.Generic)

-- |
-- Create a value of 'SetResourceAccessForBucketResponse' 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:
--
-- 'operations', 'setResourceAccessForBucketResponse_operations' - An array of objects that describe the result of the action, such as the
-- status of the request, the timestamp of the request, and the resources
-- affected by the request.
--
-- 'httpStatus', 'setResourceAccessForBucketResponse_httpStatus' - The response's http status code.
newSetResourceAccessForBucketResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  SetResourceAccessForBucketResponse
newSetResourceAccessForBucketResponse :: Int -> SetResourceAccessForBucketResponse
newSetResourceAccessForBucketResponse Int
pHttpStatus_ =
  SetResourceAccessForBucketResponse'
    { $sel:operations:SetResourceAccessForBucketResponse' :: Maybe [Operation]
operations =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:SetResourceAccessForBucketResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | An array of objects that describe the result of the action, such as the
-- status of the request, the timestamp of the request, and the resources
-- affected by the request.
setResourceAccessForBucketResponse_operations :: Lens.Lens' SetResourceAccessForBucketResponse (Prelude.Maybe [Operation])
setResourceAccessForBucketResponse_operations :: Lens' SetResourceAccessForBucketResponse (Maybe [Operation])
setResourceAccessForBucketResponse_operations = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetResourceAccessForBucketResponse' {Maybe [Operation]
operations :: Maybe [Operation]
$sel:operations:SetResourceAccessForBucketResponse' :: SetResourceAccessForBucketResponse -> Maybe [Operation]
operations} -> Maybe [Operation]
operations) (\s :: SetResourceAccessForBucketResponse
s@SetResourceAccessForBucketResponse' {} Maybe [Operation]
a -> SetResourceAccessForBucketResponse
s {$sel:operations:SetResourceAccessForBucketResponse' :: Maybe [Operation]
operations = Maybe [Operation]
a} :: SetResourceAccessForBucketResponse) 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 response's http status code.
setResourceAccessForBucketResponse_httpStatus :: Lens.Lens' SetResourceAccessForBucketResponse Prelude.Int
setResourceAccessForBucketResponse_httpStatus :: Lens' SetResourceAccessForBucketResponse Int
setResourceAccessForBucketResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SetResourceAccessForBucketResponse' {Int
httpStatus :: Int
$sel:httpStatus:SetResourceAccessForBucketResponse' :: SetResourceAccessForBucketResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: SetResourceAccessForBucketResponse
s@SetResourceAccessForBucketResponse' {} Int
a -> SetResourceAccessForBucketResponse
s {$sel:httpStatus:SetResourceAccessForBucketResponse' :: Int
httpStatus = Int
a} :: SetResourceAccessForBucketResponse)

instance
  Prelude.NFData
    SetResourceAccessForBucketResponse
  where
  rnf :: SetResourceAccessForBucketResponse -> ()
rnf SetResourceAccessForBucketResponse' {Int
Maybe [Operation]
httpStatus :: Int
operations :: Maybe [Operation]
$sel:httpStatus:SetResourceAccessForBucketResponse' :: SetResourceAccessForBucketResponse -> Int
$sel:operations:SetResourceAccessForBucketResponse' :: SetResourceAccessForBucketResponse -> Maybe [Operation]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Operation]
operations
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus