{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}

-- |
-- Module      : Issues
-- Description : Queries about issues created against projects
-- Copyright   : (c) Rob Stewart, Heriot-Watt University, 2019
-- License     : BSD3
-- Maintainer  : robstewart57@gmail.com
-- Stability   : stable
module GitLab.API.Issues
  ( -- * List issues

    -- * List group issues
    groupIssues,

    -- * List project issues
    projectIssues,

    -- * Single issue
    issue,

    -- * User issues
    userIssues,

    -- * Single project issue
    projectIssue,

    -- * New issue
    newIssue,
    newIssue',

    -- * Edit issue
    editIssue,

    -- * Delete an issue
    deleteIssue,

    -- * Reorder an issue
    reorderIssue,

    -- * Move an issue
    moveIssue,

    -- * Clone an issue
    cloneIssue,

    -- * Subscribe to an issue
    subscribeIssue,

    -- * Unsubscribe from an issue
    unsubscribeIssue,

    -- * Create a to-do item
    createTodo,

    -- * List merge requests related to issue
    issueMergeRequests,

    -- * List merge requests that close a particular issue on merge
    issueMergeRequestsThatClose,

    -- * Participants on issues
    issueParticipants,

    -- * Comments on issues

    -- * Get issues statistics
    issueStatisticsUser,

    -- * Get group issues statistics
    issueStatisticsGroup,

    -- * Get project issues statistics
    issueStatisticsProject,

    -- * Issues attributes
    defaultIssueFilters,
    defaultIssueAttrs,
    IssueAttrs (..),
    DueDate (..),
    IssueState (..),
  )
where

import Data.Aeson.TH
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 Data.Time.Clock
import Data.Time.Format.ISO8601
import GitLab.Types
import GitLab.WebRequests.GitLabWebCalls
import Network.HTTP.Client

-- | Get a list of a project’s issues
groupIssues ::
  -- | the group
  Group ->
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues.html#list-issues
  IssueFilterAttrs ->
  -- the GitLab issues
  GitLab [Issue]
groupIssues :: Group -> IssueFilterAttrs -> GitLab [Issue]
groupIssues Group
grp IssueFilterAttrs
attrs = do
  Either (Response ByteString) [Issue]
result <- forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
urlPath (IssueFilterAttrs -> [GitLabParam]
issueFilters IssueFilterAttrs
attrs)
  forall (m :: * -> *) a. Monad m => a -> m a
return (forall b a. b -> Either a b -> b
fromRight (forall a. HasCallStack => String -> a
error String
"groupsIssues error") Either (Response ByteString) [Issue]
result)
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        String
"/groups/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show (Group -> Int
group_id Group
grp)
          forall a. Semigroup a => a -> a -> a
<> String
"/issues"

-- result <- projectIssues' (project_id p) filters
-- return (fromRight (error "projectIssues error") result)

-- | Get a list of a project’s issues
projectIssues ::
  -- | the project
  Project ->
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues.html#list-issues
  IssueFilterAttrs ->
  -- the GitLab issues
  GitLab [Issue]
projectIssues :: Project -> IssueFilterAttrs -> GitLab [Issue]
projectIssues Project
p IssueFilterAttrs
filters = do
  Either (Response ByteString) [Issue]
result <- Int
-> IssueFilterAttrs
-> GitLab (Either (Response ByteString) [Issue])
projectIssues' (Project -> Int
project_id Project
p) IssueFilterAttrs
filters
  forall (m :: * -> *) a. Monad m => a -> m a
return (forall b a. b -> Either a b -> b
fromRight (forall a. HasCallStack => String -> a
error String
"projectIssues error") Either (Response ByteString) [Issue]
result)

-- | Get a list of a project’s issues
projectIssues' ::
  -- | the project ID
  Int ->
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues.html#list-issues
  IssueFilterAttrs ->
  -- | the GitLab issues
  GitLab (Either (Response BSL.ByteString) [Issue])
projectIssues' :: Int
-> IssueFilterAttrs
-> GitLab (Either (Response ByteString) [Issue])
projectIssues' Int
projectId IssueFilterAttrs
attrs =
  forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
urlPath (IssueFilterAttrs -> [GitLabParam]
issueFilters IssueFilterAttrs
attrs)
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
projectId
          forall a. Semigroup a => a -> a -> a
<> String
"/issues"

-- | Only for administrators. Get a single issue.
issue ::
  -- | issue ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
issue :: Int -> GitLab (Either (Response ByteString) (Maybe Issue))
issue Int
issId =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
urlPath []
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack
        String
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issId)

