{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}
{-# LANGUAGE TypeFamilies       #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

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

-- |
-- Module      : Network.AWS.CodePipeline.PutApprovalResult
-- Copyright   : (c) 2013-2018 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Provides the response to a manual approval request to AWS CodePipeline. Valid responses include Approved and Rejected.
--
--
module Network.AWS.CodePipeline.PutApprovalResult
    (
    -- * Creating a Request
      putApprovalResult
    , PutApprovalResult
    -- * Request Lenses
    , parPipelineName
    , parStageName
    , parActionName
    , parResult
    , parToken

    -- * Destructuring the Response
    , putApprovalResultResponse
    , PutApprovalResultResponse
    -- * Response Lenses
    , parrsApprovedAt
    , parrsResponseStatus
    ) where

import Network.AWS.CodePipeline.Types
import Network.AWS.CodePipeline.Types.Product
import Network.AWS.Lens
import Network.AWS.Prelude
import Network.AWS.Request
import Network.AWS.Response

-- | Represents the input of a PutApprovalResult action.
--
--
--
-- /See:/ 'putApprovalResult' smart constructor.
data PutApprovalResult = PutApprovalResult'
  { _parPipelineName :: !Text
  , _parStageName    :: !Text
  , _parActionName   :: !Text
  , _parResult       :: !ApprovalResult
  , _parToken        :: !Text
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'PutApprovalResult' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'parPipelineName' - The name of the pipeline that contains the action.
--
-- * 'parStageName' - The name of the stage that contains the action.
--
-- * 'parActionName' - The name of the action for which approval is requested.
--
-- * 'parResult' - Represents information about the result of the approval request.
--
-- * 'parToken' - The system-generated token used to identify a unique approval request. The token for each open approval request can be obtained using the 'GetPipelineState' action and is used to validate that the approval request corresponding to this token is still valid.
putApprovalResult
    :: Text -- ^ 'parPipelineName'
    -> Text -- ^ 'parStageName'
    -> Text -- ^ 'parActionName'
    -> ApprovalResult -- ^ 'parResult'
    -> Text -- ^ 'parToken'
    -> PutApprovalResult
putApprovalResult pPipelineName_ pStageName_ pActionName_ pResult_ pToken_ =
  PutApprovalResult'
    { _parPipelineName = pPipelineName_
    , _parStageName = pStageName_
    , _parActionName = pActionName_
    , _parResult = pResult_
    , _parToken = pToken_
    }


-- | The name of the pipeline that contains the action.
parPipelineName :: Lens' PutApprovalResult Text
parPipelineName = lens _parPipelineName (\ s a -> s{_parPipelineName = a})

-- | The name of the stage that contains the action.
parStageName :: Lens' PutApprovalResult Text
parStageName = lens _parStageName (\ s a -> s{_parStageName = a})

-- | The name of the action for which approval is requested.
parActionName :: Lens' PutApprovalResult Text
parActionName = lens _parActionName (\ s a -> s{_parActionName = a})

-- | Represents information about the result of the approval request.
parResult :: Lens' PutApprovalResult ApprovalResult
parResult = lens _parResult (\ s a -> s{_parResult = a})

-- | The system-generated token used to identify a unique approval request. The token for each open approval request can be obtained using the 'GetPipelineState' action and is used to validate that the approval request corresponding to this token is still valid.
parToken :: Lens' PutApprovalResult Text
parToken = lens _parToken (\ s a -> s{_parToken = a})

instance AWSRequest PutApprovalResult where
        type Rs PutApprovalResult = PutApprovalResultResponse
        request = postJSON codePipeline
        response
          = receiveJSON
              (\ s h x ->
                 PutApprovalResultResponse' <$>
                   (x .?> "approvedAt") <*> (pure (fromEnum s)))

instance Hashable PutApprovalResult where

instance NFData PutApprovalResult where

instance ToHeaders PutApprovalResult where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("CodePipeline_20150709.PutApprovalResult" ::
                       ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToJSON PutApprovalResult where
        toJSON PutApprovalResult'{..}
          = object
              (catMaybes
                 [Just ("pipelineName" .= _parPipelineName),
                  Just ("stageName" .= _parStageName),
                  Just ("actionName" .= _parActionName),
                  Just ("result" .= _parResult),
                  Just ("token" .= _parToken)])

instance ToPath PutApprovalResult where
        toPath = const "/"

instance ToQuery PutApprovalResult where
        toQuery = const mempty

-- | Represents the output of a PutApprovalResult action.
--
--
--
-- /See:/ 'putApprovalResultResponse' smart constructor.
data PutApprovalResultResponse = PutApprovalResultResponse'
  { _parrsApprovedAt     :: !(Maybe POSIX)
  , _parrsResponseStatus :: !Int
  } deriving (Eq, Read, Show, Data, Typeable, Generic)


-- | Creates a value of 'PutApprovalResultResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'parrsApprovedAt' - The timestamp showing when the approval or rejection was submitted.
--
-- * 'parrsResponseStatus' - -- | The response status code.
putApprovalResultResponse
    :: Int -- ^ 'parrsResponseStatus'
    -> PutApprovalResultResponse
putApprovalResultResponse pResponseStatus_ =
  PutApprovalResultResponse'
    {_parrsApprovedAt = Nothing, _parrsResponseStatus = pResponseStatus_}


-- | The timestamp showing when the approval or rejection was submitted.
parrsApprovedAt :: Lens' PutApprovalResultResponse (Maybe UTCTime)
parrsApprovedAt = lens _parrsApprovedAt (\ s a -> s{_parrsApprovedAt = a}) . mapping _Time

-- | -- | The response status code.
parrsResponseStatus :: Lens' PutApprovalResultResponse Int
parrsResponseStatus = lens _parrsResponseStatus (\ s a -> s{_parrsResponseStatus = a})

instance NFData PutApprovalResultResponse where