{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module      : Notes
-- Description : Notes on issues, snippets, merge requests and epics
-- Copyright   : (c) Rob Stewart, Heriot-Watt University, 2020
-- License     : BSD3
-- Maintainer  : robstewart57@gmail.com
-- Stability   : stable
module GitLab.API.Notes
  ( -- * Issues
    issueNotes,
    issueNote,
    newIssueNote,
    modifyIssueNote,
    deleteIssueNote,

    -- * Snippets
    snippetNotes,
    snippetNote,
    newSnippetNote,
    modifySnippetNote,
    deleteSnippetNote,

    -- * Merge Requests
    mergeRequestNotes,
    mergeRequestNote,
    newMergeRequestNote,
    modifyMergeRequestNote,
    deleteMergeRequestNote,
  )
where

import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import GitLab.Types
import GitLab.WebRequests.GitLabWebCalls
import Network.HTTP.Client

-- | Gets a list of all notes for a single issue.
issueNotes ::
  -- | project
  Project ->
  -- | issue IID
  Int ->
  -- | sort the issues
  Maybe SortBy ->
  -- | Return issue notes ordered by created_at or updated_at fields
  Maybe OrderBy ->
  GitLab (Either (Response BSL.ByteString) [Note])
issueNotes :: Project
-> Int
-> Maybe SortBy
-> Maybe OrderBy
-> GitLab (Either (Response ByteString) [Note])
issueNotes Project
prj Int
issueIid Maybe SortBy
sort Maybe OrderBy
order =
  Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) [Note])
forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ (\SortBy
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"sort", SortBy -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr SortBy
x)) (SortBy -> Maybe GitLabParam) -> Maybe SortBy -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe SortBy
sort,
          (\OrderBy
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"order_by", OrderBy -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr OrderBy
x)) (OrderBy -> Maybe GitLabParam)
-> Maybe OrderBy -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe OrderBy
order
        ]
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/issues/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
issueIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes"
    showAttr :: (Show a) => a -> Maybe BS.ByteString
    showAttr :: a -> Maybe ByteString
showAttr = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (a -> ByteString) -> a -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

-- | Returns a single note for a specific project issue.
issueNote ::
  -- | project
  Project ->
  -- | issue IID
  Int ->
  -- | note ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe Note))
issueNote :: Project
-> Int -> Int -> GitLab (Either (Response ByteString) (Maybe Note))
issueNote Project
prj Int
issueIid Int
noteId =
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe Note))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params = []
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/issues/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
issueIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
noteId

-- | Creates a new note to a single project issue.
newIssueNote ::
  -- | project
  Project ->
  -- | issue IID
  Int ->
  -- | the body of the note
  Text ->
  -- | The confidential flag of a note. Default is false.
  Maybe Bool ->
  GitLab (Either (Response BSL.ByteString) (Maybe ()))
newIssueNote :: Project
-> Int
-> Text
-> Maybe Bool
-> GitLab (Either (Response ByteString) (Maybe ()))
newIssueNote Project
prj Int
issueIid Text
theNote Maybe Bool
isConfidential =
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe ()))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"body", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
theNote)),
          (\Bool
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"confidential", Bool -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr Bool
x)) (Bool -> Maybe GitLabParam) -> Maybe Bool -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Bool
isConfidential
        ]
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/issues/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
issueIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes"
    showAttr :: (Show a) => a -> Maybe BS.ByteString
    showAttr :: a -> Maybe ByteString
showAttr = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (a -> ByteString) -> a -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

-- | Modify existing note of an issue.
modifyIssueNote ::
  -- | project
  Project ->
  -- | issue IID
  Int ->
  -- | note ID
  Int ->
  -- | the body of the note
  Maybe Text ->
  GitLab (Either (Response BSL.ByteString) (Maybe Note))
modifyIssueNote :: Project
-> Int
-> Int
-> Maybe Text
-> GitLab (Either (Response ByteString) (Maybe Note))
modifyIssueNote Project
prj Int
issueIid Int
noteId Maybe Text
theNote = do
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe Note))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPut Text
urlPath [GitLabParam]
params
  where
    urlPath :: Text
urlPath =
      Text
"/projects/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show Int
issueIid)
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/notes/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack
          (Int -> String
forall a. Show a => a -> String
show Int
noteId)
    params ::
      [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ (\Text
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"body", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
x))) (Text -> Maybe GitLabParam) -> Maybe Text -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Text
theNote
        ]

-- | Deletes an existing note of an issue.
deleteIssueNote ::
  -- | project
  Project ->
  -- | issue IID
  Int ->
  -- | note ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteIssueNote :: Project
