diff --git a/src/redmine-net-api/Extensions/RedmineManagerExtensions.cs b/src/redmine-net-api/Extensions/RedmineManagerExtensions.cs index d4447c21..254e4855 100644 --- a/src/redmine-net-api/Extensions/RedmineManagerExtensions.cs +++ b/src/redmine-net-api/Extensions/RedmineManagerExtensions.cs @@ -34,7 +34,106 @@ namespace Redmine.Net.Api.Extensions /// public static class RedmineManagerExtensions { - /// + /// + /// + /// + /// + /// + /// + /// + public static void ArchiveProject(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null) + { + var uri = redmineManager.RedmineApiUrls.ProjectArchive(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + redmineManager.ApiClient.Update(escapedUri, string.Empty ,requestOptions); + } + + /// + /// + /// + /// + /// + /// + /// + public static void UnarchiveProject(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null) + { + var uri = redmineManager.RedmineApiUrls.ProjectUnarchive(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + redmineManager.ApiClient.Update(escapedUri, string.Empty ,requestOptions); + } + + /// + /// + /// + /// + /// + /// + /// + public static void ReopenProject(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null) + { + var uri = redmineManager.RedmineApiUrls.ProjectReopen(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + redmineManager.ApiClient.Update(escapedUri, string.Empty ,requestOptions); + } + + /// + /// + /// + /// + /// + /// + /// + public static void CloseProject(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null) + { + var uri = redmineManager.RedmineApiUrls.ProjectClose(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + redmineManager.ApiClient.Update(escapedUri,string.Empty, requestOptions); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public static void ProjectRepositoryAddRelatedIssue(this RedmineManager redmineManager, string projectIdentifier, string repositoryIdentifier, string revision, RequestOptions requestOptions = null) + { + var uri = redmineManager.RedmineApiUrls.ProjectRepositoryAddRelatedIssue(projectIdentifier, repositoryIdentifier, revision); + + var escapedUri = Uri.EscapeDataString(uri); + + _ = redmineManager.ApiClient.Create(escapedUri,string.Empty, requestOptions); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void ProjectRepositoryRemoveRelatedIssue(this RedmineManager redmineManager, string projectIdentifier, string repositoryIdentifier, string revision, string issueIdentifier, RequestOptions requestOptions = null) + { + var uri = redmineManager.RedmineApiUrls.ProjectRepositoryRemoveRelatedIssue(projectIdentifier, repositoryIdentifier, revision, issueIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + _ = redmineManager.ApiClient.Delete(escapedUri, requestOptions); + } + + /// /// /// /// @@ -374,6 +473,107 @@ private static NameValueCollection CreateSearchParameters(string q, int limit, i #if !(NET20) + /// + /// Archives the project asynchronously + /// + /// + /// + /// + /// + public static async Task ArchiveProjectAsync(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null, CancellationToken cancellationToken = default) + { + var uri = redmineManager.RedmineApiUrls.ProjectArchive(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + await redmineManager.ApiClient.DeleteAsync(escapedUri, requestOptions, cancellationToken).ConfigureAwait(false); + } + + /// + /// Unarchives the project asynchronously + /// + /// + /// + /// + /// + public static async Task UnarchiveProjectAsync(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null, CancellationToken cancellationToken = default) + { + var uri = redmineManager.RedmineApiUrls.ProjectUnarchive(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + await redmineManager.ApiClient.DeleteAsync(escapedUri, requestOptions, cancellationToken).ConfigureAwait(false); + } + + /// + /// Closes the project asynchronously + /// + /// + /// + /// + /// + public static async Task CloseProjectAsync(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null, CancellationToken cancellationToken = default) + { + var uri = redmineManager.RedmineApiUrls.ProjectClose(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + await redmineManager.ApiClient.UpdateAsync(escapedUri, string.Empty, requestOptions, cancellationToken).ConfigureAwait(false); + } + + /// + /// Reopens the project asynchronously + /// + /// + /// + /// + /// + public static async Task ReopenProjectAsync(this RedmineManager redmineManager, string projectIdentifier, RequestOptions requestOptions = null, CancellationToken cancellationToken = default) + { + var uri = redmineManager.RedmineApiUrls.ProjectReopen(projectIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + await redmineManager.ApiClient.UpdateAsync(escapedUri, string.Empty, requestOptions, cancellationToken).ConfigureAwait(false); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task ProjectRepositoryAddRelatedIssueAsync(this RedmineManager redmineManager, string projectIdentifier, string repositoryIdentifier, string revision, RequestOptions requestOptions = null, CancellationToken cancellationToken = default) + { + var uri = redmineManager.RedmineApiUrls.ProjectRepositoryAddRelatedIssue(projectIdentifier, repositoryIdentifier, revision); + + var escapedUri = Uri.EscapeDataString(uri); + + await redmineManager.ApiClient.CreateAsync(escapedUri, string.Empty ,requestOptions, cancellationToken).ConfigureAwait(false); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task ProjectRepositoryRemoveRelatedIssueAsync(this RedmineManager redmineManager, string projectIdentifier, string repositoryIdentifier, string revision, string issueIdentifier, RequestOptions requestOptions = null, CancellationToken cancellationToken = default) + { + var uri = redmineManager.RedmineApiUrls.ProjectRepositoryRemoveRelatedIssue(projectIdentifier, repositoryIdentifier, revision, issueIdentifier); + + var escapedUri = Uri.EscapeDataString(uri); + + await redmineManager.ApiClient.DeleteAsync(escapedUri, requestOptions, cancellationToken).ConfigureAwait(false); + } + /// /// /// diff --git a/src/redmine-net-api/Net/RedmineApiUrlsExtensions.cs b/src/redmine-net-api/Net/RedmineApiUrlsExtensions.cs index 12f896f9..763060aa 100644 --- a/src/redmine-net-api/Net/RedmineApiUrlsExtensions.cs +++ b/src/redmine-net-api/Net/RedmineApiUrlsExtensions.cs @@ -31,6 +31,36 @@ public static string CurrentUser(this RedmineApiUrls redmineApiUrls) return $"{RedmineKeys.USERS}/{RedmineKeys.CURRENT}.{redmineApiUrls.Format}"; } + public static string ProjectClose(this RedmineApiUrls redmineApiUrls, string projectIdentifier) + { + return $"{RedmineKeys.PROJECTS}/{projectIdentifier}/{RedmineKeys.CLOSE}.{redmineApiUrls.Format}"; + } + + public static string ProjectReopen(this RedmineApiUrls redmineApiUrls, string projectIdentifier) + { + return $"{RedmineKeys.PROJECTS}/{projectIdentifier}/{RedmineKeys.REOPEN}.{redmineApiUrls.Format}"; + } + + public static string ProjectArchive(this RedmineApiUrls redmineApiUrls, string projectIdentifier) + { + return $"{RedmineKeys.PROJECTS}/{projectIdentifier}/{RedmineKeys.ARCHIVE}.{redmineApiUrls.Format}"; + } + + public static string ProjectUnarchive(this RedmineApiUrls redmineApiUrls, string projectIdentifier) + { + return $"{RedmineKeys.PROJECTS}/{projectIdentifier}/{RedmineKeys.UNARCHIVE}.{redmineApiUrls.Format}"; + } + + public static string ProjectRepositoryAddRelatedIssue(this RedmineApiUrls redmineApiUrls, string projectIdentifier, string repositoryIdentifier, string revision) + { + return $"{RedmineKeys.PROJECTS}/{projectIdentifier}/{RedmineKeys.REPOSITORY}/{repositoryIdentifier}/{RedmineKeys.REVISIONS}/{revision}/{RedmineKeys.ISSUES}.{redmineApiUrls.Format}"; + } + + public static string ProjectRepositoryRemoveRelatedIssue(this RedmineApiUrls redmineApiUrls, string projectIdentifier, string repositoryIdentifier, string revision, string issueIdentifier) + { + return $"{RedmineKeys.PROJECTS}/{projectIdentifier}/{RedmineKeys.REPOSITORY}/{repositoryIdentifier}/{RedmineKeys.REVISIONS}/{revision}/{RedmineKeys.ISSUES}/{issueIdentifier}.{redmineApiUrls.Format}"; + } + public static string ProjectNews(this RedmineApiUrls redmineApiUrls, string projectIdentifier) { if (projectIdentifier.IsNullOrWhiteSpace()) diff --git a/src/redmine-net-api/RedmineKeys.cs b/src/redmine-net-api/RedmineKeys.cs index 996b7142..5ecae9fd 100644 --- a/src/redmine-net-api/RedmineKeys.cs +++ b/src/redmine-net-api/RedmineKeys.cs @@ -116,6 +116,10 @@ public static class RedmineKeys /// /// /// + public const string CLOSE = "close"; + /// + /// + /// public const string CLOSED_ON = "closed_on"; /// /// @@ -636,6 +640,14 @@ public static class RedmineKeys /// /// /// + public const string REOPEN = "reopen"; + /// + /// + /// + public const string REPOSITORY = "repository"; + /// + /// + /// public const string RESULT = "result"; /// /// @@ -644,6 +656,10 @@ public static class RedmineKeys /// /// /// + public const string REVISIONS = "revisions"; + /// + /// + /// public const string ROLE = "role"; /// /// @@ -789,6 +805,10 @@ public static class RedmineKeys /// /// /// + public const string UNARCHIVE = "unarchive"; + /// + /// + /// public const string UPDATED_ON = "updated_on"; /// ///