Skip to content

GroovyScriptGlobalObjectService

Ivan Mashintsev edited this page Jun 15, 2023 · 2 revisions

Inject to Global Object script

package ru.mail.jira.scripts.go

import ru.mail.jira.plugins.groovy.GroovyScriptGlobalObjectService

import ru.mail.jira.plugins.groovy.api.script.PluginModule
import ru.mail.jira.scripts.go.GlobalObject

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.user.ApplicationUser

public class GlobalObjectWithDependency {
    private final GroovyScriptGlobalObjectService injectedGo;

    public GlobalObjectWithDependency(@PluginModule GroovyScriptGlobalObjectService injectedGo) {
        this.injectedGo = injectedGo;
    }

    ApplicationUser getAdmin() {
        return injectedGo.getAdmin()
    }
}

Docs

package ru.mail.jira.plugins.groovy;

import com.atlassian.crowd.embedded.api.Group;
import com.atlassian.jira.bc.EntityNotFoundException;
import com.atlassian.jira.bc.project.component.ProjectComponent;
import com.atlassian.jira.exception.CreateException;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.issue.attachment.Attachment;
import com.atlassian.jira.issue.comments.Comment;
import com.atlassian.jira.issue.customfields.option.Option;
import com.atlassian.jira.issue.customfields.option.Options;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.index.IndexException;
import com.atlassian.jira.issue.index.IssueIndexingParams;
import com.atlassian.jira.issue.link.IssueLink;
import com.atlassian.jira.issue.search.SearchException;
import com.atlassian.jira.issue.status.Status;
import com.atlassian.jira.jql.parser.JqlParseException;
import com.atlassian.jira.project.Project;
import com.atlassian.jira.security.roles.ProjectRole;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.query.Query;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import javax.mail.MessagingException;
import org.ofbiz.core.entity.GenericEntityException;

public interface GroovyScriptGlobalObjectService {

  /**
   * Возвращает базовый url, на котором запущена используемая на текущий момент системы Jira.
   * */
  String getBaseUrl();

  /**
   * Возвращает количество issues по JQL.
   * Выполняется с учетом прав текущего пользователя.
   * @param jql : "project = TEST"
   * */
  long getCountIssuesByJQL(String jql) throws JqlParseException, SearchException;
  
  /**
   * Возвращает количество issues по JQL.
   * Выполняется с учетом прав пользователя.
   * @param jql : "project = TEST"
   * @param user : getUser("admin")
   * */
  long getCountIssuesByJQL(String jql, ApplicationUser user) throws SearchException, JqlParseException;

  /**
   * Возвращает issues по JQL.
   * Выполняется с учетом прав текущего пользователя.
   * @param jql : "project = TEST"
   * */
  Collection<Issue> getIssuesByJQL(String jql) throws JqlParseException, SearchException;

  /**
   * Возвращает issues по JQL.
   * Выполняется с учетом прав пользователя.
   * @param jql : "project = TEST"
   * @param user : getUser("admin")
   * */
  Collection<Issue> getIssuesByJQL(String jql, ApplicationUser user) throws JqlParseException, SearchException;
    
  /**
   * Возвращает issues по JQL в указанном диапазоне.
   * Выполняется с учетом прав текущего пользователя.
   * @param jql : "project = TEST"
   * @param user : getUser("admin")
   * @param startIndex : вернуть issues начиная с указанной позиции
   * @param endIndex : вернуть issues заканчивая указанной позиции
   * */
  Collection<Issue> getIssuesByJQL(String jql, ApplicationUser user, int startIndex, int endIndex)
      throws JqlParseException, SearchException;

  long getCountIssuesByJQL(Query query) throws SearchException;

  /**
   * Возвращает количество issues по JQL.
   * Выполняется с учетом прав пользователя.
   * @param query : "project = TEST"
   * @param user : getUser("admin")
   * */
  long getCountIssuesByJQL(Query query, ApplicationUser user) throws SearchException;

  /**
   * Возвращает количество issues по JQL.
   * Выполняется с учетом прав текущего пользователя.
   * @param query : parseQuery("project = TEST")
   * */
  Collection<Issue> getIssuesByJQL(Query query) throws SearchException;