-- | gets all issues create by a user.
userIssues ::
  -- | the user
  User ->
  GitLab [Issue]
userIssues :: User -> GitLab [Issue]
userIssues User
usr =
  forall b a. b -> Either a b -> b
fromRight (forall a. HasCallStack => String -> a
error String
"userIssues error") forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
addr [GitLabParam]
params
  where
    addr :: Text
addr = Text
"/issues"
    params :: [GitLabParam]
    params :: [GitLabParam]
params =
      [ (ByteString
"author_id", forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack (forall a. Show a => a -> String
show (User -> Int
user_id User
usr))))),
        (ByteString
"scope", forall a. a -> Maybe a
Just ByteString
"all")
      ]

-- | Get a single project issue. If the project is private or the
-- issue is confidential, you need to provide credentials to
-- authorize.
projectIssue ::
  -- | Project
  Project ->
  -- | issue ID
  Int ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
projectIssue :: Project
-> Int -> GitLab (Either (Response ByteString) (Maybe Issue))
projectIssue Project
p Int
issId =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
urlPath []
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack
        String
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
p))
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issId)

-- | create a new issue.
newIssue ::
  -- | project
  Project ->
  -- | issue title
  Text ->
  -- | issue description
  Text ->
  -- | issue attributes
  IssueAttrs ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
newIssue :: Project
-> Text
-> Text
-> IssueAttrs
-> GitLab (Either (Response ByteString) (Maybe Issue))
newIssue Project
project =
  Int
-> Text
-> Text
-> IssueAttrs
-> GitLab (Either (Response ByteString) (Maybe Issue))
newIssue' (Project -> Int
project_id Project
project)

-- | create a new issue.
newIssue' ::
  -- | project ID
  Int ->
  -- | issue title
  Text ->
  -- | issue description
  Text ->
  -- | issue attributes
  IssueAttrs ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
newIssue' :: Int
-> Text
-> Text
-> IssueAttrs
-> GitLab (Either (Response ByteString) (Maybe Issue))
newIssue' Int
projectId Text
issueTitle Text
issueDescription IssueAttrs
attrs =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
dataBody
  where
    dataBody :: [GitLabParam]
    dataBody :: [GitLabParam]
dataBody =
      [ (ByteString
"title", forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
issueTitle)),
        (ByteString
"description", forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 Text
issueDescription))
      ]
        forall a. Semigroup a => a -> a -> a
<> Int -> IssueAttrs -> [GitLabParam]
issueAttrs Int
projectId IssueAttrs
attrs
    addr :: Text
addr =
      Text
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
projectId)
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues"

-- | edits an issue. see <https://docs.gitlab.com/ee/api/issues.html#edit-issue>
editIssue ::
  Project ->
  -- | issue ID
  IssueId ->
  -- | issue attributes
  IssueAttrs ->
  GitLab (Either (Response BSL.ByteString) Issue)
editIssue :: Project
-> Int -> IssueAttrs -> GitLab (Either (Response ByteString) Issue)
editIssue Project
prj Int
issueId IssueAttrs
editIssueReq = do
  let urlPath :: Text
urlPath =
        Text
"/projects/"
          forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
          forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
          forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)
  Either (Response ByteString) (Maybe Issue)
result <-
    forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPut
      Text
urlPath
      (Int -> IssueAttrs -> [GitLabParam]
issueAttrs (Project -> Int
project_id Project
prj) IssueAttrs
editIssueReq)
  case Either (Response ByteString) (Maybe Issue)
result of
    Left Response ByteString
resp -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a b. a -> Either a b
Left Response ByteString
resp)
    Right Maybe Issue
Nothing -> forall a. HasCallStack => String -> a
error String
"editIssue error"
    Right (Just Issue
iss) -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a b. b -> Either a b
Right Issue
iss)

-- | deletes an issue. see <https://docs.gitlab.com/ee/api/issues.html#delete-an-issue>
deleteIssue ::
  Project ->
  -- | issue ID
  IssueId ->
  GitLab (Either (Response BSL.ByteString) (Maybe ()))
deleteIssue :: Project -> Int -> GitLab (Either (Response ByteString) (Maybe ()))
deleteIssue Project
prj Int
issueId = do
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabDelete Text
issueAddr []
  where
    issueAddr :: Text
    issueAddr :: Text
issueAddr =
      Text
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)

-- | edits an issue. see <https://docs.gitlab.com/ee/api/issues.html#edit-issue>
reorderIssue ::
  Project ->
  -- | issue ID
  IssueId ->
  -- | The ID of a project’s issue that should be placed after this
  -- issue
  Int ->
  -- | The ID of a project’s issue that should be placed before this
  -- issue
  Int ->
  GitLab (Either (Response BSL.ByteString) Issue)
