Examples

This section provides examples for using the GitLab Discussions feature.

Creating a discussion

To create a discussion, you can use the Discussions::CreateService. This service takes a number of options, including:

  • title: The title of the discussion.
  • body: The body of the discussion.
  • project: The project where the discussion should be created.
  • author: The user who is creating the discussion.
  • private: Whether the discussion should be private or public.
discussion = Discussions::CreateService.new(project, current_user, title: "Example Discussion", body: "This is an example discussion.")
                                                    .execute
          
          # The `discussion` variable will contain the newly created discussion.
          

Adding a comment

To add a comment to a discussion, you can use the Discussions::CreateCommentService. This service takes a number of options, including:

  • discussion: The discussion to which the comment should be added.
  • body: The body of the comment.
  • author: The user who is adding the comment.
comment = Discussions::CreateCommentService.new(discussion, current_user, body: "This is an example comment.")
                                                  .execute
          
          # The `comment` variable will contain the newly created comment.
          

Voting on a discussion or comment

To vote on a discussion or comment, you can use the Discussions::VoteService. This service takes a number of options, including:

  • votable: The discussion or comment to be voted on.
  • user: The user who is voting.
  • vote: The type of vote, either upvote or downvote.
# Upvote a discussion
          Discussions::VoteService.new(discussion, current_user, vote: 'upvote').execute
          
          # Downvote a comment
          Discussions::VoteService.new(comment, current_user, vote: 'downvote').execute
          

Marking a discussion as resolved

To mark a discussion as resolved, you can use the Discussions::MarkAsResolvedService. This service takes a number of options, including:

  • discussion: The discussion to be marked as resolved.
  • author: The user who is marking the discussion as resolved.
Discussions::MarkAsResolvedService.new(discussion, current_user).execute
          

Unmarking a discussion as resolved

To unmark a discussion as resolved, you can use the Discussions::MarkAsUnresolvedService. This service takes a number of options, including:

  • discussion: The discussion to be unmarked as resolved.
  • author: The user who is unmarking the discussion as resolved.
Discussions::MarkAsUnresolvedService.new(discussion, current_user).execute
          

Closing a discussion

To close a discussion, you can use the Discussions::CloseService. This service takes a number of options, including:

  • discussion: The discussion to be closed.
  • author: The user who is closing the discussion.
Discussions::CloseService.new(discussion, current_user).execute
          

Reopening a discussion

To reopen a discussion, you can use the Discussions::ReopenService. This service takes a number of options, including:

  • discussion: The discussion to be reopened.
  • author: The user who is reopening the discussion.
Discussions::ReopenService.new(discussion, current_user).execute
          

Subscribing to a discussion

To subscribe to a discussion, you can use the Discussions::SubscribeService. This service takes a number of options, including:

  • discussion: The discussion to be subscribed to.
  • user: The user who is subscribing.
Discussions::SubscribeService.new(discussion, current_user).execute
          

Unsubscribing from a discussion

To unsubscribe from a discussion, you can use the Discussions::UnsubscribeService. This service takes a number of options, including:

  • discussion: The discussion to be unsubscribed from.
  • user: The user who is unsubscribing.
Discussions::UnsubscribeService.new(discussion, current_user).execute
          

Viewing a discussion

To view a discussion, you can use the Discussions::ShowService. This service takes a number of options, including:

  • discussion: The discussion to be viewed.
discussion = Discussions::ShowService.new(discussion).execute
          

Updating a discussion

To update a discussion, you can use the Discussions::UpdateService. This service takes a number of options, including:

  • discussion: The discussion to be updated.
  • title: The new title of the discussion.
  • body: The new body of the discussion.
Discussions::UpdateService.new(discussion, title: "New title", body: "New body").execute
          

Deleting a discussion

To delete a discussion, you can use the Discussions::DestroyService. This service takes a number of options, including:

  • discussion: The discussion to be deleted.
