gitlab-haskell-0.3.2.0: src/GitLab/API/Boards.hs
{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module : Boards
-- Description : Project issue boards, see https://docs.gitlab.com/ce/api/boards.html
-- Copyright : (c) Rob Stewart, Heriot-Watt University, 2021
-- License : BSD3
-- Maintainer : robstewart57@gmail.com
-- Stability : stable
module GitLab.API.Boards
( projectIssueBoards,
projectIssueBoards',
projectIssueBoard,
projectIssueBoard',
createIssueBoard,
createIssueBoard',
updateIssueBoard',
deleteIssueBoard,
deleteIssueBoard',
projectBoardLists,
projectBoardLists',
boardList,
boardList',
createBoardList,
createBoardList',
reorderBoardList,
reorderBoardList',
deleteBoardList,
deleteBoardList',
UpdateBoardAttrs (..),
defaultUpdateBoardAttrs,
defaultCreateBoardAttrs,
CreateBoardAttrs (..),
)
where
import qualified Data.ByteString.Lazy as BSL
import Data.Either
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
-- | returns all issue boards for a project.
projectIssueBoards ::
-- | the project
Project ->
GitLab [IssueBoard]
projectIssueBoards project = do
result <- projectIssueBoards' (project_id project)
-- return an empty list if the repository could not be found.
return (fromRight [] result)
-- | returns all issue boards for a project given its project ID.
projectIssueBoards' ::
-- | project ID
Int ->
GitLab (Either (Response BSL.ByteString) [IssueBoard])
projectIssueBoards' projectId =
gitlabGetMany (boardsAddr projectId) []
where
boardsAddr :: Int -> Text
boardsAddr projId =
"/projects/" <> T.pack (show projId) <> "/boards"
-- | returns all issue boards for a project.
projectIssueBoard ::
-- | the project
Project ->
-- | the board ID
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe IssueBoard))
projectIssueBoard project = do
projectIssueBoard' (project_id project)
-- | returns all issue boards for a project.
projectIssueBoard' ::
-- | the project ID
Int ->
-- | the board ID
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe IssueBoard))
projectIssueBoard' projectId boardId = do
gitlabGetOne boardAddr []
where
boardAddr :: Text
boardAddr =
"/projects/" <> T.pack (show projectId) <> "/boards/" <> T.pack (show boardId)
-- | Creates a project issue board.
createIssueBoard ::
-- | the project
Project ->
-- | board name
Text ->
GitLab (Maybe IssueBoard)
createIssueBoard project boardName = do
result <- createIssueBoard' (project_id project) boardName
return (fromRight Nothing result)
-- | Creates a project issue board.
createIssueBoard' ::
-- | the project ID
Int ->
-- | board name
Text ->
GitLab (Either (Response BSL.ByteString) (Maybe IssueBoard))
createIssueBoard' projectId boardName = do
gitlabPost boardAddr [("name", Just (T.encodeUtf8 boardName))]
where
boardAddr :: Text
boardAddr =
"/projects/" <> T.pack (show projectId) <> "/boards"
-- | Updates a project issue board.
updateIssueBoard' ::
-- | the project ID
Int ->
-- | the board ID
Int ->
-- | attributes for updating boards
UpdateBoardAttrs ->
GitLab (Either (Response BSL.ByteString) (Maybe IssueBoard))
updateIssueBoard' projectId boardId attrs = do
gitlabPut boardAddr (updateBoardAttrs attrs)
where
boardAddr :: Text
boardAddr =
"/projects/"
<> T.pack (show projectId)
<> "/boards/"
<> T.pack (show boardId)
-- | Deletes a project issue board.
deleteIssueBoard ::
-- | the project
Project ->
-- | the board
IssueBoard ->
GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteIssueBoard project board = do
deleteIssueBoard' (project_id project) (board_id board)
-- | Deletes a project issue board.
deleteIssueBoard' ::
-- | the project ID
Int ->
-- | the board ID
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteIssueBoard' projectId boardId = do
gitlabDelete boardAddr
where
boardAddr :: Text
boardAddr =
"/projects/"
<> T.pack (show projectId)
<> "/boards/"
<> T.pack (show boardId)
-- | Get a list of the board’s lists. Does not include open and closed lists.
projectBoardLists ::
-- | the project
Project ->
-- | the board
IssueBoard ->
GitLab [BoardIssue]
projectBoardLists project board = do
result <- projectBoardLists' (project_id project) (board_id board)
-- return an empty list if the repository could not be found.
return (fromRight [] result)
-- | Get a list of the board’s lists. Does not include open and closed lists.
projectBoardLists' ::
-- | project ID
Int ->
-- | board ID
Int ->
GitLab (Either (Response BSL.ByteString) [BoardIssue])
projectBoardLists' projectId boardId =
gitlabGetMany boardsAddr []
where
boardsAddr :: Text
boardsAddr =
"/projects/" <> T.pack (show projectId) <> "/boards/" <> T.pack (show boardId) <> "/lists"
-- | Get a list of the board’s lists. Does not include open and closed lists.
boardList ::
-- | the project
Project ->
-- | the board
IssueBoard ->
-- | list ID
Int ->
GitLab (Maybe BoardIssue)
boardList project board listId = do
result <- boardList' (project_id project) (board_id board) listId
-- return an empty list if the repository could not be found.
return (fromRight Nothing result)
-- | Get a list of the board’s lists. Does not include open and closed lists.
boardList' ::
-- | project ID
Int ->
-- | board ID
Int ->
-- | list ID
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe BoardIssue))
boardList' projectId boardId listId =
gitlabGetOne boardsAddr []
where
boardsAddr :: Text
boardsAddr =
"/projects/" <> T.pack (show projectId) <> "/boards/" <> T.pack (show boardId) <> "/lists/" <> T.pack (show listId)
-- | Creates a new issue board list.
createBoardList ::
-- | the project
Project ->
-- | the board
IssueBoard ->
-- | attributes for creating boards
CreateBoardAttrs ->
GitLab (Maybe BoardIssue)
createBoardList project board attrs = do
result <- createBoardList' (project_id project) (board_id board) attrs
-- return an empty list if the repository could not be found.
return (fromRight Nothing result)
-- | Creates a new issue board list.
createBoardList' ::
-- | project ID
Int ->
-- | board ID
Int ->
-- | attributes for creating the board
CreateBoardAttrs ->
GitLab (Either (Response BSL.ByteString) (Maybe BoardIssue))
createBoardList' projectId boardId attrs =
gitlabPost boardsAddr (createBoardAttrs attrs)
where
boardsAddr :: Text
boardsAddr =
"/projects/"
<> T.pack (show projectId)
<> "/boards/"
<> T.pack (show boardId)
<> "/lists"
-- | Updates an existing issue board list. This call is used to change list position.
reorderBoardList ::
-- | project
Project ->
-- | board
IssueBoard ->
-- | list ID
Int ->
-- | the position of the list
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe BoardIssue))
reorderBoardList project board =
reorderBoardList' (project_id project) (board_id board)
-- | Updates an existing issue board list. This call is used to change list position.
reorderBoardList' ::
-- | project ID
Int ->
-- | board ID
Int ->
-- | list ID
Int ->
-- | the position of the list
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe BoardIssue))
reorderBoardList' projectId boardId listId newPosition =
gitlabPut boardsAddr [("position", Just (T.encodeUtf8 (T.pack (show newPosition))))]
where
boardsAddr :: Text
boardsAddr =
"/projects/"
<> T.pack (show projectId)
<> "/boards/"
<> T.pack (show boardId)
<> "/lists/"
<> T.pack (show listId)
-- | Only for administrators and project owners. Deletes a board list.
deleteBoardList ::
-- | project
Project ->
-- | board
IssueBoard ->
-- | list ID
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteBoardList project board =
deleteBoardList' (project_id project) (board_id board)
-- | Only for administrators and project owners. Deletes a board list.
deleteBoardList' ::
-- | project ID
Int ->
-- | board ID
Int ->
-- | list ID
Int ->
GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteBoardList' projectId boardId listId =
gitlabDelete boardsAddr
where
boardsAddr :: Text
boardsAddr =
"/projects/"
<> T.pack (show projectId)
<> "/boards/"
<> T.pack (show boardId)
<> "/lists/"
<> T.pack (show listId)
-- | Attributes for updating when editing a board with the
-- functions for updating issue boards.
data UpdateBoardAttrs = UpdateBoardAttrs
{ updateBoard_new_name :: Maybe String,
updateBoard_assignee_id :: Maybe Int,
updateBoard_milestone_id :: Maybe Int,
updateBoard_labels :: Maybe String,
updateBoard_weight :: Maybe Int
}
-- | default attributes for board update.
defaultUpdateBoardAttrs :: UpdateBoardAttrs
defaultUpdateBoardAttrs =
UpdateBoardAttrs Nothing Nothing Nothing Nothing Nothing
updateBoardAttrs :: UpdateBoardAttrs -> [GitLabParam]
updateBoardAttrs attrs =
catMaybes
[ (\s -> Just ("name", Just (T.encodeUtf8 (T.pack s)))) =<< updateBoard_new_name attrs,
(\i -> Just ("assignee_id", Just (T.encodeUtf8 (T.pack (show i))))) =<< updateBoard_assignee_id attrs,
(\i -> Just ("milestone_id", Just (T.encodeUtf8 (T.pack (show i))))) =<< updateBoard_milestone_id attrs,
(\s -> Just ("labels", Just (T.encodeUtf8 (T.pack s)))) =<< updateBoard_labels attrs,
(\i -> Just ("weight", Just (T.encodeUtf8 (T.pack (show i))))) =<< updateBoard_weight attrs
]
-- | exactly one parameter must be provided.
data CreateBoardAttrs = CreateBoardAttrs
{ createBoard_label_id :: Maybe Int,
createBoard_assignee_id :: Maybe Int,
createBoard_milestone_id :: Maybe Int
}
-- | default attributes for board creation.
defaultCreateBoardAttrs :: CreateBoardAttrs
defaultCreateBoardAttrs =
CreateBoardAttrs Nothing Nothing Nothing
createBoardAttrs :: CreateBoardAttrs -> [GitLabParam]
createBoardAttrs attrs =
catMaybes
[ (\i -> Just ("label_id", Just (T.encodeUtf8 (T.pack (show i))))) =<< createBoard_label_id attrs,
(\i -> Just ("assignee_id", Just (T.encodeUtf8 (T.pack (show i))))) =<< createBoard_assignee_id attrs,
(\i -> Just ("milestone_id", Just (T.encodeUtf8 (T.pack (show i))))) =<< createBoard_milestone_id attrs
]