reorderIssue :: Project
-> Int -> Int -> Int -> GitLab (Either (Response ByteString) Issue)
reorderIssue Project
prj Int
issueId Int
moveAfterId Int
moveBeforeId = do
  let urlPath :: Text
urlPath =
        Text
"/projects/"
          forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
          forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
          forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)
          forall a. Semigroup a => a -> a -> a
<> Text
"/reorder"
  Either (Response ByteString) (Maybe Issue)
result <-
    forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPut
      Text
urlPath
      [ (ByteString
"move_after_id", forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack (forall a. Show a => a -> String
show Int
moveAfterId)))),
        (ByteString
"move_before_id", forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack (forall a. Show a => a -> String
show Int
moveBeforeId))))
      ]
  case Either (Response ByteString) (Maybe Issue)
result of
    Left Response ByteString
resp -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a b. a -> Either a b
Left Response ByteString
resp)
    Right Maybe Issue
Nothing -> forall a. HasCallStack => String -> a
error String
"reorderIssue error"
    Right (Just Issue
iss) -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a b. b -> Either a b
Right Issue
iss)

-- | Moves an issue to a different project. If a given label or
-- milestone with the same name also exists in the target project,
-- it’s then assigned to the issue being moved.
moveIssue ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  -- | The ID of the new project
  ProjectId ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
moveIssue :: Project
-> Int
-> Int
-> GitLab (Either (Response ByteString) (Maybe Issue))
moveIssue Project
prj Int
issueId Int
toPrjId =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
dataBody
  where
    dataBody :: [GitLabParam]
    dataBody :: [GitLabParam]
dataBody =
      [ (ByteString
"to_project_id", forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack (forall a. Show a => a -> String
show Int
toPrjId))))
      ]
    addr :: Text
addr =
      Text
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)
        forall a. Semigroup a => a -> a -> a
<> Text
"/move"

-- | Clone the issue to given project. Copies as much data as possible
-- as long as the target project contains equivalent labels,
-- milestones, and so on.
cloneIssue ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  -- | The ID of the new project
  ProjectId ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
cloneIssue :: Project
-> Int
-> Int
-> GitLab (Either (Response ByteString) (Maybe Issue))
cloneIssue Project
prj Int
issueId Int
toPrjId =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
dataBody
  where
    dataBody :: [GitLabParam]
    dataBody :: [GitLabParam]
dataBody =
      [ (ByteString
"to_project_id", forall a. a -> Maybe a
Just (Text -> ByteString
T.encodeUtf8 (String -> Text
T.pack (forall a. Show a => a -> String
show Int
toPrjId))))
      ]
    addr :: Text
addr =
      Text
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)
        forall a. Semigroup a => a -> a -> a
<> Text
"/clone"

-- | Subscribes the authenticated user to an issue to receive
-- notifications.
subscribeIssue ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
subscribeIssue :: Project
-> Int -> GitLab (Either (Response ByteString) (Maybe Issue))
subscribeIssue Project
prj Int
issueId =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
dataBody
  where
    dataBody :: [GitLabParam]
    dataBody :: [GitLabParam]
dataBody =
      []
    addr :: Text
addr =
      Text
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)
        forall a. Semigroup a => a -> a -> a
<> Text
"/subscribe"

-- | Unsubscribes the authenticated user from the issue to not receive
-- notifications from it.
unsubscribeIssue ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  GitLab (Either (Response BSL.ByteString) (Maybe Issue))
unsubscribeIssue :: Project
-> Int -> GitLab (Either (Response ByteString) (Maybe Issue))
unsubscribeIssue Project
prj Int
issueId =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
dataBody
  where
    dataBody :: [GitLabParam]
    dataBody :: [GitLabParam]
dataBody =
      []
    addr :: Text
addr =
      Text
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)
        forall a. Semigroup a => a -> a -> a
<> Text
"/unsubscribe"

-- | Get all the merge requests that are related to the issue.
createTodo ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  GitLab (Either (Response BSL.ByteString) (Maybe Todo))
createTodo :: Project
-> Int -> GitLab (Either (Response ByteString) (Maybe Todo))
createTodo Project
prj Int
issueId =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabPost Text
addr [GitLabParam]
dataBody
  where
    dataBody :: [GitLabParam]
    dataBody :: [GitLabParam]
dataBody =
      []
    addr :: Text
addr =
      Text
"/projects/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj))
        forall a. Semigroup a => a -> a -> a
<> Text
"/issues/"
        forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
issueId)
        forall a. Semigroup a => a -> a -> a