Discussions::DestroyService.new(discussion).execute
          

Finding discussions

To find discussions, you can use the DiscussionsFinder class. This class provides a number of methods for finding discussions, including:

  • by_project: Find discussions for a given project.
  • by_author: Find discussions by a given author.
  • by_title: Find discussions with a given title.
# Find all discussions for a given project
          DiscussionsFinder.new(project).execute
          
          # Find all discussions by a given author
          DiscussionsFinder.new.by_author(current_user).execute
          
          # Find all discussions with a given title
          DiscussionsFinder.new.by_title("Example Discussion").execute
          

Filtering discussions

To filter discussions, you can use the DiscussionsFilter class. This class provides a number of methods for filtering discussions, including:

  • resolved: Find discussions that are resolved.
  • unresolved: Find discussions that are unresolved.
  • closed: Find discussions that are closed.
  • opened: Find discussions that are open.
# Find all resolved discussions
          DiscussionsFilter.new.resolved
          
          # Find all unresolved discussions
          DiscussionsFilter.new.unresolved
          
          # Find all closed discussions
          DiscussionsFilter.new.closed
          
          # Find all open discussions
          DiscussionsFilter.new.opened
          

Sorting discussions

To sort discussions, you can use the DiscussionsSorter class. This class provides a number of methods for sorting discussions, including:

  • created_at: Sort discussions by creation date.
  • updated_at: Sort discussions by update date.
  • votes: Sort discussions by number of votes.
# Sort discussions by creation date
          DiscussionsSorter.new.created_at
          
          # Sort discussions by update date
          DiscussionsSorter.new.updated_at
          
          # Sort discussions by number of votes
          DiscussionsSorter.new.votes
          

Working with discussions within a project

Discussions can also be found and manipulated within a project.

# Find discussions for a given project
          project.discussions
          
          # Create a discussion for a project
          project.discussions.create(title: "Example Discussion", body: "This is an example discussion.")
          
          # Find comments on a discussion in a project
          discussion.comments
          

Example: Creating a Discussion and Comment

# Create a new discussion in a project
          discussion = Discussions::CreateService.new(project, current_user, title: "Example Discussion", body: "This is an example discussion.")
                                                    .execute
          
          # Add a comment to the newly created discussion
          comment = Discussions::CreateCommentService.new(discussion, current_user, body: "This is an example comment.")
                                                  .execute
          

Example: Finding Discussions

# Find all discussions in a project
          project.discussions
          
          # Find all discussions by a specific author
          DiscussionsFinder.new.by_author(current_user).execute
          
          # Find all discussions with a specific title
          DiscussionsFinder.new.by_title("Example Discussion").execute
          
          # Find all resolved discussions
          DiscussionsFilter.new.resolved
          
          # Find all unresolved discussions
          DiscussionsFilter.new.unresolved
          
          # Find all closed discussions
          DiscussionsFilter.new.closed
          
          # Find all open discussions
          DiscussionsFilter.new.opened
          

Example: Voting on a Discussion

# Upvote a discussion
          Discussions::VoteService.new(discussion, current_user, vote: 'upvote').execute
          
          # Downvote a discussion
          Discussions::VoteService.new(discussion, current_user, vote: 'downvote').execute
          

Example: Marking a Discussion as Resolved

# Mark a discussion as resolved
          Discussions::MarkAsResolvedService.new(discussion, current_user).execute
          

Example: Closing a Discussion

# Close a discussion
          Discussions::CloseService.new(discussion, current_user).execute
          

Example: Subscribing to a Discussion

# Subscribe to a discussion
          Discussions::SubscribeService.new(discussion, current_user).execute
          

Example: Updating a Discussion

# Update a discussion
          Discussions::UpdateService.new(discussion, title: "New title", body: "New body").execute
          

Example: Deleting a Discussion

# Delete a discussion
          Discussions::DestroyService.new(discussion).execute