Добавление вложений

Здравствуйте. Не получается добавить вложение из одного issue в другой в рабочем процессе. 

Есть задача где я добавил 2 картинки вложения:



Вот код:

    const apiConnection = new http.Connection(yotrackEndpoint);
    apiConnection.addHeader('Content-Type', 'application/json');
    apiConnection.addHeader('Authorization', token);

    const dataRaw = [{ 
      name: 'fields',
      value: 'url,name'
    }];

    const resp = apiConnection.getSync(`issues/${ctx.issue.id}/attachments`, dataRaw); //получение вложений
    const parentIssue = JSON.parse(ctx.issue.links['depends on']);
    if (parentIssue.length) {  
      const attachments = JSON.parse(resp.response);
      const parentId = parentIssue[0].id;
      attachments.forEach(file => {
        let data = `{"name": "${file.name}","url": "${file.url}"}`;
        apiConnection.postSync(`issues/${parentId}/attachments`, [], data);
      });
    }

 

Этот код работает, но как то не корректно. Во первых вместо картинок я вижу какие то пустые заглушки

 

А во вторых добавляются не вложения а какие то ссылки на вложения которые не работают. При попытке их скачать ничего не происходит. При клике на вложение попадаю на страницу с таким сообщением:

В загрузках в браузере сообщеня что файл не доступен 

 

 

 

 

 

0
12 comments

Здравствуйте.

Меня зовут Лена, я постараюсь Вам помочь. 

Чтобы добавить вложения в задачу не обязательно использовать Connections. Для этого предусмотрен простой метод issue.addAttachment(). Соответственно, для получения всей информации о текущих вложениях надо использовать поля, описанные в сущности IssueAttachment (каждая задача хранит сет из вложений этого типа).

0

А можно поподробнее про функцию issue.addAttachment() Она принимает 4 параметра, первый из которых content это json в котором должен быть сам файл вложения в формате base64. Каким образом я могу его получить? поле attachm 

0

Вот корректная ссылка на метод: https://www.jetbrains.com/help/youtrack/devportal/v1-Issue.html#addAttachment

Первый параметр может быть в формате InputStream, String или JsonForIssueAddAttachment. В формате InputStream хранится IssueAttachment.content. Как пример, код может выглядеть так:

let attachment = ctx.issue.attachments.last();
newIssue.addAttachment(attachment.content, attachment.name, /*остальные параметры*/);

 

0

Спасибо огромное. Получилось. Моя вина. Не увидел что есть поле content в аттаче.

 И отдельное спасибо за функцию last(), которая даже не заявлена в документации. 

0

Я рада, что у Вас всё получилось! По поводу функции last(): ctx.issue.attachemnts имеет тип Set.<IssueAttachment>. Метод last() - это метод сета (Set), который позволяет взять последний элемент в сете: https://www.jetbrains.com/help/youtrack/devportal/v1-Set.html#last

0

А еще подскажите про добавление вложения в комментарии. В документации указано что у issue есть метод 

addComment

addComment(text, author)
первый параметр должен быть тип String а второй тип User. При этом указано что поле issue.comments представляет собой readonly Set типа IssueComment , и при этом у  IssueComment тоже есть метод addAttachment. Я не пойму как добавить вложение в комментарий. Ведь функция addComment принимает только строку и пользователя но не IssueComment.  Как то очень запутанно.
0

И еще вопрос про удаление. Как удалять вложения? Поле attachments только для чтения. Есть метод delete() в классе issueAttachment но я не понимаю как его применить. Он ничего не принимает. Как удалить именно нужное мне вложение?

В issue есть метод clearAttachments который удаляет все вложения. Но мне нужно удалить только одно определенное. Как это сделать?

 

0

Здравствуйте!

Извините за долгое ожидание. 

1. Про добавление вложения в комментарий: я рекомендую Вам использовать такую связку

issue.addComment(text, author).addAttachment(/*параметры вложения*/);

Метод addComment() возвращает комментарий, для которого вы вызываете метод addAttachment(). 

2. Про удаление вложения. Как я уже упоминала, attachments - это Set и для работы с вложениями Вам нужно использовать методы и поля, доступные в сете. Например, если Вам нужно удалить последнее вложение, то используйте следующую связку:

issue.attachments.last().delete();

где:

issue.attachments - это сет вложений (Set.<IssueAttachment>);

last() - это метод сета, возвращающий его последний элемент (в данном случае - последнее вложение типа IssueAttachment);

delete() - метод IssueAttachment, который удаляет конкретное вложение. 

 

 

0

А если мне нужно удалить вложение не последнее? Только перебором и поиском по назвагию и дате создания?

0

В сете есть метод find(). Он помогает найти первый элемент в сете, подходящий под заданные условия. Если вам нужно найти все элементы в сете подходящие под условия, я рекомендую использовать функцию перебора forEach().

0

Спасибо. Попробую разобраться с методом find(). В документации не нашел примера с его применением. А что выше по скорости find() или forEach?

0

Скорость напрямую зависит от Вашей конечной задачи. Оба метода проходят перебором по элементам. Метод find() ищет первое вхождение, удовлетворяющее условию, то есть перебор останавливается, когда такой элемент найден. Пример будет выглядеть так:

let toDelete = issue.attachments.find(function(attachment) {
  return attachment.name === 'DeleteMe';
});
toDelete.delete();

Метов forEach() делает полный прогон по всем данным и хорош тогда, когда Вам нужно найти не одно вхождение, а несколько.

0

Please sign in to leave a comment.