<> Text
"/todo"

-- | Get all the merge requests that are related to the issue.
issueMergeRequests ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  GitLab (Either (Response BSL.ByteString) [MergeRequest])
issueMergeRequests :: Project
-> Int -> GitLab (Either (Response ByteString) [MergeRequest])
issueMergeRequests Project
prj Int
issueId = do
  forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
urlPath []
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          forall a. Semigroup a => a -> a -> a
<> String
"/issues/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
issueId
          forall a. Semigroup a => a -> a -> a
<> String
"/related_merge_requests"

-- | get all merge requests that close a particular issue when merged.
issueMergeRequestsThatClose ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  GitLab (Either (Response BSL.ByteString) [MergeRequest])
issueMergeRequestsThatClose :: Project
-> Int -> GitLab (Either (Response ByteString) [MergeRequest])
issueMergeRequestsThatClose Project
prj Int
issueId = do
  forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
urlPath []
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          forall a. Semigroup a => a -> a -> a
<> String
"/issues/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
issueId
          forall a. Semigroup a => a -> a -> a
<> String
"/closed_by"

-- | get all merge requests that close a particular issue when merged.
issueParticipants ::
  -- | project
  Project ->
  -- | The internal ID of a project’s issue
  IssueId ->
  GitLab (Either (Response BSL.ByteString) [User])
issueParticipants :: Project -> Int -> GitLab (Either (Response ByteString) [User])
issueParticipants Project
prj Int
issueId = do
  forall a.
FromJSON a =>
Text -> [GitLabParam] -> GitLab (Either (Response ByteString) [a])
gitlabGetMany Text
urlPath []
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show (Project -> Int
project_id Project
prj)
          forall a. Semigroup a => a -> a -> a
<> String
"/issues/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
issueId
          forall a. Semigroup a => a -> a -> a
<> String
"/participants"

-- | Gets issues count statistics on all issues the authenticated user has access to.
issueStatisticsUser ::
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics
  IssueFilterAttrs ->
  -- | the issue statistics
  GitLab IssueStatistics
issueStatisticsUser :: IssueFilterAttrs -> GitLab IssueStatistics
issueStatisticsUser IssueFilterAttrs
attrs =
  forall a b. GitLab (Either a (Maybe b)) -> GitLab b
gitlabUnsafe (forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
urlPath (IssueFilterAttrs -> [GitLabParam]
issueFilters IssueFilterAttrs
attrs))
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack
        String
"/issues_statistics"

-- | Gets issues count statistics for a given group.
issueStatisticsGroup ::
  -- | the group
  Group ->
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics
  IssueFilterAttrs ->
  -- | the issue statistics
  GitLab IssueStatistics
issueStatisticsGroup :: Group -> IssueFilterAttrs -> GitLab IssueStatistics
issueStatisticsGroup Group
group IssueFilterAttrs
filters = do
  Either (Response ByteString) (Maybe IssueStatistics)
result <- Int
-> IssueFilterAttrs
-> GitLab (Either (Response ByteString) (Maybe IssueStatistics))
issueStatisticsGroup' (Group -> Int
group_id Group
group) IssueFilterAttrs
filters
  case Either (Response ByteString) (Maybe IssueStatistics)
result of
    Left Response ByteString
_s -> forall a. HasCallStack => String -> a
error String
"issueStatisticsGroup error"
    Right Maybe IssueStatistics
Nothing -> forall a. HasCallStack => String -> a
error String
"issueStatisticsGroup error"
    Right (Just IssueStatistics
stats) -> forall (m :: * -> *) a. Monad m => a -> m a
return IssueStatistics
stats

-- | Gets issues count statistics for a given group.
issueStatisticsGroup' ::
  -- | the group ID
  Int ->
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics
  IssueFilterAttrs ->
  -- | the issue statistics
  GitLab (Either (Response BSL.ByteString) (Maybe IssueStatistics))
issueStatisticsGroup' :: Int
-> IssueFilterAttrs
-> GitLab (Either (Response ByteString) (Maybe IssueStatistics))
issueStatisticsGroup' Int
groupId IssueFilterAttrs
attrs =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
urlPath (IssueFilterAttrs -> [GitLabParam]
issueFilters IssueFilterAttrs
attrs)
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        String
"/groups/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
groupId
          forall a. Semigroup a => a -> a -> a
<> String
"/issues_statistics"

-- | Gets issues count statistics for a given group.
issueStatisticsProject ::
  -- | the project
  Project ->
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics
  IssueFilterAttrs ->
  -- | the issue statistics
  GitLab IssueStatistics
