{-# 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.CloudFront.CreateOriginAccessControl
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a new origin access control in CloudFront. After you create an
-- origin access control, you can add it to an origin in a CloudFront
-- distribution so that CloudFront sends authenticated (signed) requests to
-- the origin.
--
-- For an Amazon S3 origin, this makes it possible to block public access
-- to the Amazon S3 bucket so that viewers (users) can access the content
-- in the bucket only through CloudFront.
--
-- For more information about using a CloudFront origin access control, see
-- <https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html Restricting access to an Amazon S3 origin>
-- in the /Amazon CloudFront Developer Guide/.
module Amazonka.CloudFront.CreateOriginAccessControl
  ( -- * Creating a Request
    CreateOriginAccessControl (..),
    newCreateOriginAccessControl,

    -- * Request Lenses
    createOriginAccessControl_originAccessControlConfig,

    -- * Destructuring the Response
    CreateOriginAccessControlResponse (..),
    newCreateOriginAccessControlResponse,

    -- * Response Lenses
    createOriginAccessControlResponse_eTag,
    createOriginAccessControlResponse_location,
    createOriginAccessControlResponse_originAccessControl,
    createOriginAccessControlResponse_httpStatus,
  )
where

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

-- | /See:/ 'newCreateOriginAccessControl' smart constructor.
data CreateOriginAccessControl = CreateOriginAccessControl'
  { -- | Contains the origin access control.
    CreateOriginAccessControl -> OriginAccessControlConfig
originAccessControlConfig :: OriginAccessControlConfig
  }
  deriving (CreateOriginAccessControl -> CreateOriginAccessControl -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateOriginAccessControl -> CreateOriginAccessControl -> Bool
$c/= :: CreateOriginAccessControl -> CreateOriginAccessControl -> Bool
== :: CreateOriginAccessControl -> CreateOriginAccessControl -> Bool
$c== :: CreateOriginAccessControl -> CreateOriginAccessControl -> Bool
Prelude.Eq, ReadPrec [CreateOriginAccessControl]
ReadPrec CreateOriginAccessControl
Int -> ReadS CreateOriginAccessControl
ReadS [CreateOriginAccessControl]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateOriginAccessControl]
$creadListPrec :: ReadPrec [CreateOriginAccessControl]
readPrec :: ReadPrec CreateOriginAccessControl
$creadPrec :: ReadPrec CreateOriginAccessControl
readList :: ReadS [CreateOriginAccessControl]
$creadList :: ReadS [CreateOriginAccessControl]
readsPrec :: Int -> ReadS CreateOriginAccessControl
$creadsPrec :: Int -> ReadS CreateOriginAccessControl
Prelude.Read, Int -> CreateOriginAccessControl -> ShowS
[CreateOriginAccessControl] -> ShowS
CreateOriginAccessControl -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateOriginAccessControl] -> ShowS
$cshowList :: [CreateOriginAccessControl] -> ShowS
show :: CreateOriginAccessControl -> String
$cshow :: CreateOriginAccessControl -> String
showsPrec :: Int -> CreateOriginAccessControl -> ShowS
$cshowsPrec :: Int -> CreateOriginAccessControl -> ShowS
Prelude.Show, forall x.
Rep CreateOriginAccessControl x -> CreateOriginAccessControl
forall x.
CreateOriginAccessControl -> Rep CreateOriginAccessControl x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateOriginAccessControl x -> CreateOriginAccessControl
$cfrom :: forall x.
CreateOriginAccessControl -> Rep CreateOriginAccessControl x
Prelude.Generic)

-- |
-- Create a value of 'CreateOriginAccessControl' 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:
--
-- 'originAccessControlConfig', 'createOriginAccessControl_originAccessControlConfig' - Contains the origin access control.
newCreateOriginAccessControl ::
  -- | 'originAccessControlConfig'
  OriginAccessControlConfig ->
  CreateOriginAccessControl
newCreateOriginAccessControl :: OriginAccessControlConfig -> CreateOriginAccessControl
newCreateOriginAccessControl
  OriginAccessControlConfig