  /**
   * Возвращает количество issues по JQL.
   * Выполняется с учетом прав пользователя.
   * @param query : parseQuery("project = TEST")
   * @param user : getUser("admin")
   * */
  Collection<Issue> getIssuesByJQL(Query query, ApplicationUser user) throws SearchException;

  /**
   * Возвращает issues по JQL в указанном диапазоне.
   * Выполняется с учетом прав текущего пользователя.
   * @param query : parseQuery("project = TEST")
   * @param user : getUser("admin")
   * @param startIndex : вернуть issues начиная с указанной позиции
   * @param endIndex : вернуть issues заканчивая указанной позиции
   * */
  Collection<Issue> getIssuesByJQL(Query query, ApplicationUser user, int startIndex, int endIndex)
      throws SearchException;

  /**
   * Возвращает запрос полученный в результате разбора строки jql.
   * @param jql : "project = TEST"
   * */
  Query parseQuery(String jql) throws JqlParseException;

  /**
   * Возвращает Attachments из issue.
   * @param issue : getIssue("TEST-1")
   * */
  Collection<Attachment> getAttachments(Issue issue);

  /**
   * Создает комментарий в issue.
   * Выполняется с учетом прав текущего пользователя.
   * Без отправки уведомлений.
   * @param issue : getIssue("TEST-1")
   * @param text : "test comment"
   * */
  Comment createComment(Issue issue, String text);

  /**
   * Создает комментарий в issue.
   * Выполняется с учетом прав пользователя.
   * Без отправки уведомлений.
   * @param issue : getIssue("TEST-1")
   * @param user : getUser("admin")
   * @param text : "test comment"
   * */
  Comment createComment(Issue issue, ApplicationUser user, String text);

  /**
   * Создает комментарий в issue.
   * Выполняется с учетом прав пользователя.
   * @param issue : getIssue("TEST-1")
   * @param user : getUser("admin")
   * @param text : "test comment"
   * @param notification : флаг отправки уведомлений
   * */
  Comment createComment(Issue issue, ApplicationUser user, String text, boolean notification);

  /**
   * Создает комментарий в issue.
   * Выполняется с учетом прав пользователя.
   * @param issue : getIssue("TEST-1")
   * @param user : getUser("admin")
   * @param text : "test comment"
   * @param groupLevel : ограничение видимости комментария группой
   * @param roleLevelId : ограничение видимости комментария ролью
   * @param notification : флаг отправки уведомлений
   * */
  Comment createComment(
      Issue issue, 
      ApplicationUser user, 
      String text, 
      String groupLevel, 
      Long roleLevelId, 
      boolean notification);

  /**
   * Возвращает список комментариев (оставленное пользователем текстовое сообщение).
   * @param issue : getIssue("TEST-1")
   * */
  Collection<String> getAllCommentsBody(Issue issue);

  /**
   * Возвращает список комментариев (как объектов).
   * @param issue : getIssue("TEST-1")
   * */
  Collection<Comment> getAllComments(Issue issue);

  /**
   * Возвращает список компонент из проекта.
   * @param project : getProject("TEST")
   * */
  Collection<ProjectComponent> getComponents(Project project);

  /**
   * Возвращает список компонент из проекта по id проекта.
   * @param projectId : 10001
   * */
  Collection<ProjectComponent> getComponents(Long projectId);

  /**
   * Возвращает компоненту из проекта по ее названию.
   * @param componentName : "component 1"
   * @param projectId : 10001
   * */
  ProjectComponent getComponent(String componentName, Long projectId);

  /**
   * Возвращает компоненту из проекта по ее названию.
   * @param componentName : "component 1"
   * @param project : getProject("TEST")
   * */
  ProjectComponent getComponent(String componentName, Project project);

  /**
   * Возвращает компоненту по ее id.
   * @param componentId : 10001
   * */
  ProjectComponent getComponent(Long componentId) throws EntityNotFoundException;

  /**
   * Проверяет, что в задаче есть компоненты.
   * @param issue : getIssue("TEST-1")
   * */
  boolean hasComponents(Issue issue);