issueStatisticsProject :: Project -> IssueFilterAttrs -> GitLab IssueStatistics
issueStatisticsProject Project
proj IssueFilterAttrs
filters = do
  Either (Response ByteString) (Maybe IssueStatistics)
result <- Int
-> IssueFilterAttrs
-> GitLab (Either (Response ByteString) (Maybe IssueStatistics))
issueStatisticsProject' (Project -> Int
project_id Project
proj) IssueFilterAttrs
filters
  case Either (Response ByteString) (Maybe IssueStatistics)
result of
    Left Response ByteString
_s -> forall a. HasCallStack => String -> a
error String
"issueStatisticsProject error"
    Right Maybe IssueStatistics
Nothing -> forall a. HasCallStack => String -> a
error String
"issueStatisticsProject error"
    Right (Just IssueStatistics
stats) -> forall (m :: * -> *) a. Monad m => a -> m a
return IssueStatistics
stats

-- | Gets issues count statistics for a given project.
issueStatisticsProject' ::
  -- | the project ID
  Int ->
  -- | filter the issues, see https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics
  IssueFilterAttrs ->
  -- | the issue statistics
  GitLab (Either (Response BSL.ByteString) (Maybe IssueStatistics))
issueStatisticsProject' :: Int
-> IssueFilterAttrs
-> GitLab (Either (Response ByteString) (Maybe IssueStatistics))
issueStatisticsProject' Int
projId IssueFilterAttrs
attrs =
  forall a.
FromJSON a =>
Text
-> [GitLabParam] -> GitLab (Either (Response ByteString) (Maybe a))
gitlabGetOne Text
urlPath (IssueFilterAttrs -> [GitLabParam]
issueFilters IssueFilterAttrs
attrs)
  where
    urlPath :: Text
urlPath =
      String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        String
"/projects/"
          forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
projId
          forall a. Semigroup a => a -> a -> a
<> String
"/issues_statistics"

-- | issue attributes.
data IssueAttrs = IssueAttrs
  { IssueAttrs -> Int
set_issue_id :: ProjectId,
    IssueAttrs -> Maybe Text
set_issue_title :: Maybe Text,
    IssueAttrs -> Maybe Text
set_issue_description :: Maybe Text,
    IssueAttrs -> Maybe Bool
set_issue_confidential :: Maybe Bool,
    IssueAttrs -> Maybe Int
set_issue_assignee_id :: Maybe Int,
    IssueAttrs -> Maybe [Int]
set_issue_assignee_ids :: Maybe [Int],
    IssueAttrs -> Maybe Int
set_issue_milestone_id :: Maybe Int,
    IssueAttrs -> Maybe [Text]
set_issue_labels :: Maybe [Text],
    IssueAttrs -> Maybe Text
set_issue_state_event :: Maybe Text,
    IssueAttrs -> Maybe UTCTime
set_issue_updated_at :: Maybe UTCTime,
    IssueAttrs -> Maybe UTCTime
set_issue_due_date :: Maybe UTCTime,
    IssueAttrs -> Maybe Int
set_issue_weight :: Maybe Int,
    IssueAttrs -> Maybe Bool
set_issue_discussion_locked :: Maybe Bool,
    IssueAttrs -> Maybe Int
set_issue_epic_id :: Maybe Int,
    IssueAttrs -> Maybe Int
set_issue_epic_iid :: Maybe Int
  }
  deriving (Int -> IssueAttrs -> ShowS
[IssueAttrs] -> ShowS
IssueAttrs -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IssueAttrs] -> ShowS
$cshowList :: [IssueAttrs] -> ShowS
show :: IssueAttrs -> String
$cshow :: IssueAttrs -> String
showsPrec :: Int -> IssueAttrs -> ShowS
$cshowsPrec :: Int -> IssueAttrs -> ShowS
Show)