-> Int -> Int -> GitLab (Either (Response ByteString) (Maybe ()))
deleteIssueNote Project
prj Int
issueIid Int
noteId = do
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe ()))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabDelete Text
addr []
  where
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/issues/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
issueIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
noteId

-- | Gets a list of all notes for a single snippet.
snippetNotes ::
  -- | project
  Project ->
  -- | snippet IID
  Int ->
  -- | sort the snippets
  Maybe SortBy ->
  -- | Return snippet notes ordered by created_at or updated_at fields
  Maybe OrderBy ->
  GitLab (Either (Response BSL.ByteString) [Note])
snippetNotes :: Project
-> Int
-> Maybe SortBy
-> Maybe OrderBy
-> GitLab (Either (Response ByteString) [Note])
snippetNotes Project
prj Int
snippetIid Maybe SortBy
sort Maybe OrderBy
order =
  Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) [Note])
forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ (\SortBy
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"sort", SortBy -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr SortBy
x)) (SortBy -> Maybe GitLabParam) -> Maybe SortBy -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe SortBy
sort,
          (\OrderBy
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"order_by", OrderBy -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr OrderBy
x)) (OrderBy -> Maybe GitLabParam)
-> Maybe OrderBy -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe OrderBy
order
        ]
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/snippets/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
snippetIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes"
    showAttr :: (Show a) => a -> Maybe BS.ByteString
    showAttr :: a -> Maybe ByteString
showAttr = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (a -> ByteString) -> a -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

-- | Returns a single note for a specific project snippet.
snippetNote ::
  -- | project
  Project ->
  -- | snippet IID
  Int ->
  -- | note ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe Note))
snippetNote :: Project
-> Int -> Int -> GitLab (Either (Response ByteString) (Maybe Note))
snippetNote Project
prj Int
snippetIid Int
noteId =
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe Note))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params = []
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/snippets/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
snippetIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
noteId

-- | Creates a new note to a single project snippet.
newSnippetNote ::
  -- | project
  Project ->
  -- | snippet IID
  Int ->
  -- | the body of the note
  Text ->
  -- | The confidential flag of a note. Default is false.
  Maybe Bool ->
  GitLab (Either (Response BSL.ByteString) (Maybe ()))
newSnippetNote :: Project
-> Int
-> Text
-> Maybe Bool
-> GitLab (Either (Response ByteString) (Maybe ()))
newSnippetNote Project
prj Int
snippetIid Text
theNote Maybe Bool
isConfidential =
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe ()))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"body", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
theNote)),
          (\Bool
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"confidential", Bool -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr Bool
x)) (Bool -> Maybe GitLabParam) -> Maybe Bool -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Bool
isConfidential
        ]
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/snippets/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
snippetIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes"
    showAttr :: (Show a) => a -> Maybe BS.ByteString
    showAttr :: a -> Maybe ByteString
showAttr = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (a -> ByteString) -> a -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

-- | Modify existing note of an snippet.
modifySnippetNote ::
  -- | project
  Project ->
  -- | snippet IID
  Int ->
  -- | note ID
  Int ->
  -- | the body of the note
  Maybe Text ->
  GitLab (Either (Response BSL.ByteString) (Maybe Note))
modifySnippetNote :: Project
-> Int
-> Int
-> Maybe Text
-> GitLab (Either (Response ByteString) (Maybe Note))
modifySnippetNote Project
prj Int
snippetIid Int
noteId Maybe Text
theNote = do
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe Note))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPut Text
urlPath [GitLabParam]
params
  where
    urlPath :: Text
urlPath =
      Text
"/projects/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/snippets/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show Int
snippetIid)
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/notes/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack
          (Int -> String
forall a. Show a => a -> String
show Int
noteId)
    params ::
      [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ (\Text
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"body", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
x))) (Text -> Maybe GitLabParam) -> Maybe Text -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Text
theNote
        ]

-- | Deletes an existing note of an snippet.
deleteSnippetNote ::
  -- | project
  Project ->
  -- | snippet IID
  Int ->
  -- | note ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteSnippetNote :: Project
-> Int -> Int -> GitLab (Either (Response ByteString) (Maybe ()))
deleteSnippetNote Project
prj Int
snippetIid Int
noteId = do
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe ()))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabDelete Text
addr []
  where
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/snippets/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
snippetIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
noteId

-- | Gets a list of all notes for a single merge request.
mergeRequestNotes ::
  -- | project
  Project ->
  -- | merge request IID
  Int ->
  -- | sort the merge requests
  Maybe SortBy ->
  -- | Return merge request notes ordered by created_at or updated_at fields
  Maybe OrderBy ->
  GitLab (Either (Response BSL.ByteString) [Note])
