From 777b58a920f9c13818b5ef02bcee4965cf4c5c7a Mon Sep 17 00:00:00 2001
From: Sylvain Renault <sylvain.renault@hhi.fraunhofer.de>
Date: Wed, 10 Apr 2024 17:42:22 +0200
Subject: [PATCH] Services are intitalized on server startup. Creating an
 object with a given UUID now get an 409 error if the id is already existing
 in the database.

---
 openapi                                       |  2 +-
 .../ControllersImpl/TrackablesImpl.cs         | 10 +++--
 .../ControllersImpl/WorldAnchorsImpl.cs       | 10 +++--
 .../ControllersImpl/WorldLinksImpl.cs         | 38 ++++++++++---------
 .../ETSI.ARF.OpenAPI.WorldStorage/Startup.cs  | 13 +++++--
 5 files changed, 46 insertions(+), 27 deletions(-)

diff --git a/openapi b/openapi
index 57adeb4..84f8163 160000
--- a/openapi
+++ b/openapi
@@ -1 +1 @@
-Subproject commit 57adeb471026ccc88074889aefbe68ef692cb0ca
+Subproject commit 84f816367c469b590cb2db47a4bb1b06b56729f9
diff --git a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/TrackablesImpl.cs b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/TrackablesImpl.cs
index 9d8d06b..5845b10 100644
--- a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/TrackablesImpl.cs
+++ b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/TrackablesImpl.cs
@@ -73,7 +73,11 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             try
             {
                 Trackable mytrackable = _trackableService.Create(trackable);
-                return StatusCode(200, mytrackable.UUID.ToString());
+                if (mytrackable == null)
+                {
+                    return StatusCode(409, "UUID already existing!");
+                }
+                else return StatusCode(200, mytrackable.UUID.ToString());
             }
             catch (Exception e)
             {
@@ -100,7 +104,7 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             {
                 worldlinkinfo += worldlink.UUID.ToString() + "; ";
                 worldlink.UUIDFrom = Guid.Empty;
-                worldlink.TypeFrom = ObjectType.NotIdentifiedEnum;
+                worldlink.TypeFrom = TypeWorldStorage.UNKNOWNEnum;
                 _worldLinkService.Replace(worldlink);
             }
 
@@ -110,7 +114,7 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             {
                 worldlinkinfo += worldlink.UUID.ToString() + "; ";
                 worldlink.UUIDTo = Guid.Empty;
-                worldlink.TypeTo = ObjectType.NotIdentifiedEnum;
+                worldlink.TypeTo = TypeWorldStorage.UNKNOWNEnum;
                 _worldLinkService.Replace(worldlink);
             }
             if (worldlinkinfo.Length > 1)
diff --git a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldAnchorsImpl.cs b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldAnchorsImpl.cs
index 97189a0..8d5e48b 100644
--- a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldAnchorsImpl.cs
+++ b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldAnchorsImpl.cs
@@ -73,7 +73,11 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             try
             {
                 WorldAnchor myworldanchor = _worldAnchorService.Create(worldAnchor);
-                return StatusCode(200, myworldanchor.UUID.ToString());
+                if (myworldanchor == null)
+                {
+                    return StatusCode(409, "UUID alread exexisting!");
+                }
+                else return StatusCode(200, myworldanchor.UUID.ToString());
             }
             catch (Exception e)
             {
@@ -100,7 +104,7 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             {
                 worldlinkinfo += worldlink.UUID.ToString() + "; ";
                 worldlink.UUIDFrom = Guid.Empty;
-                worldlink.TypeFrom = ObjectType.NotIdentifiedEnum;
+                worldlink.TypeFrom = TypeWorldStorage.UNKNOWNEnum;
                 _worldLinkService.Replace(worldlink);
             }
 
@@ -110,7 +114,7 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             {
                 worldlinkinfo += worldlink.UUID.ToString() + "; ";
                 worldlink.UUIDTo = Guid.Empty;
-                worldlink.TypeTo = ObjectType.NotIdentifiedEnum;
+                worldlink.TypeTo = TypeWorldStorage.UNKNOWNEnum;
                 _worldLinkService.Replace(worldlink);
             }
             if (worldlinkinfo.Length > 1)
diff --git a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldLinksImpl.cs b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldLinksImpl.cs
index 9bbb362..cd5da8a 100644
--- a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldLinksImpl.cs
+++ b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/ETSI-ARF/ControllersImpl/WorldLinksImpl.cs
@@ -72,7 +72,11 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             try
             {
                 WorldLink myworldlink = _worldLinkService.Create(worldLink);
-                return StatusCode(200, myworldlink.UUID.ToString());
+                if (myworldlink == null)
+                {
+                    return StatusCode(409, "UUID already existing!");
+                }
+                else return StatusCode(200, myworldlink.UUID.ToString());
             }
             catch (Exception e)
             {
@@ -103,36 +107,36 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             if (null != myworldlink)
             {
                 // check TypeFrom
-                if (myworldlink.TypeFrom == ObjectType.TrackableEnum)
+                if (myworldlink.TypeFrom == TypeWorldStorage.TRACKABLEEnum)
                 {
                     if (null == _trackableService.Get(myworldlink.UUIDFrom))
                     {
-                        myworldlink.TypeFrom = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeFrom = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDFrom = Guid.Empty;
                     }
                 }
-                else if (myworldlink.TypeFrom == ObjectType.WorldAnchorEnum)
+                else if (myworldlink.TypeFrom == TypeWorldStorage.ANCHOREnum)
                 {
                     if (null == _worldAnchorService.Get(myworldlink.UUIDFrom))
                     {
-                        myworldlink.TypeFrom = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeFrom = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDFrom = Guid.Empty;
                     }
                 }
                 // check TypeTo
-                if (myworldlink.TypeTo == ObjectType.TrackableEnum)
+                if (myworldlink.TypeTo == TypeWorldStorage.TRACKABLEEnum)
                 {
                     if (null == _trackableService.Get(myworldlink.UUIDTo))
                     {
-                        myworldlink.TypeTo = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeTo = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDTo = Guid.Empty;
                     }
                 }
-                else if (myworldlink.TypeTo == ObjectType.WorldAnchorEnum)
+                else if (myworldlink.TypeTo == TypeWorldStorage.ANCHOREnum)
                 {
                     if (null == _worldAnchorService.Get(myworldlink.UUIDTo))
                     {
-                        myworldlink.TypeTo = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeTo = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDTo = Guid.Empty;
                     }
                 }
@@ -153,36 +157,36 @@ namespace ETSI.ARF.OpenAPI.WorldStorage.Controllers
             foreach (WorldLink myworldlink in worldlinklist)
             {
                 // check TypeFrom
-                if (myworldlink.TypeFrom == ObjectType.TrackableEnum)
+                if (myworldlink.TypeFrom == TypeWorldStorage.TRACKABLEEnum)
                 {
                     if (null == _trackableService.Get(myworldlink.UUIDFrom))
                     {
-                        myworldlink.TypeFrom = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeFrom = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDFrom = Guid.Empty;
                     }
                 }
-                else if (myworldlink.TypeFrom == ObjectType.WorldAnchorEnum)
+                else if (myworldlink.TypeFrom == TypeWorldStorage.ANCHOREnum)
                 {
                     if (null == _worldAnchorService.Get(myworldlink.UUIDFrom))
                     {
-                        myworldlink.TypeFrom = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeFrom = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDFrom = Guid.Empty;
                     }
                 }
                 // check TypeTo
-                if (myworldlink.TypeTo == ObjectType.TrackableEnum)
+                if (myworldlink.TypeTo == TypeWorldStorage.TRACKABLEEnum)
                 {
                     if (null == _trackableService.Get(myworldlink.UUIDTo))
                     {
-                        myworldlink.TypeTo = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeTo = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDTo = Guid.Empty;
                     }
                 }
-                else if (myworldlink.TypeTo == ObjectType.WorldAnchorEnum)
+                else if (myworldlink.TypeTo == TypeWorldStorage.ANCHOREnum)
                 {
                     if (null == _worldAnchorService.Get(myworldlink.UUIDTo))
                     {
-                        myworldlink.TypeTo = ObjectType.NotIdentifiedEnum;
+                        myworldlink.TypeTo = TypeWorldStorage.UNKNOWNEnum;
                         myworldlink.UUIDTo = Guid.Empty;
                     }
                 }
diff --git a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/Startup.cs b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/Startup.cs
index af7fb23..2978f0a 100644
--- a/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/Startup.cs
+++ b/server/worldstorage/src/ETSI.ARF.OpenAPI.WorldStorage/Startup.cs
@@ -92,8 +92,8 @@ namespace ETSI.ARF.OpenAPI.WorldStorage
             //
 
             // appsetting.json - requires using Microsoft.Extensions.Options
-            services.Configure<DatabaseSettings>(Configuration.GetSection(nameof(DatabaseSettings)));
-
+            IServiceCollection c = services.Configure<DatabaseSettings>(Configuration.GetSection(nameof(DatabaseSettings)));
+            
             //
             // MongoDB
             //
@@ -104,7 +104,7 @@ namespace ETSI.ARF.OpenAPI.WorldStorage
             services.AddSingleton<TrackableService>();
             services.AddSingleton<WorldAnchorService>();
             services.AddSingleton<WorldLinkService>();
-
+            
             // Add framework services.
             services
                 // Don't need the full MVC stack for an API, see https://andrewlock.net/comparing-startup-between-the-asp-net-core-3-templates/
@@ -160,6 +160,13 @@ namespace ETSI.ARF.OpenAPI.WorldStorage
         /// <param name="env"></param>
         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
         {
+            //
+            // Initialize all ARF services
+            //
+            app.ApplicationServices.GetRequiredService<TrackableService>();
+            app.ApplicationServices.GetRequiredService<WorldAnchorService>();
+            app.ApplicationServices.GetRequiredService<WorldLinkService>();
+
             if (env.IsDevelopment())
             {
                 app.UseDeveloperExceptionPage();
-- 
GitLab