From 12cd6b0afaa1b2e31f34a3e7482f70d1a33e1750 Mon Sep 17 00:00:00 2001
From: Benedikt Heinrichs <heinrichs@itc.rwth-aachen.de>
Date: Mon, 5 Sep 2022 09:08:28 +0200
Subject: [PATCH] Update: Overhaul PID handling

---
 src/Pid/Controllers/PidController.cs | 101 ++++++++++++++++++++++++---
 src/Pid/Models/MessageObject.cs      |   8 +--
 src/Pid/Pid.csproj                   |   2 +-
 src/Pid/Program.cs                   |   5 --
 src/Pid/Startup.cs                   |   7 +-
 5 files changed, 94 insertions(+), 29 deletions(-)

diff --git a/src/Pid/Controllers/PidController.cs b/src/Pid/Controllers/PidController.cs
index 590c3e6..ab845a8 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 f3d28f1..e75c2dc 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 72a7839..7ab6d30 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 427a2a3..318c0d9 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 4101959..42ea5e7 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.
-- 
GitLab