pOriginAccessControlConfig_ =
    CreateOriginAccessControl'
      { $sel:originAccessControlConfig:CreateOriginAccessControl' :: OriginAccessControlConfig
originAccessControlConfig =
          OriginAccessControlConfig
pOriginAccessControlConfig_
      }

-- | Contains the origin access control.
createOriginAccessControl_originAccessControlConfig :: Lens.Lens' CreateOriginAccessControl OriginAccessControlConfig
createOriginAccessControl_originAccessControlConfig :: Lens' CreateOriginAccessControl OriginAccessControlConfig
createOriginAccessControl_originAccessControlConfig = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateOriginAccessControl' {OriginAccessControlConfig
originAccessControlConfig :: OriginAccessControlConfig
$sel:originAccessControlConfig:CreateOriginAccessControl' :: CreateOriginAccessControl -> OriginAccessControlConfig
originAccessControlConfig} -> OriginAccessControlConfig
originAccessControlConfig) (\s :: CreateOriginAccessControl
s@CreateOriginAccessControl' {} OriginAccessControlConfig
a -> CreateOriginAccessControl
s {$sel:originAccessControlConfig:CreateOriginAccessControl' :: OriginAccessControlConfig
originAccessControlConfig = OriginAccessControlConfig
a} :: CreateOriginAccessControl)

instance Core.AWSRequest CreateOriginAccessControl where
  type
    AWSResponse CreateOriginAccessControl =
      CreateOriginAccessControlResponse
  request :: (Service -> Service)
-> CreateOriginAccessControl -> Request CreateOriginAccessControl
request Service -> Service
overrides =
    forall a. (ToRequest a, ToElement a) => Service -> a -> Request a
Request.postXML (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy CreateOriginAccessControl
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateOriginAccessControl)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXML
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Maybe Text
-> Maybe Text
-> Maybe OriginAccessControl
-> Int
-> CreateOriginAccessControlResponse
CreateOriginAccessControlResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"ETag")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"Location")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall a. FromXML a => [Node] -> Either String a
Data.parseXML [Node]
x)
            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 CreateOriginAccessControl where
  hashWithSalt :: Int -> CreateOriginAccessControl -> Int
