in src/YouTrackSharp/Issues/IssuesService.cs [86:156]
public async Task<string> CreateIssue(string projectId, Issue issue)
{
if (string.IsNullOrEmpty(projectId))
{
throw new ArgumentNullException(nameof(projectId));
}
var apiIssue = new Generated.Issue
{
Project = new Project() {ShortName = projectId}
};
if (!string.IsNullOrEmpty(issue.Summary))
{
apiIssue.Summary = issue.Summary;
}
if (!string.IsNullOrEmpty(issue.Description))
{
apiIssue.Description = issue.Description;
}
var client = await _connection.GetAuthenticatedApiClient();
// Create and immediately update issue draft
var draft = await client.UsersMeDraftsAsync("id", new object());
draft = await client.IssuesPostAsync(draft.Id, false, "id", apiIssue);
var draftId = draft.Id;
// For every custom field, apply a command
var customFields = issue.Fields
.Where(field => !ReservedFields.Contains(field.Name.ToLower()))
.ToDictionary(field => field.Name, field => field.Value);
foreach (var customField in customFields)
{
if (!(customField.Value is string) && customField.Value is System.Collections.IEnumerable enumerable)
{
await ApplyCommand(draftId, $"{customField.Key} {string.Join(" ", enumerable.OfType<string>())}", string.Empty);
}
else switch (customField.Value)
{
case DateTime dateTime:
await ApplyCommand(draftId, $"{customField.Key} {dateTime:s}", string.Empty);
break;
case DateTimeOffset dateTimeOffset:
await ApplyCommand(draftId, $"{customField.Key} {dateTimeOffset:s}", string.Empty);
break;
default:
await ApplyCommand(draftId, $"{customField.Key} {customField.Value}", string.Empty);
break;
}
}
var response = await client.IssuesPostAsync__FromDraft(draftId, false, "id,idReadable", apiIssue);
var issueId = response.Id;
var issueIdReadable = response.IdReadable;
// Add comments?
foreach (var issueComment in issue.Comments)
{
await ApplyCommand(issueId, "comment", issueComment.Text, runAs: issueComment.Author);
}
// Add tags?
foreach (var issueTag in issue.Tags)
{
await ApplyCommand(issueId, $"tag {issueTag.Value}");
}
return issueIdReadable;
}