  /**
   * Проверяет, что в задаче есть указанная компонента.
   * @param issue : getIssue("TEST-1")
   * @param component : getComponent("component 1",  getProject("TEST"))
   * */
  boolean hasComponent(Issue issue, ProjectComponent component);

  /**
   * Проверяет, что в задаче есть компонента с указанным названием.
   * @param issue : getIssue("TEST-1")
   * @param componentName : "component 1"
   * */
  boolean hasComponent(Issue issue, String componentName);

  /**
   * Проверяет, что в задаче есть компонента c указанным id.
   * @param issue : getIssue("TEST-1")
   * @param componentId : 10001
   * */
  boolean hasComponent(Issue issue, Long componentId);

  /**
   * Проверяет, что в задаче есть компоненты из списка.
   * @param issue : getIssue("TEST-1")
   * @param componentNames : ["component 1", "component 2"]
   * */
//    boolean hasComponents(Issue issue, Collection<String> componentNames)

  /**
   * Проверяет, что в задаче есть компоненты из списка.
   * @param issue : getIssue("TEST-1")
   * @param components : [getComponent(10001), getComponent(10002)]
   * */
  boolean hasComponents(Issue issue, Collection<ProjectComponent> components);

  //todo updateIssue
  //[customField: value]
  /**
   * Получает customField по id.
   * @param fieldId : 10001
   * */
  CustomField getCustomFieldObject(Long fieldId);

  /**
   * Получает customField по названию.
   * @param fieldName : "customfield_10001"
   * */
  CustomField getCustomFieldObject(String fieldName);

  /**
   * Получает значение customField из issue.
   * @param issue : getIssue("TEST-1")
   * @param fieldId : 10001
   * */
  Object gcfv(Issue issue, Long fieldId);

  /** Отправляет email.
   * @param emailAddr : "[email protected]"
   * @param copy - ящики которые нужно добавить в копию, указываются через запятую
   * @param subject - шаблон для заголовка сообщений
   * @param body - тело сообщения
   * @param from - адрес, который будет указан как отправитель этого сообщения. По умолчанию адрес JIRA
   * @param replyTo - адрес, на который будет отправлен ответ на письмо
   * @param emailFormat - "text/html" or "text/plain" or ...
   * */
  void sendEmail(
      String emailAddr,
      String copy,
      String subject,
      String body,
      String from,
      String replyTo,
      String emailFormat);

  /** Отправляет email.
   * @param emailAddr : "[email protected]"
   * @param copy - ящики которые нужно добавить в копию, указываются через запятую
   * @param subject - шаблон для заголовка сообщений
   * @param body - тело сообщения
   * @param from - адрес, который будет указан как отправитель этого сообщения. По умолчанию адрес JIRA
   * @param replyTo - адрес, на который будет отправлен ответ на письмо
   * @param emailFormat - "text/html" or "text/plain" or ...
   * @param attachments - list of attachments
   * */
  void sendEmail(
      String emailAddr,
      String copy,
      String subject,
      String body,
      String from,
      String replyTo,
      String emailFormat,
      List<Attachment> attachments)
      throws MessagingException;

  /**
   * Получает список групп, в которых состоит пользователь.
   * @param user : getUser("admin")
   * */
  Collection<Group> getGroupsForUser(ApplicationUser user);

  /**
   * Получает список пользователей, состоящих в группе (по ее имени).
   * @param groupName : "jira-users"
   * */
  Collection<ApplicationUser> getUsersInGroup(String groupName);

  /**
   * Получает список пользователей, состоящих в группе.
   * @param group : getGroup("jira-users")
   * */
  Collection<ApplicationUser> getUsersInGroup(Group group);

  /**
   * Получает группу по ее названию.
   * @param groupName : "jira-users"
   * */
  Group getGroup(String groupName);

  /**
   * Проверяет, что текущий пользователь состоит в группе (по ее имени).
   * @param groupName : "jira-users"
   * */
  boolean isCurrentUserInGroup(String groupName);

  /**
   * Проверяет, что текущий пользователь состоит в группе.
   * @param group : getGroup("jira-users")
   * */
  boolean isCurrentUserInGroup(Group group);

