in src/YouTrackSharp/Issues/Issue.cs [54:360]
internal static Issue FromApiEntity(Generated.Issue entity, bool wikify = false, bool wikifyContents = false)
{
var issue = new Issue
{
Id = entity.IdReadable,
EntityId = entity.Id,
JiraId = entity.ExternalIssue?.Id,
Summary = entity.Summary,
Description = wikify ? entity.WikifiedDescription : entity.Description,
IsMarkdown = true,
Comments = entity.Comments?.Select(comment => Comment.FromApiEntity(comment, wikifyContents)).ToList(),
Tags = entity.Tags?.Select(tag => new SubValue<string>(){Value=tag.Name})
};
if (entity.Watchers.HasStar ?? false)
{
var starTag = new SubValue<string>() {Value = "Star"};
var tags = new List<SubValue<string>>();
if (issue.Tags != null)
{
tags.AddRange(issue.Tags);
}
tags.Add(starTag);
issue.Tags = tags;
}
issue.SetField("projectShortName", entity.Project.ShortName);
issue.SetField("numberInProject", entity.NumberInProject);
issue.SetField("wikified", wikify);
issue.SetField("created", entity.Created);
issue.SetField("reporterName", entity.Reporter.Login);
issue.SetField("reporterFullName", entity.Reporter.FullName);
issue.SetField("updated", entity.Updated);
issue.SetField("updaterName", entity.Updater.Login);
issue.SetField("updaterFullName", entity.Updater.FullName);
issue.SetField("commentsCount", entity.CommentsCount);
issue.SetField("votes", entity.Votes);
if (entity.Resolved != null)
{
issue.SetField("resolved", entity.Resolved);
}
if (entity.Attachments != null && entity.Attachments.Any())
{
var rawValue =
entity.Attachments.Select(a => new AttachmentStub() {Id = a.Id, Value = a.Name, Url = a.Url});
issue._fields["attachments"] = new Field {Name = "attachments", Value = JArray.FromObject(rawValue)};
}
if (entity.Visibility.GetType() == typeof(LimitedVisibility))
{
var visibility = (LimitedVisibility)entity.Visibility;
if (visibility.PermittedGroups.Any())
{
issue._fields["permittedGroup"] = new Field()
{
Name = "permittedGroup",
Value = visibility.PermittedGroups.First().Name
};
}
}
var links = Link.FromApiEntities(entity.Links, entity.IdReadable);
if (links.Any())
{
var rawValue = links.Select(l => new IssueLinkStub()
{
Value =
l.Source.Equals(entity.IdReadable, StringComparison.InvariantCultureIgnoreCase)
? l.Target
: l.Source,
Type = l.TypeName,
Role = l.Source.Equals(entity.IdReadable, StringComparison.InvariantCultureIgnoreCase)
? l.OutwardType
: l.InwardType
});
issue.SetField("links", JArray.FromObject(rawValue));
}
foreach (var customField in entity.CustomFields)
{
switch (customField)
{
//TODO somehow if we skip block for DateIssueCustomField, it won't be processed
// even though it's a descendant of SimpleIssueCustomField
case DateIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.ToString()};
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = rawValue, ValueId = JArray.FromObject(rawValue)
};
}
break;
case SimpleIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.ToString()};
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = rawValue, ValueId = JArray.FromObject(rawValue)
};
}
break;
case PeriodIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Id.Substring(1, f.Value.Id.Length - 1).ToLower()};
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = new List<string>() {(f.Value.Minutes ?? 0).ToString()},
ValueId = JArray.FromObject(rawValue)
};
}
break;
case TextIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {wikifyContents ? f.Value.MarkdownText : f.Value.Text};
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = rawValue, ValueId = JArray.FromObject(rawValue)
};
}
break;
case SingleUserIssueCustomField f:
if (f.Value != null)
{
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = new List<Assignee>()
{
new Assignee() {UserName = f.Value.Login, FullName = f.Value.FullName}
}
};
}
break;
case SingleGroupIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Name};
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = rawValue, ValueId = JArray.FromObject(rawValue)
};
}
break;
//TODO could identical case bodies be optimized with switch over type? _3_ blocks below
case SingleBuildIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Name};
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = rawValue,
ValueId = JArray.FromObject(rawValue),
Color = YouTrackColor.FromApiEntity(f.Value.Color)
};
}
break;
case SingleOwnedIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Name};
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = rawValue,
ValueId = JArray.FromObject(rawValue),
Color = YouTrackColor.FromApiEntity(f.Value.Color)
};
}
break;
case SingleVersionIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Name};
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = rawValue,
ValueId = JArray.FromObject(rawValue),
Color = YouTrackColor.FromApiEntity(f.Value.Color)
};
}
break;
//^^ end TODO
//TODO could identical case bodies be optimized with switch over type? _3_ blocks below
case SingleEnumIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Name};
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = new List<string>() {f.Value.LocalizedName ?? f.Value.Name},
ValueId = JArray.FromObject(rawValue),
Color = YouTrackColor.FromApiEntity(f.Value.Color)
};
}
break;
case StateIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Name};
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = new List<string>() {f.Value.LocalizedName ?? f.Value.Name},
ValueId = JArray.FromObject(rawValue),
Color = YouTrackColor.FromApiEntity(f.Value.Color)
};
}
break;
case StateMachineIssueCustomField f:
if (f.Value != null)
{
var rawValue = new List<string>() {f.Value.Name};
issue._fields[f.Name] = new Field()
{
Name = f.Name,
Value = new List<string>() {f.Value.LocalizedName ?? f.Value.Name},
ValueId = JArray.FromObject(rawValue),
Color = YouTrackColor.FromApiEntity(f.Value.Color)
};
}
break;
//^^ end TODO
case MultiUserIssueCustomField f:
if (f.Value != null && f.Value.Any())
{
var values = f.Value.Select(v => new Assignee()
{
UserName = v.Login, FullName = v.FullName
}).ToList();
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = values
};
}
break;
//TODO could identical case bodies be optimized with switch over type? _4_ blocks below
case MultiGroupIssueCustomField f:
if (f.Value != null && f.Value.Any())
{
var values = f.Value.Select(v => v.Name).ToList();
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = values, ValueId = JArray.FromObject(values)
};
}
break;
case MultiBuildIssueCustomField f:
if (f.Value != null && f.Value.Any())
{
var values = f.Value.Select(v => v.Name).ToList();
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = values, ValueId = JArray.FromObject(values)
};
}
break;
case MultiOwnedIssueCustomField f:
if (f.Value != null && f.Value.Any())
{
var values = f.Value.Select(v => v.Name).ToList();
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = values, ValueId = JArray.FromObject(values)
};
}
break;
case MultiVersionIssueCustomField f:
if (f.Value != null && f.Value.Any())
{
var values = f.Value.Select(v => v.Name).ToList();
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = values, ValueId = JArray.FromObject(values)
};
}
break;
//^^ end TODO
case MultiEnumIssueCustomField f:
if (f.Value != null && f.Value.Any())
{
var localizedValues = f.Value.Select(v => v.LocalizedName).ToList();
var values = f.Value.Select(v => v.Name).ToList();
issue._fields[f.Name] = new Field()
{
Name = f.Name, Value = localizedValues, ValueId = JArray.FromObject(values)
};
}
break;
}
}
return issue;
}