-- | Attributes related to a project issue
data IssueFilterAttrs = IssueFilterAttrs
  { IssueFilterAttrs -> Maybe Int
issueFilter_assignee_id :: Maybe Int,
    IssueFilterAttrs -> Maybe String
issueFilter_assignee_username :: Maybe String,
    IssueFilterAttrs -> Maybe Int
issueFilter_author_id :: Maybe Int,
    IssueFilterAttrs -> Maybe String
issueFilter_author_username :: Maybe String,
    IssueFilterAttrs -> Maybe Bool
issueFilter_confidential :: Maybe Bool,
    IssueFilterAttrs -> Maybe UTCTime
issueFilter_created_after :: Maybe UTCTime,
    IssueFilterAttrs -> Maybe UTCTime
issueFilter_created_before :: Maybe UTCTime,
    IssueFilterAttrs -> Maybe DueDate
issueFilter_due_date :: Maybe DueDate,
    IssueFilterAttrs -> Maybe Int
issueFilter_iids :: Maybe Int,
    IssueFilterAttrs -> Maybe SearchIn
issueFilter_in :: Maybe SearchIn,
    IssueFilterAttrs -> Maybe Int
issueFilter_iteration_id :: Maybe Int,
    IssueFilterAttrs -> Maybe String
issueFilter_iteration_title :: Maybe String,
    IssueFilterAttrs -> Maybe String
issueFilter_milestone :: Maybe String,
    IssueFilterAttrs -> Maybe String
issueFilter_labels :: Maybe String,
    IssueFilterAttrs -> Maybe String
issueFilter_my_reaction_emoji :: Maybe String,
    IssueFilterAttrs -> Maybe Bool
issueFilter_non_archived :: Maybe Bool,
    IssueFilterAttrs -> Maybe OrderBy
issueFilter_order_by :: Maybe OrderBy,
    IssueFilterAttrs -> Maybe Scope
issueFilter_scope :: Maybe Scope,
    IssueFilterAttrs -> Maybe String
issueFilter_search :: Maybe String,
    IssueFilterAttrs -> Maybe SortBy
issueFilter_sort :: Maybe SortBy,
    IssueFilterAttrs -> Maybe IssueState
issueFilter_state :: Maybe IssueState,
    IssueFilterAttrs -> Maybe UTCTime
issueFilter_updated_after :: Maybe UTCTime,
    IssueFilterAttrs -> Maybe UTCTime
issueFilter_updated_before :: Maybe UTCTime,
    IssueFilterAttrs -> Maybe Bool
issueFilter_with_labels_details :: Maybe Bool
  }

issueAttrs :: Int -> IssueAttrs -> [GitLabParam]
issueAttrs :: Int -> IssueAttrs -> [GitLabParam]
issueAttrs Int
prjId IssueAttrs
filters =
  forall a. [Maybe a] -> [a]