  /**
   * Проверяет, что указанный пользователь состоит в группе (по ее имени).
   * @param userName : "admin"
   * @param groupName : "jira-users"
   * */
  boolean isUserInGroup(String userName, String groupName);

  /**
   * Проверяет, что указанный пользователь состоит в группе.
   * @param user : getUser("admin")
   * @param group : getGroup("jira-users")
   * */
  boolean isUserInGroup(ApplicationUser user, Group group);

  /**
   * Проверяет, что указанный пользователь состоит в группе (по ее имени).
   * @param user : getUser("admin")
   * @param groupName : "jira-users"
   * */
  boolean isUserInGroup(ApplicationUser user, String groupName);

  /**
   * Получает статус по id.
   * @param statusId : "10001"
   * */
  Status getStatus(String statusId);

  /**
   * Получает предыдущий статус issue из истории.
   * @param issue : getIssue("TEST-1")
   * */
  Status getPreviousStatus(Issue issue);

  /**
   * Получает предыдущее значение поля для issue из истории.
   * @param customField : getCustomFieldObject(10001)
   * @param issue : getIssue("TEST-1")
   * */
  String getPreviousCustomFieldValue(CustomField customField, Issue issue);

  //todo getFromField
  /**
   * Получает предыдущего исполнителя для issue из истории.
   * @param issue : getIssue("TEST-1")
   * */
  ApplicationUser getPreviousAssigneeFromHistory(Issue issue);

  /**
   * Возвращает html код таблицы из переданных заголовков и строк.
   * @params heads: ["first","second","third"]
   * @params rows:
   *  def row1 = [1,2,3]
   *  def row2 = [2,2,3]
   *  def row3 = [3,2,3]
   *  def row4 = [4,2,3]
   *  def rows = [row1, row2, row3, row4]
   * @return getHTMLTable ( heads , rows )
   */
  String createHTMLTable(List<String> heads, List<List<String>> rows);

  //todo create Issue from json/map
  //todo createSubIssue
  //todo issue to map
  /**
   * Сохраняет изменения issue в базу данных.
   * Выполняется с учетом прав текущего пользователя.
   * Без уведомлений.
   * @param issue : getIssue("TEST-1")
   * */
  Issue update(MutableIssue issue) throws IndexException;

  /**
   * Сохраняет изменения issue в базу данных.
   * Выполняется с учетом прав пользователя.
   * Без уведомлений.
   * @param user : getUser("admin")
   * @param issue : getIssue("TEST-1")
   * */
  Issue update(ApplicationUser user, MutableIssue issue) throws IndexException;

  /**
   * Сохраняет изменения issue в базу данных.
   * Выполняется с учетом прав пользователя.
   * @param user : getUser("admin")
   * @param issue : getIssue("TEST-1")
   * @param notification : флаг отправки уведомлений
   * */
  Issue update(ApplicationUser user, MutableIssue issue, boolean notification) throws IndexException;

  /**
   * Получает issue по id.
   * @param issueId : 10001
   * */
  Issue getIssue(Long issueId);

  /**
   * Получает issue по key.
   * @param issueKey : "TEST-1"
   * */
  Issue getIssue(String issueKey);

  /**
   * Связывает задачи указанным типом связи.
   * Связи ориентированные.
   * Выполняется с учетом прав текущего пользователя.
   * @param fromIssue : getIssue("TEST-1")
   * @param toIssue : getIssue("TEST-1")
   * @param issueLinkTypeId : 10001
   * */
  void createLink(Issue fromIssue, Issue toIssue, Long issueLinkTypeId) throws CreateException;

  /**
   * Связывает задачи указанным типом связи.
   * Связи ориентированные.
   * Выполняется с учетом прав текущего пользователя.
   * @param fromIssue : getIssue("TEST-1")
   * @param toIssue : getIssue("TEST-1")
   * @param issueLinkTypeId : 10001
   * @param sequence : 0 - номер позиции новой связи в исходной issue
   * */
  void createLink(Issue fromIssue, Issue toIssue, Long issueLinkTypeId, Long sequence) throws CreateException;