mergeRequestNotes :: Project
-> Int
-> Maybe SortBy
-> Maybe OrderBy
-> GitLab (Either (Response ByteString) [Note])
mergeRequestNotes Project
prj Int
mergeRequestIid Maybe SortBy
sort Maybe OrderBy
order =
  Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) [Note])
forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ (\SortBy
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"sort", SortBy -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr SortBy
x)) (SortBy -> Maybe GitLabParam) -> Maybe SortBy -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe SortBy
sort,
          (\OrderBy
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"order_by", OrderBy -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr OrderBy
x)) (OrderBy -> Maybe GitLabParam)
-> Maybe OrderBy -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe OrderBy
order
        ]
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/merge_requests/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
mergeRequestIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes"
    showAttr :: (Show a) => a -> Maybe BS.ByteString
    showAttr :: a -> Maybe ByteString
showAttr = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (a -> ByteString) -> a -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

-- | Returns a single note for a specific project merge request.
mergeRequestNote ::
  -- | project
  Project ->
  -- | merge request IID
  Int ->
  -- | note ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe Note))
mergeRequestNote :: Project
-> Int -> Int -> GitLab (Either (Response ByteString) (Maybe Note))
mergeRequestNote Project
prj Int
mergeRequestIid Int
noteId =
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe Note))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params = []
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/merge_requests/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
mergeRequestIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
noteId

-- | Creates a new note to a single project merge request.
newMergeRequestNote ::
  -- | project
  Project ->
  -- | merge request IID
  Int ->
  -- | the body of the note
  Text ->
  -- | The confidential flag of a note. Default is false.
  Maybe Bool ->
  GitLab (Either (Response BSL.ByteString) (Maybe ()))
newMergeRequestNote :: Project
-> Int
-> Text
-> Maybe Bool
-> GitLab (Either (Response ByteString) (Maybe ()))
newMergeRequestNote Project
prj Int
mergeRequestIid Text
theNote Maybe Bool
isConfidential =
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe ()))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
params
  where
    params :: [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"body", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
theNote)),
          (\Bool
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"confidential", Bool -> Maybe ByteString
forall a. Show a => a -> Maybe ByteString
showAttr Bool
x)) (Bool -> Maybe GitLabParam) -> Maybe Bool -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Bool
isConfidential
        ]
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/merge_requests/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
mergeRequestIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes"
    showAttr :: (Show a) => a -> Maybe BS.ByteString
    showAttr :: a -> Maybe ByteString
showAttr = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (a -> ByteString) -> a -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 (Text -> ByteString) -> (a -> Text) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

-- | Modify existing note of an merge request.
modifyMergeRequestNote ::
  -- | project
  Project ->
  -- | merge request IID
  Int ->
  -- | note ID
  Int ->
  -- | the body of the note
  Maybe Text ->
  GitLab (Either (Response BSL.ByteString) (Maybe Note))
modifyMergeRequestNote :: Project
-> Int
-> Int
-> Maybe Text
-> GitLab (Either (Response ByteString) (Maybe Note))
modifyMergeRequestNote Project
prj Int
mergeRequestIid Int
noteId Maybe Text
theNote = do
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe Note))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPut Text
urlPath [GitLabParam]
params
  where
    urlPath :: Text
urlPath =
      Text
"/projects/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/merge_requests/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show Int
mergeRequestIid)
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/notes/"
        Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack
          (Int -> String
forall a. Show a => a -> String
show Int
noteId)
    params ::
      [GitLabParam]
    params :: [GitLabParam]
params =
      [Maybe GitLabParam] -> [GitLabParam]
forall a. [Maybe a] -> [a]
catMaybes
        [ (\Text
x -> GitLabParam -> Maybe GitLabParam
forall a. a -> Maybe a
Just (ByteString
"body", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
x))) (Text -> Maybe GitLabParam) -> Maybe Text -> Maybe GitLabParam
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Text
theNote
        ]

-- | Deletes an existing note of an merge request.
deleteMergeRequestNote ::
  -- | project
  Project ->
  -- | merge request IID
  Int ->
  -- | note ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteMergeRequestNote :: Project
-> Int -> Int -> GitLab (Either (Response ByteString) (Maybe ()))
deleteMergeRequestNote Project
prj Int
mergeRequestIid Int
noteId = do
  Text
-> [GitLabParam]
-> GitLab (Either (Response ByteString) (Maybe ()))
forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabDelete Text
addr []
  where
    addr :: Text
addr =
      String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/merge_requests/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
mergeRequestIid
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/notes/"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
noteId