hashWithSalt Int
_salt CreateOriginAccessControl' {OriginAccessControlConfig
originAccessControlConfig :: OriginAccessControlConfig
$sel:originAccessControlConfig:CreateOriginAccessControl' :: CreateOriginAccessControl -> OriginAccessControlConfig
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` OriginAccessControlConfig
originAccessControlConfig

instance Prelude.NFData CreateOriginAccessControl where
  rnf :: CreateOriginAccessControl -> ()
rnf CreateOriginAccessControl' {OriginAccessControlConfig
originAccessControlConfig :: OriginAccessControlConfig
$sel:originAccessControlConfig:CreateOriginAccessControl' :: CreateOriginAccessControl -> OriginAccessControlConfig
..} =
    forall a. NFData a => a -> ()
Prelude.rnf OriginAccessControlConfig
originAccessControlConfig

instance Data.ToElement CreateOriginAccessControl where
  toElement :: CreateOriginAccessControl -> Element
toElement CreateOriginAccessControl' {OriginAccessControlConfig
originAccessControlConfig :: OriginAccessControlConfig
$sel:originAccessControlConfig:CreateOriginAccessControl' :: CreateOriginAccessControl -> OriginAccessControlConfig
..} =
    forall a. ToXML a => Name -> a -> Element
Data.mkElement
      Name
"{http://cloudfront.amazonaws.com/doc/2020-05-31/}OriginAccessControlConfig"
      OriginAccessControlConfig
originAccessControlConfig

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

instance Data.ToPath CreateOriginAccessControl where
  toPath :: CreateOriginAccessControl -> ByteString
toPath =
    forall a b. a -> b -> a
Prelude.const ByteString
"/2020-05-31/origin-access-control"

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

-- | /See:/ 'newCreateOriginAccessControlResponse' smart constructor.
data CreateOriginAccessControlResponse = CreateOriginAccessControlResponse'
  { -- | The version identifier for the current version of the origin access
    -- control.
    CreateOriginAccessControlResponse -> Maybe Text
eTag :: Prelude.Maybe Prelude.Text,
    -- | The URL of the origin access control.
    CreateOriginAccessControlResponse -> Maybe Text
location :: Prelude.Maybe Prelude.Text,
    -- | Contains an origin access control.
    CreateOriginAccessControlResponse -> Maybe OriginAccessControl
originAccessControl :: Prelude.Maybe OriginAccessControl,
    -- | The response's http status code.
    CreateOriginAccessControlResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateOriginAccessControlResponse
-> CreateOriginAccessControlResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateOriginAccessControlResponse
-> CreateOriginAccessControlResponse -> Bool
$c/= :: CreateOriginAccessControlResponse
-> CreateOriginAccessControlResponse -> Bool
== :: CreateOriginAccessControlResponse
-> CreateOriginAccessControlResponse -> Bool
$c== :: CreateOriginAccessControlResponse
-> CreateOriginAccessControlResponse -> Bool
Prelude.Eq, ReadPrec [CreateOriginAccessControlResponse]
ReadPrec CreateOriginAccessControlResponse
Int -> ReadS CreateOriginAccessControlResponse
ReadS [CreateOriginAccessControlResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateOriginAccessControlResponse]
$creadListPrec :: ReadPrec [CreateOriginAccessControlResponse]
readPrec :: ReadPrec CreateOriginAccessControlResponse
$creadPrec :: ReadPrec CreateOriginAccessControlResponse
readList :: ReadS [CreateOriginAccessControlResponse]
$creadList :: ReadS [CreateOriginAccessControlResponse]
readsPrec :: Int -> ReadS CreateOriginAccessControlResponse
$creadsPrec :: Int -> ReadS CreateOriginAccessControlResponse
Prelude.Read, Int -> CreateOriginAccessControlResponse -> ShowS
[CreateOriginAccessControlResponse] -> ShowS
CreateOriginAccessControlResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateOriginAccessControlResponse] -> ShowS
$cshowList :: [CreateOriginAccessControlResponse] -> ShowS
show :: CreateOriginAccessControlResponse -> String
$cshow :: CreateOriginAccessControlResponse -> String
showsPrec :: Int -> CreateOriginAccessControlResponse -> ShowS
$cshowsPrec :: Int -> CreateOriginAccessControlResponse -> ShowS
Prelude.Show, forall x.
Rep CreateOriginAccessControlResponse x
-> CreateOriginAccessControlResponse
forall x.
CreateOriginAccessControlResponse
-> Rep CreateOriginAccessControlResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateOriginAccessControlResponse x
-> CreateOriginAccessControlResponse
$cfrom :: forall x.
CreateOriginAccessControlResponse
-> Rep CreateOriginAccessControlResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateOriginAccessControlResponse' 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:
--
-- 'eTag', 'createOriginAccessControlResponse_eTag' - The version identifier for the current version of the origin access
-- control.
--
-- 'location', 'createOriginAccessControlResponse_location' - The URL of the origin access control.
--
-- 'originAccessControl', 'createOriginAccessControlResponse_originAccessControl' - Contains an origin access control.
--
-- 'httpStatus', 'createOriginAccessControlResponse_httpStatus' - The response's http status code.
newCreateOriginAccessControlResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateOriginAccessControlResponse
newCreateOriginAccessControlResponse :: Int -> CreateOriginAccessControlResponse
newCreateOriginAccessControlResponse Int
pHttpStatus_ =
  CreateOriginAccessControlResponse'
    { $sel:eTag:CreateOriginAccessControlResponse' :: Maybe Text
eTag =
        forall a. Maybe a
Prelude.Nothing,
      $sel:location:CreateOriginAccessControlResponse' :: Maybe Text
location = forall a. Maybe a
Prelude.Nothing,
      $sel:originAccessControl:CreateOriginAccessControlResponse' :: Maybe OriginAccessControl
originAccessControl = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateOriginAccessControlResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The version identifier for the current version of the origin access
-- control.
createOriginAccessControlResponse_eTag :: Lens.Lens' CreateOriginAccessControlResponse (Prelude.Maybe Prelude.Text)
createOriginAccessControlResponse_eTag :: Lens' CreateOriginAccessControlResponse (Maybe Text)
createOriginAccessControlResponse_eTag = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateOriginAccessControlResponse' {Maybe Text
eTag :: Maybe Text
$sel:eTag:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Maybe Text
eTag} -> Maybe Text
eTag) (\s :: CreateOriginAccessControlResponse
s@CreateOriginAccessControlResponse' {} Maybe Text
a -> CreateOriginAccessControlResponse
s {$sel:eTag:CreateOriginAccessControlResponse' :: Maybe Text
eTag = Maybe Text
a} :: CreateOriginAccessControlResponse)

-- | The URL of the origin access control.
createOriginAccessControlResponse_location :: Lens.Lens' CreateOriginAccessControlResponse (Prelude.Maybe Prelude.Text)
createOriginAccessControlResponse_location :: Lens' CreateOriginAccessControlResponse (Maybe Text)
createOriginAccessControlResponse_location = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateOriginAccessControlResponse' {Maybe Text
location :: Maybe Text
$sel:location:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Maybe Text
location} -> Maybe Text
location) (\s :: CreateOriginAccessControlResponse
s@CreateOriginAccessControlResponse' {} Maybe Text
a -> CreateOriginAccessControlResponse
s {$sel:location:CreateOriginAccessControlResponse' :: Maybe Text
location = Maybe Text
a} :: CreateOriginAccessControlResponse)

-- | Contains an origin access control.
createOriginAccessControlResponse_originAccessControl :: Lens.Lens' CreateOriginAccessControlResponse (Prelude.Maybe OriginAccessControl)
createOriginAccessControlResponse_originAccessControl :: Lens' CreateOriginAccessControlResponse (Maybe OriginAccessControl)
createOriginAccessControlResponse_originAccessControl = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateOriginAccessControlResponse' {Maybe OriginAccessControl
originAccessControl :: Maybe OriginAccessControl
$sel:originAccessControl:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Maybe OriginAccessControl
originAccessControl} -> Maybe OriginAccessControl
originAccessControl) (\s :: CreateOriginAccessControlResponse
s@CreateOriginAccessControlResponse' {} Maybe OriginAccessControl
a -> CreateOriginAccessControlResponse
s {$sel:originAccessControl:CreateOriginAccessControlResponse' :: Maybe OriginAccessControl
originAccessControl = Maybe OriginAccessControl
a} :: CreateOriginAccessControlResponse)

-- | The response's http status code.
createOriginAccessControlResponse_httpStatus :: Lens.Lens' CreateOriginAccessControlResponse Prelude.Int
createOriginAccessControlResponse_httpStatus :: Lens' CreateOriginAccessControlResponse Int
createOriginAccessControlResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateOriginAccessControlResponse' {Int
httpStatus :: Int
$sel:httpStatus:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: CreateOriginAccessControlResponse
s@CreateOriginAccessControlResponse' {} Int
a -> CreateOriginAccessControlResponse
s {$sel:httpStatus:CreateOriginAccessControlResponse' :: Int
httpStatus = Int
a} :: CreateOriginAccessControlResponse)

instance
  Prelude.NFData
    CreateOriginAccessControlResponse
  where
  rnf :: CreateOriginAccessControlResponse -> ()
rnf CreateOriginAccessControlResponse' {Int
Maybe Text
Maybe OriginAccessControl
httpStatus :: Int
originAccessControl :: Maybe OriginAccessControl
location :: Maybe Text
eTag :: Maybe Text
$sel:httpStatus:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Int
$sel:originAccessControl:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Maybe OriginAccessControl
$sel:location:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Maybe Text
$sel:eTag:CreateOriginAccessControlResponse' :: CreateOriginAccessControlResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
eTag
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
location
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe OriginAccessControl
originAccessControl
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus