diff --git a/src/Pid/Controllers/PidController.cs b/src/Pid/Controllers/PidController.cs index 590c3e6ce5e9955727c0a0195b21318eb9800fe2..ab845a8eed8327138210564a8a12f051ad03bd70 100644 --- a/src/Pid/Controllers/PidController.cs +++ b/src/Pid/Controllers/PidController.cs @@ -48,6 +48,64 @@ namespace Coscine.Api.Pid.Controllers _visibilityModel = new VisibilityModel(); } + /// <summary> + /// Returns a 200, if a PID is valid. + /// </summary> + /// <param name="pid">PID</param> + /// <returns>200 if successful, 400 if pid is badly formatted, 403 if project or resource is deleted, 404 if not exists.</returns> + [HttpGet("[controller]/valid/{pid}")] + public IActionResult IsValid(string pid) + { + var id = Uri.UnescapeDataString(pid); + if (id.Contains('/')) + { + id = id[(id.IndexOf("/") + 1)..]; + } + else + { + return BadRequest($"PID {pid} is badly formatted."); + } + if (id.Contains('@')) + { + id = id[..id.IndexOf("@")]; + } + if (id.Contains('/')) + { + id = id[..id.IndexOf("/")]; + } + + Resource resource = null; + try + { + resource = _resourceModel.GetByIdIncludingDeleted(new Guid(id)); + } + catch + { + + } + Project project = null; + try + { + project = _projectModel.GetByIdIncludingDeleted(new Guid(id)); + } + catch + { + + } + + if (resource == null && project == null) + { + return NotFound($"No project/resource with PID {pid} exists."); + } + + if ((resource != null && resource.Deleted) || (project != null && project.Deleted)) + { + return Forbid(); + } + + return Ok(); + } + /// <summary> /// Sends a request to the pid owner. /// </summary> @@ -56,8 +114,38 @@ namespace Coscine.Api.Pid.Controllers [HttpPost("[controller]/sendMailToOwner")] public IActionResult SendMailToOwner([FromBody] MessageObject messageObject) { - var resource = _resourceModel.GetById(new Guid(messageObject.Guid)); - var project = _projectModel.GetById(new Guid(messageObject.Guid)); + Resource resource = null; + try + { + resource = _resourceModel.GetByIdIncludingDeleted(new Guid(messageObject.Guid)); + } + catch + { + + } + Project project = null; + try + { + project = _projectModel.GetByIdIncludingDeleted(new Guid(messageObject.Guid)); + } + catch + { + + } + + if (resource == null && project == null) + { + // Log the error. + // ProjectId and ResourceId will be null and indicate an error in the logs. + LogAnalyticsPidEnquiry(null, null, null, null, null, null, null, null); + return NotFound($"No project/resource with PID {messageObject.Pid} exists."); + } + + if ((resource != null && resource.Deleted) || (project != null && project.Deleted)) + { + return Forbid(); + } + var user = new User() { DisplayName = messageObject.Name, @@ -108,13 +196,6 @@ namespace Coscine.Api.Pid.Controllers var ownerId = _roleModel.GetAllWhere((x) => (x.DisplayName == "owner")).First().Id; projectOwners = _projectRoleModel.GetAllWhere((x) => x.RoleId == ownerId && x.ProjectId == project.Id); } - else - { - // Log the error. - // ProjectId and ResourceId will be null and indicate an error in the logs. - LogAnalyticsPidEnquiry(null, null, null, null, null, null, null, null); - return BadRequest("No project/resource with this pid exists."); - } if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics)) { @@ -126,7 +207,7 @@ namespace Coscine.Api.Pid.Controllers } private void LogAnalyticsPidEnquiry(Project project, Resource resource, string applicationsProfile, string license, - IEnumerable<DisciplineObject> disciplines, IEnumerable<OrganizationObject> organizations, IEnumerable<ProjectRole> owners, string email) + IEnumerable<DisciplineObject> disciplines, IEnumerable<OrganizationObject> organizations, IEnumerable<ProjectRole> owners, string email) { string visibility = null; if (project != null && project.VisibilityId.HasValue) diff --git a/src/Pid/Models/MessageObject.cs b/src/Pid/Models/MessageObject.cs index f3d28f1f51a2d348a5b616de1c714f9bf0afe820..e75c2dca4468d0a150ca2f47b8520ff2bab5c0e9 100644 --- a/src/Pid/Models/MessageObject.cs +++ b/src/Pid/Models/MessageObject.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Coscine.Api.Pid.Models +namespace Coscine.Api.Pid.Models { /// <summary> /// Message Object. diff --git a/src/Pid/Pid.csproj b/src/Pid/Pid.csproj index 72a7839270e5670270bd5aba50535e1826dbf559..7ab6d302688394eb4ef6e1c341f3642b9fa59985 100644 --- a/src/Pid/Pid.csproj +++ b/src/Pid/Pid.csproj @@ -17,7 +17,7 @@ <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> </PropertyGroup> <ItemGroup> - <PackageReference Include="Coscine.Action" Version="2.*-*" /> + <PackageReference Include="Coscine.Action" Version="3.*-*" /> <PackageReference Include="Coscine.ApiCommons" Version="2.*-*" /> <PackageReference Include="Coscine.Database" Version="2.*-*" /> <PackageReference Include="Coscine.Logging" Version="2.*-*" /> diff --git a/src/Pid/Program.cs b/src/Pid/Program.cs index 427a2a3f8ef5dacac001ddc9f1fa49fc1a9c7af2..318c0d9827b3cb51e279a490110d56d551a74506 100644 --- a/src/Pid/Program.cs +++ b/src/Pid/Program.cs @@ -1,10 +1,5 @@ using Coscine.ApiCommons; using Coscine.Configuration; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Coscine.Api.Pid { diff --git a/src/Pid/Startup.cs b/src/Pid/Startup.cs index 4101959709dd1e97bbbfae586f93bb3aacb9cf0e..42ea5e7e88ae651448728e54879d53e891df53e6 100644 --- a/src/Pid/Startup.cs +++ b/src/Pid/Startup.cs @@ -1,16 +1,11 @@ using Coscine.ApiCommons; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Coscine.Api.Pid { /// <summary> /// Standard Startup class. /// </summary> - public class Startup : AbstractDefaultStartup + public class Startup : AbstractStartup { /// <summary> /// Standard Startup constructor.