Получение значений из custom field в YoutrackSharp

Answered

Добрый день,

Каким образом можно вытащить значения custom field определенного проекта через YoutrackSharp или Rest API?

Например, при запросе:

_connection.ProjectCustomFieldsService().GetProjectCustomField(projectKey, "State")

приходит ответ

{YouTrackSharp.Projects.CustomField}
CanBeEmpty: false
EmptyText: "No State"
Name: "State"
Type: "state[1]"
Url: ".../rest/admin/project/Test/customfield/State"

Однако там нет значений, при попытке сделать запрос через 

_connection.GetAuthenticatedHttpClient().Result.GetAsync("rest/admin/project/Test/customfield/State") мы получаем только описание класса с дефолтными значениями, но не теми, что задаются и были добавлены на сервере.

При этом если зайти на сервер и открыть список статусов, то в консоле увидим, что запрос уходит примерно такой:

.../api/admin/customFieldSettings/bundles/enum/78-0/values?fields=name

Но в REST API у нас нет данных об id полей. При добавлении /values в конец rest api получаем 404.

Хотелось бы иметь такой метод в шарповом клиенте, чтобы обратиться примерно так:

_connection.ProjectCustomFieldsService().GetProjectCustomField(projectKey, "State").Values

и получить массив значений, например, такой:

Show-stopper
Critical
Major
Normal
Minor
+ кастомные значения

Или сделать тоже самое через REST API и для любых кастомных полей.

Есть идеи, как это можно сделать?

2 comments
Comment actions Permalink
Official comment

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

Как Вы, наверное, знаете недавно в YouTrack мы зарелизили новый REST API. YouTrackSharp, к сожалению, в настоящее время использует старый REST API. Также функциональность YouTrackSharp не полностью покрывает возможности нового реста. Поэтому рекомендуется использовать в приложениях напрямую новый REST API. Ниже Вы найдете пример кода для получения кастом филдов проекта и значений кастом филда с именем “Type”.

 

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using YouTrackSharp;

namespace ConsoleApplication
{
internal class Program
{
public static void Main(string[] args)
{
var connection = new UsernamePasswordConnection("http://localhost:8080/", "root", "root");
var client = connection.GetAuthenticatedHttpClient().Result;

var exampleProjectId = "0-0";
var getFieldsResponse = client.GetAsync($"api/admin/projects/{exampleProjectId}/fields?fields=$type,field($type,name),bundle($type,id)").Result;
getFieldsResponse.EnsureSuccessStatusCode();
var fieldsContent = getFieldsResponse.Content.ReadAsStringAsync().Result;
var fieldsCollection = JsonConvert.DeserializeObject<ICollection<ProjectCustomField>>(fieldsContent);
var fieldId = fieldsCollection.FirstOrDefault(projectCustomField => projectCustomField.CustomField.Name == "Type")?.Bundle.Id;

var request = $"api/admin/customFieldSettings/bundles/enum/{fieldId}/values?fields=$type,archived,name,id";
var getFieldValuesResponse = client.GetAsync(request).Result;
getFieldValuesResponse.EnsureSuccessStatusCode();
var getFieldValuesContent = getFieldValuesResponse.Content.ReadAsStringAsync().Result;
var valuesCollection = JsonConvert.DeserializeObject<ICollection<ProjectCustomFieldValue>>(getFieldValuesContent);
foreach(ProjectCustomFieldValue value in valuesCollection) {
Console.WriteLine(value.Name);
}
}
}

internal class ProjectCustomField
{
public ProjectCustomField()
{
Type = string.Empty;
CustomField = new CustomField();
Bundle = new Bundle();
}

[JsonProperty("$type")]
public string Type { get; set; }

[JsonProperty("bundle")]
public Bundle Bundle { get; set; }

[JsonProperty("field")]
public CustomField CustomField { get; set; }
}

internal class CustomField
{
public CustomField()
{
Type = string.Empty;
Name = string.Empty;
}

[JsonProperty("$type")]
public string Type { get; set; }

[JsonProperty("name")]
public string Name { get; set; }
}

internal class Bundle
{
public Bundle()
{
Type = string.Empty;
Id = string.Empty;
}

[JsonProperty("$type")]
public string Type { get; set; }

[JsonProperty("id")]
public string Id { get; set; }
}

internal class ProjectCustomFieldValue
{
public ProjectCustomFieldValue()
{
Type = string.Empty;
Name = string.Empty;
Archived = false;
Id = string.Empty;
}

[JsonProperty("$type")]
public string Type { get; set; }

[JsonProperty("name")]
public string Name { get; set; }

[JsonProperty("id")]
public string Id { get; set; }

[JsonProperty("archived")]
public bool Archived { get; set; }
}
}

 

Вывод программы:

 

Bug
Epic
User Story
Task

 

Ссылка на документацию: https://www.jetbrains.com/help/youtrack/standalone/youtrack-rest-api-reference.html

Comment actions Permalink

Ок, спасибо

0

Please sign in to leave a comment.