  /**
   * Связывает задачи указанным типом связи.
   * Связи ориентированные.
   * Выполняется с учетом прав пользователя.
   * @param fromIssue : getIssue("TEST-1")
   * @param toIssue : getIssue("TEST-1")
   * @param issueLinkTypeId : 10001
   * @param sequence : 0 - номер позиции новой связи в исходной issue
   * */
  void createLink(
      Issue fromIssue,
      Issue toIssue,
      Long issueLinkTypeId,
      Long sequence,
      ApplicationUser user) throws CreateException;

  /**
   * Получает список issues, которые ссылаются на указанную issue определенным типом связи.
   * @param issue : getIssue("TEST-1")
   * @param linkTypeId : 10001
   * */
  Collection<Issue> getInwardIssues(Issue issue, long linkTypeId);

  /**
   * Получает список issues, на которые ссылается указанная issue определенным типом связи.
   * @param issue : getIssue("TEST-1")
   * @param linkTypeId : 10001
   * */
  Collection<Issue> getOutwardIssues(Issue issue, long linkTypeId);

  /**
   * Получает список issues, связанных с issue определенным типом связи.
   * @param issue : getIssue("TEST-1")
   * @param linkTypeId : 10001
   * */
  Collection<Issue> getAllLinkedIssues(Issue issue, long linkTypeId);

  /**
   * Получает список issues, ссылающихся на указанную issue.
   * @param issue : getIssue("TEST-1")
   * */
  Collection<Issue> getInwardIssues(Issue issue);

  /**
   * Получает список issues, на которые ссылается указанная issue.
   * @param issue : getIssue("TEST-1")
   * */
  Collection<Issue> getOutwardIssues(Issue issue);

  /**
   * Получает список issues, связанных с issue.
   * @param issue : getIssue("TEST-1")
   * */
  Collection<Issue> getAllLinkedIssues(Issue issue);

  /**
   * Получает список исходящих связей.
   * @param issue : getIssue("TEST-1")
   * */
  Collection<IssueLink> getOutwardLinks(Issue issue);

  /**
   * Получает список входящих связей.
   * @param issue : getIssue("TEST-1")
   * */
  Collection<IssueLink> getInwardLinks(Issue issue);

  /**
   * Получает Option по id.
   * @param optionId : 10001
   * */
  Option getOptionById(Long optionId);

  /**
   * Получает все Options по текстовому значению.
   * @param value : "option name 1"
   * */
  Collection<Option> getOptionsByValue(String value);

  /**
   * Получает все список опций для поля в указанном issue.
   * Смотрится соответствующий контекст поля.
   * @param customField : getCustomFieldObject(10001)
   * @param issue : getIssue("TEST-1")
   * */
  Options getOptionsFor(CustomField customField, Issue issue);

  /**
   * Получает project по id.
   * @param projectId : 10001
   * */
  Project getProject(Long projectId);

  /**
   * Получает project по key.
   * @param projectKey : "TEST"
   * @return объект проект
   * */
  Project getProject(String projectKey);

  /**
   * Получает список всех projects.
   * */
  Collection<Project> getAllProjects();

  /**
   * Реиндексирует список issues.
   * @param issues : [getIssue("TEST-2"), getIssue("TEST-2")]
   * */
  Collection<Issue> reIndex(Collection<Issue> issues) throws IndexException;

  /**
   * Реиндексирует список issues.
   * @param issues : [getIssue("TEST-2"), getIssue("TEST-2")]
   * @param params : IssueIndexingParams.INDEX_ALL
   * */
  Collection<Issue> reIndex(Collection<Issue> issues, IssueIndexingParams params) throws IndexException;

  /**
   * Реиндексирует issue.
   * @param issue : getIssue("TEST-2")
   * */
  Issue reIndex(Issue issue) throws IndexException;

  /**
   * Выполняет GET запрос по указанному URL.
   * Возвращает ответ в виде json объекта.
   * */
  Object GET(String url) throws IOException;

  /**
   * Выполняет POST запрос по указанному URL.
   * Возвращает ответ в виде json объекта.
   * */
  Object POST(String url, String content, String userName, String password) throws IOException;

  /**
   * Выполняет PUT запрос по указанному URL.
   * Возвращает ответ в виде json объекта.
   * */
  Object PUT(String url, String content, String userName, String password) throws IOException;

