Skip to content

Commit

Permalink
feat: Application installation API support (#216)
Browse files Browse the repository at this point in the history
  • Loading branch information
Zahid92 authored Jan 15, 2024
1 parent 89f8213 commit 0f879e5
Show file tree
Hide file tree
Showing 11 changed files with 764 additions and 27 deletions.
49 changes: 49 additions & 0 deletions src/Crowdin.Api/Applications/Application.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;

namespace Crowdin.Api.Applications
{
[PublicAPI]
public class Application
{
private Application() { }

[JsonProperty("identifier")]
public string Identifier { get; set; }

[JsonProperty("name")]
public string Name { get; set; }

[JsonProperty("description")]
public string Description { get; set; }

[JsonProperty("logo")]
public string Logo { get; set; }

[JsonProperty("baseUrl")]
public string BaseUrl { get; set; }

[JsonProperty("manifestUrl")]
public string ManifestUrl { get; set; }

[JsonProperty("scopes")]
public string[] Scopes { get; set; }

[JsonProperty("modules")]
public ApplicationModule[] Modules { get; set; }

[JsonProperty("createdAt")]
public DateTimeOffset CreatedAt { get; set; }

[JsonProperty("permissions")]
public ApplicationPermissions Permissions { get; set; }

[JsonProperty("defaultPermissions")]
public JObject DefaultPermissions { get; set; }

[JsonProperty("limitReached")]
public bool LimitReached { get; set; }
}
}
22 changes: 22 additions & 0 deletions src/Crowdin.Api/Applications/ApplicationModule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Crowdin.Api.Applications
{
[PublicAPI]
public class ApplicationModule
{
[JsonProperty("key")]
public string Key { get; set; }

[JsonProperty("type")]
public string Type { get; set; }

[JsonProperty("data")]
public JObject Data { get; set; }

[JsonProperty("authenticationType")]
public string AuthenticationType { get; set; }
}
}
17 changes: 17 additions & 0 deletions src/Crowdin.Api/Applications/ApplicationPermission.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System;

namespace Crowdin.Api.Applications
{
[PublicAPI]
public class ApplicationPermissions
{
[JsonProperty("user")]
public ApplicationUser User { get; set; }

[JsonProperty("project")]
public ApplicationProject Project { get; set; }

}
}
26 changes: 26 additions & 0 deletions src/Crowdin.Api/Applications/ApplicationProject.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.ComponentModel;

namespace Crowdin.Api.Applications
{
[PublicAPI]
public class ApplicationProject
{
[JsonProperty("value")]
public ApplicationProjectValue Value { get; set; }

[JsonProperty("ids")]
public ICollection<int> Ids { get; set; }
}

[PublicAPI]
public enum ApplicationProjectValue
{
[Description("own")]
Own,
[Description("restricted")]
Restricted
}
}
36 changes: 36 additions & 0 deletions src/Crowdin.Api/Applications/ApplicationUser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.ComponentModel;

namespace Crowdin.Api.Applications
{
[PublicAPI]
public class ApplicationUser
{
[JsonProperty("value")]
public ApplicationUserValue Value { get; set; }

[JsonProperty("ids")]
public ICollection<int> Ids { get; set; }
}

[PublicAPI]
public enum ApplicationUserValue
{
[Description("owner")]
Owner,

[Description("managers")]
Managers,

[Description("all")]
All,

[Description("guests")]
Guests,

[Description("restricted")]
Restricted
}
}
79 changes: 75 additions & 4 deletions src/Crowdin.Api/Applications/ApplicationsApiExecutor.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Crowdin.Api.Core;
using JetBrains.Annotations;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;

namespace Crowdin.Api.Applications
{
public class ApplicationsApiExecutor
{
private readonly ICrowdinApiClient _apiClient;
private readonly IJsonParser _jsonParser;
private const string ApplicationsInstallationsUrl = "/applications/installations";

public ApplicationsApiExecutor(ICrowdinApiClient apiClient)
{
Expand All @@ -24,6 +25,72 @@ public ApplicationsApiExecutor(ICrowdinApiClient apiClient, IJsonParser jsonPars
_jsonParser = jsonParser;
}

/// <summary>
/// Get Application Installations List. Documentation:
/// <a href="https://developer.crowdin.com/api/v2/#operation/api.applications.installations.getMany">Crowdin API</a>
/// <a href="https://developer.crowdin.com/enterprise/api/#operation/api.applications.installations.getMany">Crowdin Enterprise API</a>
/// </summary>
[PublicAPI]
public async Task<ResponseList<Application>> ListApplicationInstallations(int limit = 25, int offset = 0)
{
IDictionary<string, string> queryParams = Utils.CreateQueryParamsFromPaging(limit, offset);
CrowdinApiResult result = await _apiClient.SendGetRequest(ApplicationsInstallationsUrl, queryParams);
return _jsonParser.ParseResponseList<Application>(result.JsonObject);
}

/// <summary>
/// Get Application Installation. Documentation:
/// <a href="https://developer.crowdin.com/api/v2/#operation/api.applications.installations.get">Crowdin API</a>
/// <a href="https://developer.crowdin.com/enterprise/api/#operation/api.applications.installations.get">Crowdin Enterprise API</a>
/// </summary>
[PublicAPI]
public async Task<Application> GetApplicationInstallation(string applicationIdentifier)
{
string url = FormUrl_ApplicationsInstallations(applicationIdentifier);
CrowdinApiResult result = await _apiClient.SendGetRequest(url);
return _jsonParser.ParseResponseObject<Application>(result.JsonObject);
}

/// <summary>
/// Install Application. Documentation:
/// <a href="https://developer.crowdin.com/api/v2/#operation/api.applications.installations.post">Crowdin API</a>
/// <a href="https://developer.crowdin.com/enterprise/api/#operation/api.applications.installations.post">Crowdin Enterprise API</a>
/// </summary>
[PublicAPI]
public async Task<Application> InstallApplication(InstallApplicationRequest request)
{
CrowdinApiResult result = await _apiClient.SendPostRequest(ApplicationsInstallationsUrl, request);
return _jsonParser.ParseResponseObject<Application>(result.JsonObject);
}

/// <summary>
/// Delete Application Installation. Documentation:
/// <a href="https://developer.crowdin.com/api/v2/#operation/api.applications.installations.delete">Crowdin API</a>
/// <a href="https://developer.crowdin.com/enterprise/api/#operation/api.applications.installations.delete">Crowdin Enterprise API</a>
/// </summary>
[PublicAPI]
public async Task DeleteApplicationInstallation(string applicationIdentifier, bool force = false)
{
string url = FormUrl_ApplicationsInstallations(applicationIdentifier);

IDictionary<string, string> queryParams = new Dictionary<string, string> { { "force", force.ToString() } };
HttpStatusCode statusCode = await _apiClient.SendDeleteRequest(url, queryParams);
Utils.ThrowIfStatusNot204(statusCode, $"Application {applicationIdentifier} installation removal failed");
}

/// <summary>
/// Edit Application Installation. Documentation:
/// <a href="https://developer.crowdin.com/api/v2/#operation/api.applications.installations.patch">Crowdin API</a>
/// <a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.applications.installations.patch">Crowdin Enterprise API</a>
/// </summary>
[PublicAPI]
public async Task<Application> EditApplicationInstallation(string applicationIdentifier, IEnumerable<InstallationPatch> patches)
{
string url = FormUrl_ApplicationsInstallations(applicationIdentifier);
CrowdinApiResult result = await _apiClient.SendPatchRequest(url, patches);
return _jsonParser.ParseResponseObject<Application>(result.JsonObject);
}

/// <summary>
/// Get Application Data. Documentation:
/// <a href="https://support.crowdin.com/api/v2/#operation/api.applications.api.get">Crowdin API</a>
Expand Down Expand Up @@ -72,7 +139,7 @@ public async Task<JObject> AddApplicationData(string applicationIdentifier, stri
public async Task DeleteApplicationData(string applicationIdentifier, string path)
{
string url = FormUrl_Applications(applicationIdentifier, path);
HttpStatusCode statusCode = await _apiClient.SendDeleteRequest(url);
HttpStatusCode statusCode = await _apiClient.SendDeleteRequest(url);
Utils.ThrowIfStatusNot204(statusCode, $"Application {applicationIdentifier} data removal failed");
}

Expand All @@ -93,5 +160,9 @@ private string FormUrl_Applications(string applicationIdentifier, string path)
{
return $"/applications/{applicationIdentifier}/api/{path}";
}
private string FormUrl_ApplicationsInstallations(string applicationIdentifier)
{
return $"{ApplicationsInstallationsUrl}/{applicationIdentifier}";
}
}
}
19 changes: 19 additions & 0 deletions src/Crowdin.Api/Applications/InstallApplicationRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using JetBrains.Annotations;
using Newtonsoft.Json;

#nullable enable

namespace Crowdin.Api.Applications
{
[PublicAPI]
public class InstallApplicationRequest
{
[JsonProperty("url")]
#pragma warning disable CS8618
public string Url { get; set; }
#pragma warning restore CS8618

[JsonProperty("permissions")]
public ApplicationPermissions? Permissions { get; set; }
}
}
20 changes: 20 additions & 0 deletions src/Crowdin.Api/Applications/InstallationPatch.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.ComponentModel;

namespace Crowdin.Api.Applications
{
[PublicAPI]
public class InstallationPatch: PatchEntry
{
[JsonProperty("path")]
public InstallationPatchPath Path { get; set; }
}

[PublicAPI]
public enum InstallationPatchPath
{
[Description("/permissions")]
Permissions
}
}
Loading

0 comments on commit 0f879e5

Please sign in to comment.