internal static Issue FromApiEntity()

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;
        }