  /**
   * Выполняет GET запрос по указанному URL.
   * Возвращает ответ в виде json объекта.
   * */
  Object GET(String url, String userName, String password) throws IOException;

  /**
   * Парсит текст в json объект.
   * @param text : "{"name": "Ivan"}"
   * */
  Object parseJSON(String text);

  /**
   * Конвертирует объект в json строку.
   * */
  String toJson(Object obj);

  /**
   * Проверяет, что указанный пользователь установлен в соответствующей роли на проекте.
   * @param user : getUser("admin")
   * @param projectRole : "ADMINISTRATORS"
   * @param project : getProject("TEST")
   * */
  boolean isUserInProjectRole(ApplicationUser user, String projectRole, Project project);

  /**
   * Проверяет, что указанный пользователь установлен в соответствующей роли на проекте.
   * @param user : getUser("admin")
   * @param projectRole : getProjectRole("ADMINISTRATORS")
   * @param project : getProject("TEST")
   * */
  boolean isUserInProjectRole(ApplicationUser user, ProjectRole projectRole, Project project);

  /**
   * Получает список ролей в проекте для указанного пользователя.
   * @param user : getUser("admin")
   * @param project : getProject("TEST")
   * */
  Collection<ProjectRole> getRolesForUser(ApplicationUser user, Project project);

  /**
   * Получает список пользователей в проекте для указанной роли.
   * @param project : getProject("TEST")
   * @param role : "ADMINISTRATORS"
   * */
  Collection<ApplicationUser> getUsersOnProjectRole(Project project, String role);

  /**
   * Получает список пользователей в проекте для указанной роли.
   * @param project : getProject("TEST")
   * @param role : getProjectRole("ADMINISTRATORS")
   * */
  Collection<ApplicationUser> getUsersOnProjectRole(Project project, ProjectRole role);

  /**
   * Получает проектную роль по названию.
   * @param projectRoleName : "ADMINISTRATORS"
   * */
  ProjectRole getProjectRole(String projectRoleName);

  /**
   * Получает все проектные роли.
   * */
  Collection<ProjectRole> getAllRoles();

  /**
   * Ищет пользователя по почте.
   * */
  ApplicationUser findUserByEmail(String email);

  /**
   * Выполняет указанный переход с учетом прав текущего пользователя.
   * @param issue : getIssue("TEST-1")
   * @param actionId : 121
   * */
  boolean doTransition(MutableIssue issue, int actionId) throws GenericEntityException;

  /**
   * Выполняет указанный переход с учетом прав указанного пользователя.
   * @param issue : getIssue("TEST-1")
   * @param actionId : 121
   * @param user : getUser("admin")
   * */
  boolean doTransition(MutableIssue issue, int actionId, ApplicationUser user) throws GenericEntityException;

  /**
   * Возвращает пользователя по логину: jellyrunner .
   * */
  ApplicationUser getJellyrunner();

  /**
   * Возвращает пользователя по указанному логину.
   * @param userName : "admin"
   * */
  ApplicationUser getUser(String userName);

  /**
   * Возвращает пользователя по userKey.
   * @param userKey : "[email protected]"
   * */
  ApplicationUser getUserByKey(String userKey);

  /**
   * Возвращает список наблюдателей за issue.
   * @param issue : getIssue("TEST-1")
   * */
  Collection<ApplicationUser> getAllWatchers(Issue issue);

  /**
   * Убирает пользователя из наблюдателей.
   * @param user : getUser("admin")
   * @param issue : getIssue("TEST-1")
   * */
  Issue stopWatching(ApplicationUser user, Issue issue);

  /**
   * Добавляет пользователя в наблюдатели.
   * @param user : getUser("admin")
   * @param issue : getIssue("TEST-1")
   * */
  Issue startWatching(ApplicationUser user, Issue issue);

  void setCheckBox(MutableIssue issue, long fieldId, List<Long> optionsId);

  void setMultiSelectList(MutableIssue issue, long fieldId, List<Long> optionsId);

  void setSingleSelectList(MutableIssue issue, long fieldId, long optionId);

  void setCascadeSelectList(MutableIssue issue, long fieldId, long parentOptionId, long childOptionId);

}
Clone this wiki locally