diff --git a/Octokit.Reactive/Clients/ObservableSearchClient.cs b/Octokit.Reactive/Clients/ObservableSearchClient.cs index f14c80c1..c417285e 100644 --- a/Octokit.Reactive/Clients/ObservableSearchClient.cs +++ b/Octokit.Reactive/Clients/ObservableSearchClient.cs @@ -49,7 +49,7 @@ namespace Octokit.Reactive public IObservable SearchIssues(SearchIssuesRequest request) { Ensure.ArgumentNotNull(request, "request"); - return _connection.GetAndFlattenAllPages(ApiUrls.SearchIssues(), request.ToParametersDictionary()); + return _connection.GetAndFlattenAllPages(ApiUrls.SearchIssues(), request.Parameters); } /// diff --git a/Octokit/Clients/SearchClient.cs b/Octokit/Clients/SearchClient.cs index c5420328..f0fdc890 100644 --- a/Octokit/Clients/SearchClient.cs +++ b/Octokit/Clients/SearchClient.cs @@ -52,7 +52,7 @@ namespace Octokit public Task> SearchIssues(SearchIssuesRequest search) { Ensure.ArgumentNotNull(search, "search"); - return ApiConnection.GetAll(ApiUrls.SearchIssues(), search.ToParametersDictionary()); + return ApiConnection.GetAll(ApiUrls.SearchIssues(), search.Parameters); } /// diff --git a/Octokit/Models/Request/SearchIssuesRequest.cs b/Octokit/Models/Request/SearchIssuesRequest.cs index 346917c6..d1464632 100644 --- a/Octokit/Models/Request/SearchIssuesRequest.cs +++ b/Octokit/Models/Request/SearchIssuesRequest.cs @@ -4,17 +4,19 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Globalization; namespace Octokit { /// /// Searching Issues /// - public class SearchIssuesRequest : RequestParameters + public class SearchIssuesRequest { public SearchIssuesRequest(string term) { - Ensure.ArgumentNotNullOrEmptyString(term,"term"); + Ensure.ArgumentNotNullOrEmptyString(term, "term"); + Term = term; Page = 1; PerPage = 100; @@ -25,14 +27,13 @@ namespace Octokit /// The search terms. This can be any combination of the supported repository search parameters: /// http://developer.github.com/v3/search/#search-code /// - [Parameter(Key= "q")] - public string Term { get; private set; } + public string Term { get; set; } /// /// For http://developer.github.com/v3/search/#search-issues /// Optional Sort field. One of comments, created, or updated. If not provided, results are sorted by best match. /// - //public string Sort { get; set; } //re-add laters + public IssueSearchSort? Sort { get; set; } /// /// Optional Sort order if sort parameter is provided. One of asc or desc; the default is desc. @@ -48,5 +49,186 @@ namespace Octokit /// Number of items per page /// public int PerPage { get; set; } + + private IEnumerable _inQualifier; + public IEnumerable In + { + get { return _inQualifier; } + set + { + if(value != null && value.Any()) + { + _inQualifier = value.Distinct().ToList(); + } + } + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")] + public IssueTypeQualifier? Type { get; set; } + + public string Author { get; set; } + + public string Assignee { get; set; } + + public string Mentions { get; set; } + + public string Commenter { get; set; } + + public string Involves { get; set; } + + public ItemState? State { get; set; } + + private IEnumerable _labels; + + public IEnumerable Labels + { + get { return _labels; } + set + { + if(value != null && value.Any()) + { + _labels = value.Distinct().ToList(); + } + } + } + + public Language? Language { get; set; } + + public DateRange Created { get; set; } + + public DateRange Updated { get; set; } + + public Range Comments { get; set; } + + public string User { get; set; } + + public string Repo { get; set; } + + public string MergeParameters() + { + var parameters = new List(); + + if(In != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "in:{0}", String.Join(",", In))); + } + + if(Type != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "type:{0}", Type)); + } + + if(Author.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "author:{0}", Author)); + } + + if(Assignee.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "assignee:{0}", Assignee)); + } + + if(Mentions.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "mentions:{0}", Mentions)); + } + + if (Commenter.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "commenter:{0}", Commenter)); + } + + if(Involves.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "involves:{0}", Involves)); + } + + if(State != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "state:{0}", State)); + } + + if(Labels != null) + { + foreach(var label in Labels) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "label:{0}", label)); + } + } + + if(Language != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "language:{0}", Language)); + } + + if(Created != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "created:{0}", Created)); + } + + if(Updated != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "udpated:{0}", Updated)); + } + + if(Comments != null) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "comments:{0}", Comments)); + } + + if(User.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "user:{0}", User)); + } + + if(Repo.IsNotBlank()) + { + parameters.Add(String.Format(CultureInfo.InvariantCulture, "repo:{0}", Repo)); + } + + return String.Join("+", parameters); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Int32.ToString")] + public IDictionary Parameters + { + get + { + var d = new Dictionary(); + d.Add("page", Page.ToString()); + d.Add("per_page", PerPage.ToString()); + d.Add("sort", Sort.ToString()); + d.Add("q", Term + " " + MergeParameters()); + return d; + } + } + } + public enum IssueSearchSort + { + /// + /// search by number of comments + /// + Comments, + /// + /// search by created + /// + Created, + /// + /// search by last updated + /// + Updated + } + + public enum IssueInQualifier + { + Title, + Body, + Comment + } + + public enum IssueTypeQualifier + { + PR, + Issue } }