catMaybes forall a b. (a -> b) -> a -> b
$
    [ forall a. a -> Maybe a
Just (ByteString
"id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
prjId))),
      (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"assignee_id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Int
set_issue_assignee_id IssueAttrs
filters,
      (\Text
t -> forall a. a -> Maybe a
Just (ByteString
"title", Text -> Maybe ByteString
textToBS Text
t)) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Text
set_issue_title IssueAttrs
filters,
      (\Text
t -> forall a. a -> Maybe a
Just (ByteString
"description", Text -> Maybe ByteString
textToBS Text
t)) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Text
set_issue_description IssueAttrs
filters,
      (\Bool
b -> forall a. a -> Maybe a
Just (ByteString
"confidential", Text -> Maybe ByteString
textToBS (Bool -> Text
showBool Bool
b))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Bool
set_issue_confidential IssueAttrs
filters,
      (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"milestone_id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Int
set_issue_milestone_id IssueAttrs
filters,
      (\[Text]
ts -> forall a. a -> Maybe a
Just (ByteString
"labels", Text -> Maybe ByteString
textToBS (Text -> [Text] -> Text
T.intercalate (String -> Text
T.pack String
",") [Text]
ts))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe [Text]
set_issue_labels IssueAttrs
filters,
      (\Text
t -> forall a. a -> Maybe a
Just (ByteString
"state_event", Text -> Maybe ByteString
textToBS Text
t)) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Text
set_issue_state_event IssueAttrs
filters,
      (\UTCTime
d -> forall a. a -> Maybe a
Just (ByteString
"updated_at", String -> Maybe ByteString
stringToBS (forall a. Show a => a -> String
show UTCTime
d))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe UTCTime
set_issue_updated_at IssueAttrs
filters,
      (\UTCTime
d -> forall a. a -> Maybe a
Just (ByteString
"due_date", String -> Maybe ByteString
stringToBS (forall a. Show a => a -> String
show UTCTime
d))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe UTCTime
set_issue_due_date IssueAttrs
filters,
      (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"weight", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Int
set_issue_weight IssueAttrs
filters,
      (\Bool
b -> forall a. a -> Maybe a
Just (ByteString
"discussion_locked", Text -> Maybe ByteString
textToBS (Bool -> Text
showBool Bool
b))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Bool
set_issue_discussion_locked IssueAttrs
filters,
      (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"epic_id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Int
set_issue_epic_id IssueAttrs
filters,
      (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"epic_iid", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueAttrs -> Maybe Int
set_issue_epic_iid IssueAttrs
filters
    ]
      forall a. Semigroup a => a -> a -> a
<> case IssueAttrs -> Maybe [Int]
set_issue_assignee_ids IssueAttrs
filters of
        Maybe [Int]
Nothing -> []
        Just [Int]
ids ->
          forall a b. (a -> b) -> [a] -> [b]
map
            (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"assignee_ids[]", String -> Maybe ByteString
stringToBS (forall a. Show a => a -> String
show Int
i)))
            [Int]
ids
  where
    -- <> (\is -> Just ("assignee_ids", arrayToBS is))
    -- =<< set_issue_assignee_ids filters

    textToBS :: Text -> Maybe ByteString
textToBS = forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8
    stringToBS :: String -> Maybe ByteString
stringToBS = forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack
    showBool :: Bool -> Text
    showBool :: Bool -> Text
showBool Bool
True = Text
"true"
    showBool Bool
False = Text
"false"

issueFilters :: IssueFilterAttrs -> [GitLabParam]
issueFilters :: IssueFilterAttrs -> [GitLabParam]
issueFilters IssueFilterAttrs
filters =
  forall a. [Maybe a] -> [a]
catMaybes
    [ (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"assignee_id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Int
issueFilter_assignee_id IssueFilterAttrs
filters,
      (\String
t -> forall a. a -> Maybe a
Just (ByteString
"assignee_username", Text -> Maybe ByteString
textToBS (String -> Text
T.pack String
t))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe String
issueFilter_assignee_username IssueFilterAttrs
filters,
      (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"author_id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Int
issueFilter_author_id IssueFilterAttrs
filters,
      (\String
i -> forall a. a -> Maybe a
Just (ByteString
"author_username", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show String
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe String
issueFilter_author_username IssueFilterAttrs
filters,
      (\Bool
b -> forall a. a -> Maybe a
Just (ByteString
"confidential", Text -> Maybe ByteString
textToBS (Bool -> Text
showBool Bool
b))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Bool
issueFilter_confidential IssueFilterAttrs
filters,
      (\UTCTime
t -> forall a. a -> Maybe a
Just (ByteString
"created_after", Text -> Maybe ByteString
textToBS (UTCTime -> Text
showTime UTCTime
t))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe UTCTime
issueFilter_created_after IssueFilterAttrs
filters,
      (\UTCTime
t -> forall a. a -> Maybe a
Just (ByteString
"created_before", Text -> Maybe ByteString
textToBS (UTCTime -> Text
showTime UTCTime
t))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe UTCTime
issueFilter_created_before IssueFilterAttrs
filters,
      (\DueDate
due -> forall a. a -> Maybe a
Just (ByteString
"due_date", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show DueDate
due)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe DueDate
issueFilter_due_date IssueFilterAttrs
filters,
      (\Int
iids -> forall a. a -> Maybe a
Just (ByteString
"iids[]", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
iids)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Int
issueFilter_iids IssueFilterAttrs
filters,
      (\SearchIn
issueIn -> forall a. a -> Maybe a
Just (ByteString
"assignee_id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show SearchIn
issueIn)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe SearchIn
issueFilter_in IssueFilterAttrs
filters,
      (\Int
i -> forall a. a -> Maybe a
Just (ByteString
"iteration_id", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Int
i)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Int
issueFilter_iteration_id IssueFilterAttrs
filters,
      (\String
s -> forall a. a -> Maybe a
Just (ByteString
"iteration_title", Text -> Maybe ByteString
textToBS (String -> Text
T.pack String
s))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe String
issueFilter_iteration_title IssueFilterAttrs
filters,
      (\String
s -> forall a. a -> Maybe a
Just (ByteString
"milestone", Text -> Maybe ByteString
textToBS (String -> Text
T.pack String
s))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe String
issueFilter_milestone IssueFilterAttrs
filters,
      (\String
s -> forall a. a -> Maybe a
Just (ByteString
"labels", Text -> Maybe ByteString
textToBS (String -> Text
T.pack String
s))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe String
issueFilter_labels IssueFilterAttrs
filters,
      (\String
s -> forall a. a -> Maybe a
Just (ByteString
"my_reaction_emoji", Text -> Maybe ByteString
textToBS (String -> Text
T.pack String
s))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe String
issueFilter_my_reaction_emoji IssueFilterAttrs
filters,
      (\Bool
b -> forall a. a -> Maybe a
Just (ByteString
"non_archived", Text -> Maybe ByteString
textToBS (Bool -> Text
showBool Bool
b))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Bool
issueFilter_non_archived IssueFilterAttrs
filters,
      (\OrderBy
x -> forall a. a -> Maybe a
Just (ByteString
"order_by", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show OrderBy
x)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe OrderBy
issueFilter_order_by IssueFilterAttrs
filters,
      (\Scope
x -> forall a. a -> Maybe a
Just (ByteString
"scope", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show Scope
x)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Scope
issueFilter_scope IssueFilterAttrs
filters,
      (\String
s -> forall a. a -> Maybe a
Just (ByteString
"search", Text -> Maybe ByteString
textToBS (String -> Text
T.pack String
s))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe String
issueFilter_search IssueFilterAttrs
filters,
      (\SortBy
x -> forall a. a -> Maybe a
Just (ByteString
"sort", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show SortBy
x)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe SortBy
issueFilter_sort IssueFilterAttrs
filters,
      (\IssueState
x -> forall a. a -> Maybe a
Just (ByteString
"state", Text -> Maybe ByteString
textToBS (String -> Text
T.pack (forall a. Show a => a -> String
show IssueState
x)))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe IssueState
issueFilter_state IssueFilterAttrs
filters,
      (\UTCTime
t -> forall a. a -> Maybe a
Just (ByteString
"updated_after", Text -> Maybe ByteString
textToBS (UTCTime -> Text
showTime UTCTime
t))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe UTCTime
issueFilter_updated_after IssueFilterAttrs
filters,
      (\UTCTime
t -> forall a. a -> Maybe a
Just (ByteString
"updated_before", Text -> Maybe ByteString
textToBS (UTCTime -> Text
showTime UTCTime
t))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe UTCTime
issueFilter_updated_before IssueFilterAttrs
filters,
      (\Bool
b -> forall a. a -> Maybe a
Just (ByteString
"with_labels_details", Text -> Maybe ByteString
textToBS (Bool -> Text
showBool Bool
b))) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IssueFilterAttrs -> Maybe Bool
issueFilter_with_labels_details IssueFilterAttrs
filters
    ]
  where
    textToBS :: Text -> Maybe ByteString
textToBS = forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
T.encodeUtf8
    showBool :: Bool -> Text
    showBool :: Bool -> Text
showBool Bool
True = Text
"true"
    showBool Bool
False = Text
"false"
    showTime :: UTCTime -> Text
    showTime :: UTCTime -> Text
showTime = String -> Text
T.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t. ISO8601 t => t -> String
iso8601Show

-- | When an issue is due
data DueDate
  = NoDueDate
  | Overdue
  | Week
  | Month
  | NextMonthPreviousTwoWeeks

instance Show DueDate where
  show :: DueDate -> String
show DueDate
NoDueDate = String
"0"
  show DueDate
Overdue = String
"overdue"
  show DueDate
Week = String
"week"
  show DueDate
Month = String
"month"
  show DueDate
NextMonthPreviousTwoWeeks = String
"next_month_and_previous_two_weeks"

-- | Is a project issues open or closed
data IssueState
  = IssueOpen
  | IssueClosed

instance Show IssueState where
  show :: IssueState -> String
show IssueState
IssueOpen = String
"opened"
  show IssueState
IssueClosed = String
"closed"

-- | No issue filters, thereby returning all issues. Default scope is "all".
defaultIssueFilters :: IssueFilterAttrs
defaultIssueFilters :: IssueFilterAttrs
defaultIssueFilters =
  Maybe Int
-> Maybe String
-> Maybe Int
-> Maybe String
-> Maybe Bool
-> Maybe UTCTime
-> Maybe UTCTime
-> Maybe DueDate
-> Maybe Int
-> Maybe SearchIn
-> Maybe Int
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe Bool
-> Maybe OrderBy
-> Maybe Scope
-> Maybe String
-> Maybe SortBy
-> Maybe IssueState
-> Maybe UTCTime
-> Maybe UTCTime
-> Maybe Bool
-> IssueFilterAttrs
IssueFilterAttrs forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing (forall a. a -> Maybe a
Just Scope
All) forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing

-- | issue attributes when creating or editing issues.
defaultIssueAttrs ::
  -- | project ID
  Int ->
  IssueAttrs
defaultIssueAttrs :: Int -> IssueAttrs
defaultIssueAttrs Int
prjId =
  Int
-> Maybe Text
-> Maybe Text
-> Maybe Bool
-> Maybe Int
-> Maybe [Int]
-> Maybe Int
-> Maybe [Text]
-> Maybe Text
-> Maybe UTCTime
-> Maybe UTCTime
-> Maybe Int
-> Maybe Bool
-> Maybe Int
-> Maybe Int
-> IssueAttrs
IssueAttrs Int
prjId forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing

$(deriveJSON defaultOptions {fieldLabelModifier = drop (T.length "set_issue_"), omitNothingFields = True} ''IssueAttrs)