diff --git a/src/Project/Controllers/DataSourceController.cs b/src/Project/Controllers/DataSourceController.cs index 1c24695d2ef6d7caf2dee7777dcbd7fbfdb5198b..ff42b05c814f1d99ab0a9aa4a21c27a57491a030 100644 --- a/src/Project/Controllers/DataSourceController.cs +++ b/src/Project/Controllers/DataSourceController.cs @@ -1,6 +1,7 @@ using Coscine.Api.Project.Models; using Coscine.Api.Project.ReturnObjects; using Coscine.ApiCommons; +using Coscine.ApiCommons.Factories; using Coscine.ApiCommons.Utils; using Coscine.Configuration; using Coscine.Database.Model; @@ -255,6 +256,66 @@ namespace Coscine.Api.Project.Controllers } } + [HttpPost("[controller]/validate")] + public async Task<IActionResult> IsResourceValid() + { + var path = "/"; + + JToken resource = ObjectFactory<JToken>.DeserializeFromStream(Request.Body); + + + string authHeader = null; + if (resource["type"]["displayName"].ToString().ToLower() == "rds") + { + RDSResourceType rdsResourceType = new RDSResourceType(); + rdsResourceType.BucketName = resource["resourceTypeOption"]["BucketName"].ToString(); + rdsResourceType.AccessKey = resource["resourceTypeOption"]["AccessKey"].ToString(); + rdsResourceType.SecretKey = resource["resourceTypeOption"]["SecretKey"].ToString(); + authHeader = BuildRdsAuthHeader(rdsResourceType); + } + else if (resource["type"]["displayName"].ToString().ToLower() == "gitlab") + { + GitlabResourceType gitlabResourceType = new GitlabResourceType(); + gitlabResourceType.RepositoryNumber = (int)resource["resourceTypeOption"]["RepositoryNumber"]; + gitlabResourceType.RepositoryUrl = resource["resourceTypeOption"]["RepositoryUrl"].ToString(); + gitlabResourceType.Token = resource["resourceTypeOption"]["Token"].ToString(); + authHeader = BuildGitlabAuthHeader(gitlabResourceType); + } + + if (authHeader == null) + { + return BadRequest($"No provider for: \"{resource["type"]["displayName"].ToString()}\"."); + } + else + { + // If the path is null, an empty string is added. + string url = $"{_configuration.GetString("coscine/global/waterbutler_url")}{resource["type"]["displayName"].ToString().ToLower()}{path}"; + + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authHeader); + + // Thread safe according to msdn and HttpCompletionOption sets it to get only headers first. + var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); + if (response.IsSuccessStatusCode) + { + if (response.Content.Headers.Contains("Content-Disposition")) + { + return File(await response.Content.ReadAsStreamAsync(), + response.Content.Headers.GetValues("Content-Type").First()); + } + else + { + var data = JObject.Parse(await response.Content.ReadAsStringAsync())["data"]; + return Ok(new WaterbutlerObject(path, data)); + } + } + else + { + return FailedRequest(response, path); + } + } + } + private IActionResult FailedRequest(HttpResponseMessage response, string path) { if (response.StatusCode == System.Net.HttpStatusCode.NotFound) @@ -393,9 +454,9 @@ namespace Coscine.Api.Project.Controllers var settings = new Dictionary<string, object> { - {"owner", "Tester"}, + { "owner", "Tester"}, { "repo", gitlabResourceType.RepositoryUrl}, - { "repo_id", gitlabResourceType.RepositoryNumber}, + { "repo_id", gitlabResourceType.RepositoryNumber.ToString()}, { "host", "https://git.rwth-aachen.de"} };