From 5adba4c4e8c5ba9091f703e8efecdcd5e1549e3d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vojt=C4=9Bch=20Barti=C4=8Dka?= <aitakaitov@gmail.com>
Date: Wed, 27 Apr 2022 11:02:48 +0200
Subject: [PATCH 01/12] Implemented static global config, added endpoint to set
 req annotations per document

---
 .../Backend/Controllers/DocumentController.cs | 30 +++++++++++++++++++
 .../DocumentService/DocumentServiceEF.cs      | 29 ++++++++----------
 .../DocumentService/IDocumentService.cs       |  2 ++
 .../Core/StaticConfig/GlobalConfiguration.cs  | 25 ++++++++++++++++
 Backend/Models/Documents/DocumentAddInfo.cs   |  2 +-
 .../SetRequiredAnnotationsRequest.cs          | 14 +++++++++
 6 files changed, 84 insertions(+), 18 deletions(-)
 create mode 100644 Backend/Core/StaticConfig/GlobalConfiguration.cs
 create mode 100644 Backend/Models/Documents/SetRequiredAnnotationsRequest.cs

diff --git a/Backend/Backend/Controllers/DocumentController.cs b/Backend/Backend/Controllers/DocumentController.cs
index ba846bc..acc701f 100644
--- a/Backend/Backend/Controllers/DocumentController.cs
+++ b/Backend/Backend/Controllers/DocumentController.cs
@@ -69,5 +69,35 @@ public class DocumentController : Common.CommonControllerBase
         return Ok();
     }
 
+
+
+
+    [HttpPost("/documents/requiredAnnotations")]
+    [Authorize(Models.Enums.ERole.ADMINISTRATOR)]
+    [ProducesResponseType((int)HttpStatusCode.OK)]
+    [ProducesResponseType((int)HttpStatusCode.Forbidden)]
+    public ActionResult SetRequiredAnnotationsForDocuments([FromServices] ClientInfo clientInfo, [FromBody] SetRequiredAnnotationsRequest request)
+    {
+        if (clientInfo.LoggedUser == null)
+        {
+            logger.Warning("ClientInfo has null LoggerUser in [Authorized] controller /documents");
+            return Problem();
+        }
+
+        try
+        {
+            documentService.SetRequiredAnnotationsForDocuments(request);
+        }
+        catch (InvalidOperationException e)
+        {
+            throw new BadRequestException(e.Message);
+        }
+        catch (Exception e)
+        {
+            throw new InternalErrorException(e.Message);
+        }
+
+        return Ok();
+    }
 }
 
diff --git a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
index 893ced4..811f3ea 100644
--- a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
+++ b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
@@ -12,6 +12,7 @@ using System.Web;
 using AutoMapper;
 using Models.Users;
 using Ganss.XSS;
+using Core.StaticConfig;
 
 namespace Core.Services.DocumentService
 {
@@ -105,27 +106,12 @@ namespace Core.Services.DocumentService
                 UserAdded = userAdded,
                 Name = documentName,
                 Length = documentContent.Content.Length,
-                RequiredAnnotations = 3                     // TODO this is only for testing purposes
+                RequiredAnnotations = GlobalConfiguration.RequiredAnnotations
             };
 
-            /*foreach (var user in users)
-            {
-                Annotation annotation = new Annotation()
-                {
-                    User = user,
-                    UserAssigned = userAdded,
-                    State = Models.Enums.EState.NEW,
-                    DateAssigned = DateTime.Now,
-                    DateLastChanged = DateTime.Now,
-                    Document = document,
-                    Note = ""
-                };
-                databaseContext.Annotations.Add(annotation);
-            }*/
-
             databaseContext.DocumentContents.Add(documentContent);
             databaseContext.Documents.Add(document);
-            databaseContext.SaveChanges();                  // Maybe do this after all the documents are added
+            databaseContext.SaveChanges();
         }
 
         public DocumentListResponse GetDocuments(int pageIndex, int pageSize)
@@ -169,5 +155,14 @@ namespace Core.Services.DocumentService
             };
         }
 
+        public void SetRequiredAnnotationsForDocuments(SetRequiredAnnotationsRequest request)
+        {
+            var documents = databaseContext.Documents.Where(d => request.DocumentIds.Contains(d.Id));
+            foreach (var doc in documents)
+            {
+                doc.RequiredAnnotations = request.RequiredAnnotations;
+            }
+            databaseContext.SaveChanges();
+        }
     }
 }
diff --git a/Backend/Core/Services/DocumentService/IDocumentService.cs b/Backend/Core/Services/DocumentService/IDocumentService.cs
index ed2943b..016349e 100644
--- a/Backend/Core/Services/DocumentService/IDocumentService.cs
+++ b/Backend/Core/Services/DocumentService/IDocumentService.cs
@@ -14,5 +14,7 @@ namespace Core.Services.DocumentService
         public void AddDocuments(DocumentAddRequest request, Guid userId);
 
         public DocumentListResponse GetDocuments(int pageIdnex, int pageSize);
+
+        public void SetRequiredAnnotationsForDocuments(SetRequiredAnnotationsRequest request);
     }
 }
diff --git a/Backend/Core/StaticConfig/GlobalConfiguration.cs b/Backend/Core/StaticConfig/GlobalConfiguration.cs
new file mode 100644
index 0000000..1048034
--- /dev/null
+++ b/Backend/Core/StaticConfig/GlobalConfiguration.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Core.StaticConfig
+{
+    public class GlobalConfiguration
+    {
+        // Default count of required annotations
+        private static Mutex RequiredAnnotationsMutex = new Mutex();
+        private static int requiredAnnotations = 3;
+        public static int RequiredAnnotations
+        {
+            get { return requiredAnnotations; }
+            set
+            {
+                RequiredAnnotationsMutex.WaitOne();
+                requiredAnnotations = value;
+                RequiredAnnotationsMutex.ReleaseMutex();
+            }
+        }     
+    }
+}
diff --git a/Backend/Models/Documents/DocumentAddInfo.cs b/Backend/Models/Documents/DocumentAddInfo.cs
index 771b59b..7df8a76 100644
--- a/Backend/Models/Documents/DocumentAddInfo.cs
+++ b/Backend/Models/Documents/DocumentAddInfo.cs
@@ -15,6 +15,6 @@ namespace Models.Documents;
 public class DocumentAddInfo
 {
     public string Name { get; set; }
-    public EAddDocumentFormat Format { get; set; }
+    public EAddDocumentFormat Format { get; set; } = EAddDocumentFormat.TEXTFILE;
     public string Content { get; set; }
 }
diff --git a/Backend/Models/Documents/SetRequiredAnnotationsRequest.cs b/Backend/Models/Documents/SetRequiredAnnotationsRequest.cs
new file mode 100644
index 0000000..a9a1f85
--- /dev/null
+++ b/Backend/Models/Documents/SetRequiredAnnotationsRequest.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Models.Documents
+{
+    public class SetRequiredAnnotationsRequest
+    {
+        public int RequiredAnnotations { get; set; }
+        public List<Guid> DocumentIds { get; set; } = new();
+    }
+}
-- 
GitLab


From 0a6d22b709c6b6839c3006d156cd6abcf45a0cd3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vojt=C4=9Bch=20Barti=C4=8Dka?= <aitakaitov@gmail.com>
Date: Wed, 27 Apr 2022 11:08:10 +0200
Subject: [PATCH 02/12] Added endpoint to set global required annotations

---
 .../Backend/Controllers/DocumentController.cs | 28 +++++++++++++++++++
 .../DocumentService/DocumentServiceEF.cs      |  6 ++++
 .../DocumentService/IDocumentService.cs       |  2 ++
 .../SetRequiredAnnotationsGlobalRequest.cs    | 13 +++++++++
 4 files changed, 49 insertions(+)
 create mode 100644 Backend/Models/Documents/SetRequiredAnnotationsGlobalRequest.cs

diff --git a/Backend/Backend/Controllers/DocumentController.cs b/Backend/Backend/Controllers/DocumentController.cs
index acc701f..34168b8 100644
--- a/Backend/Backend/Controllers/DocumentController.cs
+++ b/Backend/Backend/Controllers/DocumentController.cs
@@ -99,5 +99,33 @@ public class DocumentController : Common.CommonControllerBase
 
         return Ok();
     }
+
+    [HttpPost("/documents/requiredAnnotations/global")]
+    [Authorize(Models.Enums.ERole.ADMINISTRATOR)]
+    [ProducesResponseType((int)HttpStatusCode.OK)]
+    [ProducesResponseType((int)HttpStatusCode.Forbidden)]
+    public ActionResult SetRequiredAnnotationsGlobal([FromServices] ClientInfo clientInfo, [FromBody] SetRequiredAnnotationsGlobalRequest request)
+    {
+        if (clientInfo.LoggedUser == null)
+        {
+            logger.Warning("ClientInfo has null LoggerUser in [Authorized] controller /documents");
+            return Problem();
+        }
+
+        try
+        {
+            documentService.SetRequiredAnnotationsGlobal(request.RequiredAnnotations);
+        }
+        catch (InvalidOperationException e)
+        {
+            throw new BadRequestException(e.Message);
+        }
+        catch (Exception e)
+        {
+            throw new InternalErrorException(e.Message);
+        }
+
+        return Ok();
+    }
 }
 
diff --git a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
index 811f3ea..fc7fc92 100644
--- a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
+++ b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
@@ -164,5 +164,11 @@ namespace Core.Services.DocumentService
             }
             databaseContext.SaveChanges();
         }
+
+        public void SetRequiredAnnotationsGlobal(int requiredAnnotations)
+        {
+            GlobalConfiguration.RequiredAnnotations = requiredAnnotations;
+        }
+
     }
 }
diff --git a/Backend/Core/Services/DocumentService/IDocumentService.cs b/Backend/Core/Services/DocumentService/IDocumentService.cs
index 016349e..f77643f 100644
--- a/Backend/Core/Services/DocumentService/IDocumentService.cs
+++ b/Backend/Core/Services/DocumentService/IDocumentService.cs
@@ -16,5 +16,7 @@ namespace Core.Services.DocumentService
         public DocumentListResponse GetDocuments(int pageIdnex, int pageSize);
 
         public void SetRequiredAnnotationsForDocuments(SetRequiredAnnotationsRequest request);
+
+        public void SetRequiredAnnotationsGlobal(int requiredAnnotations);
     }
 }
diff --git a/Backend/Models/Documents/SetRequiredAnnotationsGlobalRequest.cs b/Backend/Models/Documents/SetRequiredAnnotationsGlobalRequest.cs
new file mode 100644
index 0000000..c3281b1
--- /dev/null
+++ b/Backend/Models/Documents/SetRequiredAnnotationsGlobalRequest.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Models.Documents
+{
+    public class SetRequiredAnnotationsGlobalRequest
+    {
+        public int RequiredAnnotations { get; set; }
+    }
+}
-- 
GitLab


From ceb95b98f31af59944eaeb50125c1afeca4ede11 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vojt=C4=9Bch=20Barti=C4=8Dka?= <aitakaitov@gmail.com>
Date: Wed, 27 Apr 2022 11:29:30 +0200
Subject: [PATCH 03/12] Added endpoint to get global required annotations,
 moved configuration to database

---
 .../Backend/Controllers/DocumentController.cs | 30 +++++++++++++++++++
 Backend/Core/Constants/Constants.cs           | 13 ++++++++
 Backend/Core/Contexts/DatabaseContext.cs      |  2 +-
 Backend/Core/Entities/ConfigurationItem.cs    | 14 +++++++++
 Backend/Core/Seeding/Seeder.cs                | 15 ++++++++++
 .../DocumentService/DocumentServiceEF.cs      | 21 ++++++++-----
 .../DocumentService/IDocumentService.cs       |  2 ++
 .../Core/StaticConfig/GlobalConfiguration.cs  | 25 ----------------
 .../GetRequiredAnnotationsGlobalResponse.cs   | 13 ++++++++
 9 files changed, 101 insertions(+), 34 deletions(-)
 create mode 100644 Backend/Core/Constants/Constants.cs
 create mode 100644 Backend/Core/Entities/ConfigurationItem.cs
 delete mode 100644 Backend/Core/StaticConfig/GlobalConfiguration.cs
 create mode 100644 Backend/Models/Documents/GetRequiredAnnotationsGlobalResponse.cs

diff --git a/Backend/Backend/Controllers/DocumentController.cs b/Backend/Backend/Controllers/DocumentController.cs
index 34168b8..54afd9f 100644
--- a/Backend/Backend/Controllers/DocumentController.cs
+++ b/Backend/Backend/Controllers/DocumentController.cs
@@ -127,5 +127,35 @@ public class DocumentController : Common.CommonControllerBase
 
         return Ok();
     }
+
+    [HttpGet("/documents/requiredAnnotations/global")]
+    [Authorize(Models.Enums.ERole.ADMINISTRATOR)]
+    [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GetRequiredAnnotationsGlobalResponse))]
+    [ProducesResponseType((int)HttpStatusCode.Forbidden)]
+    public ActionResult<GetRequiredAnnotationsGlobalResponse> GetRequiredAnnotationsGlobal([FromServices] ClientInfo clientInfo)
+    {
+        if (clientInfo.LoggedUser == null)
+        {
+            logger.Warning("ClientInfo has null LoggerUser in [Authorized] controller /documents");
+            return Problem();
+        }
+
+        try
+        {
+            return Ok(new GetRequiredAnnotationsGlobalResponse()
+            {
+                RequiredAnnotationsGlobal = documentService.GetRequiredAnnotationsGlobal()
+            });
+
+        }
+        catch (InvalidOperationException e)
+        {
+            throw new BadRequestException(e.Message);
+        }
+        catch (Exception e)
+        {
+            throw new InternalErrorException(e.Message);
+        }
+    }
 }
 
diff --git a/Backend/Core/Constants/Constants.cs b/Backend/Core/Constants/Constants.cs
new file mode 100644
index 0000000..fece77c
--- /dev/null
+++ b/Backend/Core/Constants/Constants.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Core.Constants
+{
+    public class Constants
+    {
+        public static string RequiredAnnotationsKey { get; } = "RequiredAnnotations"; 
+    }
+}
diff --git a/Backend/Core/Contexts/DatabaseContext.cs b/Backend/Core/Contexts/DatabaseContext.cs
index ff34af6..d65e36f 100644
--- a/Backend/Core/Contexts/DatabaseContext.cs
+++ b/Backend/Core/Contexts/DatabaseContext.cs
@@ -23,11 +23,11 @@ namespace Core.Contexts
         public DbSet<User> Users { get; set; }
         public DbSet<Annotation> Annotations { get; set; }
         public DbSet<Class> Classes { get; set; }
-        //public DbSet<AnnotationClass> AnnotationsClasses { get; set; }
         public DbSet<AnnotationTag> AnnotationTags { get; set; }
         public DbSet<Tag> Tags { get; set; }
         public DbSet<SubTag> SubTags { get; set; }
         public DbSet<TagCategory> TagCategories { get; set; }
+        public DbSet<ConfigurationItem> ConfigurationItems { get; set; }
 
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
diff --git a/Backend/Core/Entities/ConfigurationItem.cs b/Backend/Core/Entities/ConfigurationItem.cs
new file mode 100644
index 0000000..e0f822f
--- /dev/null
+++ b/Backend/Core/Entities/ConfigurationItem.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Core.Entities
+{
+    public class ConfigurationItem : BaseEntity
+    {
+        public string Value { get; set; }
+        public string Key { get; set; }
+    }
+}
diff --git a/Backend/Core/Seeding/Seeder.cs b/Backend/Core/Seeding/Seeder.cs
index 7fe2795..33b2374 100644
--- a/Backend/Core/Seeding/Seeder.cs
+++ b/Backend/Core/Seeding/Seeder.cs
@@ -21,6 +21,13 @@ namespace Core.Seeding
                 DummyTags.AddDummyTags(context);
                 context.SaveChanges();
 
+                ConfigurationItem configurationItem = new ConfigurationItem()
+                {
+                    Key = Constants.Constants.RequiredAnnotationsKey,
+                    Value = "3"
+                };
+                context.ConfigurationItems.Add(configurationItem);
+
                 AddTagInstance(context);
                 context.SaveChanges();
             }
@@ -126,6 +133,14 @@ namespace Core.Seeding
                     Password = BCrypt.Net.BCrypt.HashPassword("123a456b789c")
                 };
                 context.Users.Add(admin);
+
+                ConfigurationItem configurationItem = new ConfigurationItem()
+                {
+                    Key = Constants.Constants.RequiredAnnotationsKey,
+                    Value = "3"
+                };
+                context.ConfigurationItems.Add(configurationItem);
+
                 context.SaveChanges();
             }
         }
diff --git a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
index fc7fc92..5fe689d 100644
--- a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
+++ b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
@@ -12,7 +12,6 @@ using System.Web;
 using AutoMapper;
 using Models.Users;
 using Ganss.XSS;
-using Core.StaticConfig;
 
 namespace Core.Services.DocumentService
 {
@@ -41,8 +40,7 @@ namespace Core.Services.DocumentService
         public void AddDocuments(DocumentAddRequest request, Guid userId)
         {
             User user = databaseContext.Users.Single(u => u.Id == userId);
-
-            var users = databaseContext.Users.Select(u => u).ToList();
+            int requiredAnnotations = int.Parse(databaseContext.ConfigurationItems.Single(ci => ci.Key == Constants.Constants.RequiredAnnotationsKey).Value);
 
             foreach (var documentInfo in request.Documents)
             {
@@ -50,14 +48,14 @@ namespace Core.Services.DocumentService
                 {
                     // TODO hardcoded UTF-8 - maybe do something smarter
                     var documentContent = Encoding.UTF8.GetString(Convert.FromBase64String(documentInfo.Content));
-                    SaveDocument(documentContent, user, documentInfo.Name, users);
+                    SaveDocument(documentContent, user, documentInfo.Name, requiredAnnotations);
                 }
                 else if (documentInfo.Format == Models.Enums.EAddDocumentFormat.ZIP)
                 {
                     var (names, contents) = UnzipDocuments(documentInfo.Content);
                     for (int i = 0; i < names.Count; i++)
                     {
-                        SaveDocument(contents[i], user, names[i], users);
+                        SaveDocument(contents[i], user, names[i], requiredAnnotations);
                     }
                 }
             }
@@ -92,7 +90,7 @@ namespace Core.Services.DocumentService
             return (names, contents);
         }
 
-        private void SaveDocument(string content, User userAdded, string documentName, List<User> users)
+        private void SaveDocument(string content, User userAdded, string documentName, int requiredAnnotations)
         {
             DocumentContent documentContent = new DocumentContent()
             {
@@ -106,7 +104,7 @@ namespace Core.Services.DocumentService
                 UserAdded = userAdded,
                 Name = documentName,
                 Length = documentContent.Content.Length,
-                RequiredAnnotations = GlobalConfiguration.RequiredAnnotations
+                RequiredAnnotations = requiredAnnotations
             };
 
             databaseContext.DocumentContents.Add(documentContent);
@@ -167,8 +165,15 @@ namespace Core.Services.DocumentService
 
         public void SetRequiredAnnotationsGlobal(int requiredAnnotations)
         {
-            GlobalConfiguration.RequiredAnnotations = requiredAnnotations;
+            var requiredAnnotationsItem = databaseContext.ConfigurationItems.Single(ci => ci.Key == Constants.Constants.RequiredAnnotationsKey);
+            requiredAnnotationsItem.Value = requiredAnnotations.ToString();
+            databaseContext.SaveChanges();
         }
 
+        public int GetRequiredAnnotationsGlobal()
+        {
+            var requiredAnnotationsItem = databaseContext.ConfigurationItems.Single(ci => ci.Key == Constants.Constants.RequiredAnnotationsKey);
+            return int.Parse(requiredAnnotationsItem.Value);
+        }
     }
 }
diff --git a/Backend/Core/Services/DocumentService/IDocumentService.cs b/Backend/Core/Services/DocumentService/IDocumentService.cs
index f77643f..0882815 100644
--- a/Backend/Core/Services/DocumentService/IDocumentService.cs
+++ b/Backend/Core/Services/DocumentService/IDocumentService.cs
@@ -18,5 +18,7 @@ namespace Core.Services.DocumentService
         public void SetRequiredAnnotationsForDocuments(SetRequiredAnnotationsRequest request);
 
         public void SetRequiredAnnotationsGlobal(int requiredAnnotations);
+
+        public int GetRequiredAnnotationsGlobal();
     }
 }
diff --git a/Backend/Core/StaticConfig/GlobalConfiguration.cs b/Backend/Core/StaticConfig/GlobalConfiguration.cs
deleted file mode 100644
index 1048034..0000000
--- a/Backend/Core/StaticConfig/GlobalConfiguration.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Core.StaticConfig
-{
-    public class GlobalConfiguration
-    {
-        // Default count of required annotations
-        private static Mutex RequiredAnnotationsMutex = new Mutex();
-        private static int requiredAnnotations = 3;
-        public static int RequiredAnnotations
-        {
-            get { return requiredAnnotations; }
-            set
-            {
-                RequiredAnnotationsMutex.WaitOne();
-                requiredAnnotations = value;
-                RequiredAnnotationsMutex.ReleaseMutex();
-            }
-        }     
-    }
-}
diff --git a/Backend/Models/Documents/GetRequiredAnnotationsGlobalResponse.cs b/Backend/Models/Documents/GetRequiredAnnotationsGlobalResponse.cs
new file mode 100644
index 0000000..71053bd
--- /dev/null
+++ b/Backend/Models/Documents/GetRequiredAnnotationsGlobalResponse.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Models.Documents
+{
+    public class GetRequiredAnnotationsGlobalResponse
+    {
+        public int RequiredAnnotationsGlobal { get; set; }
+    }
+}
-- 
GitLab


From 9eaf82069d74a6f4939064d805d9d68daf64e265 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vojt=C4=9Bch=20Barti=C4=8Dka?= <aitakaitov@gmail.com>
Date: Wed, 27 Apr 2022 11:31:56 +0200
Subject: [PATCH 04/12] Database migration added

---
 .../Migrations/20220427093145_V4.Designer.cs  | 414 ++++++++++++++++++
 .../Backend/Migrations/20220427093145_V4.cs   |  32 ++
 .../DatabaseContextModelSnapshot.cs           |  19 +
 3 files changed, 465 insertions(+)
 create mode 100644 Backend/Backend/Migrations/20220427093145_V4.Designer.cs
 create mode 100644 Backend/Backend/Migrations/20220427093145_V4.cs

diff --git a/Backend/Backend/Migrations/20220427093145_V4.Designer.cs b/Backend/Backend/Migrations/20220427093145_V4.Designer.cs
new file mode 100644
index 0000000..eaa1983
--- /dev/null
+++ b/Backend/Backend/Migrations/20220427093145_V4.Designer.cs
@@ -0,0 +1,414 @@
+// <auto-generated />
+using System;
+using Core.Contexts;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace RestAPI.Migrations
+{
+    [DbContext(typeof(DatabaseContext))]
+    [Migration("20220427093145_V4")]
+    partial class V4
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "6.0.3")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+            modelBuilder.Entity("AnnotationClass", b =>
+                {
+                    b.Property<Guid>("AnnotationsId")
+                        .HasColumnType("uuid");
+
+                    b.Property<Guid>("ClassesId")
+                        .HasColumnType("uuid");
+
+                    b.HasKey("AnnotationsId", "ClassesId");
+
+                    b.HasIndex("ClassesId");
+
+                    b.ToTable("AnnotationClass");
+                });
+
+            modelBuilder.Entity("Core.Entities.Annotation", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<DateTime>("DateAssigned")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<DateTime>("DateLastChanged")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<Guid>("DocumentId")
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Note")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("State")
+                        .HasColumnType("integer");
+
+                    b.Property<Guid>("UserAssignedId")
+                        .HasColumnType("uuid");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uuid");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DocumentId");
+
+                    b.HasIndex("UserAssignedId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("Annotations");
+                });
+
+            modelBuilder.Entity("Core.Entities.AnnotationTag", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<Guid>("AnnotationId")
+                        .HasColumnType("uuid");
+
+                    b.Property<Guid>("Instance")
+                        .HasColumnType("uuid");
+
+                    b.Property<int>("Length")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Note")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<int>("Position")
+                        .HasColumnType("integer");
+
+                    b.Property<Guid?>("SubTagId")
+                        .HasColumnType("uuid");
+
+                    b.Property<Guid>("TagId")
+                        .HasColumnType("uuid");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("AnnotationId");
+
+                    b.HasIndex("SubTagId");
+
+                    b.HasIndex("TagId");
+
+                    b.ToTable("AnnotationTags");
+                });
+
+            modelBuilder.Entity("Core.Entities.Class", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Color")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Classes");
+                });
+
+            modelBuilder.Entity("Core.Entities.ConfigurationItem", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Key")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Value")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("ConfigurationItems");
+                });
+
+            modelBuilder.Entity("Core.Entities.Document", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<Guid?>("ContentId")
+                        .HasColumnType("uuid");
+
+                    b.Property<DateTime>("DateAdded")
+                        .HasColumnType("timestamp with time zone");
+
+                    b.Property<int>("Length")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("text");
+
+                    b.Property<int>("RequiredAnnotations")
+                        .HasColumnType("integer");
+
+                    b.Property<Guid?>("UserAddedId")
+                        .HasColumnType("uuid");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ContentId");
+
+                    b.HasIndex("UserAddedId");
+
+                    b.ToTable("Documents");
+                });
+
+            modelBuilder.Entity("Core.Entities.DocumentContent", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("DocumentContents");
+                });
+
+            modelBuilder.Entity("Core.Entities.SubTag", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<Guid>("TagId")
+                        .HasColumnType("uuid");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TagId");
+
+                    b.ToTable("SubTags");
+                });
+
+            modelBuilder.Entity("Core.Entities.Tag", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<Guid>("CategoryId")
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Color")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CategoryId");
+
+                    b.ToTable("Tags");
+                });
+
+            modelBuilder.Entity("Core.Entities.TagCategory", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Color")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("TagCategories");
+                });
+
+            modelBuilder.Entity("Core.Entities.User", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Password")
+                        .HasColumnType("text");
+
+                    b.Property<int>("Role")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Surname")
+                        .HasColumnType("text");
+
+                    b.Property<string>("Username")
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("AnnotationClass", b =>
+                {
+                    b.HasOne("Core.Entities.Annotation", null)
+                        .WithMany()
+                        .HasForeignKey("AnnotationsId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Core.Entities.Class", null)
+                        .WithMany()
+                        .HasForeignKey("ClassesId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Core.Entities.Annotation", b =>
+                {
+                    b.HasOne("Core.Entities.Document", "Document")
+                        .WithMany()
+                        .HasForeignKey("DocumentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Core.Entities.User", "UserAssigned")
+                        .WithMany()
+                        .HasForeignKey("UserAssignedId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Core.Entities.User", "User")
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Document");
+
+                    b.Navigation("User");
+
+                    b.Navigation("UserAssigned");
+                });
+
+            modelBuilder.Entity("Core.Entities.AnnotationTag", b =>
+                {
+                    b.HasOne("Core.Entities.Annotation", "Annotation")
+                        .WithMany()
+                        .HasForeignKey("AnnotationId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Core.Entities.SubTag", "SubTag")
+                        .WithMany()
+                        .HasForeignKey("SubTagId");
+
+                    b.HasOne("Core.Entities.Tag", "Tag")
+                        .WithMany()
+                        .HasForeignKey("TagId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Annotation");
+
+                    b.Navigation("SubTag");
+
+                    b.Navigation("Tag");
+                });
+
+            modelBuilder.Entity("Core.Entities.Document", b =>
+                {
+                    b.HasOne("Core.Entities.DocumentContent", "Content")
+                        .WithMany()
+                        .HasForeignKey("ContentId");
+
+                    b.HasOne("Core.Entities.User", "UserAdded")
+                        .WithMany()
+                        .HasForeignKey("UserAddedId");
+
+                    b.Navigation("Content");
+
+                    b.Navigation("UserAdded");
+                });
+
+            modelBuilder.Entity("Core.Entities.SubTag", b =>
+                {
+                    b.HasOne("Core.Entities.Tag", "Tag")
+                        .WithMany()
+                        .HasForeignKey("TagId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Tag");
+                });
+
+            modelBuilder.Entity("Core.Entities.Tag", b =>
+                {
+                    b.HasOne("Core.Entities.TagCategory", "Category")
+                        .WithMany()
+                        .HasForeignKey("CategoryId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Category");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/Backend/Backend/Migrations/20220427093145_V4.cs b/Backend/Backend/Migrations/20220427093145_V4.cs
new file mode 100644
index 0000000..1b28fea
--- /dev/null
+++ b/Backend/Backend/Migrations/20220427093145_V4.cs
@@ -0,0 +1,32 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace RestAPI.Migrations
+{
+    public partial class V4 : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.CreateTable(
+                name: "ConfigurationItems",
+                columns: table => new
+                {
+                    Id = table.Column<Guid>(type: "uuid", nullable: false),
+                    Value = table.Column<string>(type: "text", nullable: false),
+                    Key = table.Column<string>(type: "text", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_ConfigurationItems", x => x.Id);
+                });
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "ConfigurationItems");
+        }
+    }
+}
diff --git a/Backend/Backend/Migrations/DatabaseContextModelSnapshot.cs b/Backend/Backend/Migrations/DatabaseContextModelSnapshot.cs
index 5f9ffb3..66256dc 100644
--- a/Backend/Backend/Migrations/DatabaseContextModelSnapshot.cs
+++ b/Backend/Backend/Migrations/DatabaseContextModelSnapshot.cs
@@ -138,6 +138,25 @@ namespace RestAPI.Migrations
                     b.ToTable("Classes");
                 });
 
+            modelBuilder.Entity("Core.Entities.ConfigurationItem", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uuid");
+
+                    b.Property<string>("Key")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.Property<string>("Value")
+                        .IsRequired()
+                        .HasColumnType("text");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("ConfigurationItems");
+                });
+
             modelBuilder.Entity("Core.Entities.Document", b =>
                 {
                     b.Property<Guid>("Id")
-- 
GitLab


From 3cee56d3be15d94be8afa0157d191d6602c72e1e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vojt=C4=9Bch=20Barti=C4=8Dka?= <aitakaitov@gmail.com>
Date: Thu, 5 May 2022 15:25:08 +0200
Subject: [PATCH 05/12] Annotation state returned with document list info

---
 Backend/Core/MapperProfiles/UserProfileEF.cs   |  3 ++-
 .../DocumentService/DocumentServiceEF.cs       | 14 +++++++++++++-
 Backend/Models/Documents/DocumentListInfo.cs   |  2 +-
 Backend/Models/Users/DocumentUserInfo.cs       | 18 ++++++++++++++++++
 4 files changed, 34 insertions(+), 3 deletions(-)
 create mode 100644 Backend/Models/Users/DocumentUserInfo.cs

diff --git a/Backend/Core/MapperProfiles/UserProfileEF.cs b/Backend/Core/MapperProfiles/UserProfileEF.cs
index b409924..07486ec 100644
--- a/Backend/Core/MapperProfiles/UserProfileEF.cs
+++ b/Backend/Core/MapperProfiles/UserProfileEF.cs
@@ -13,7 +13,8 @@ namespace Core.MapperProfiles
     {
         public UserProfileEF()
         {
-           CreateMap<User, UserInfo>();
+            CreateMap<User, UserInfo>();
+            CreateMap<User, DocumentUserInfo>();
         }
     }
 }
diff --git a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
index 5fe689d..4df9466 100644
--- a/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
+++ b/Backend/Core/Services/DocumentService/DocumentServiceEF.cs
@@ -12,6 +12,7 @@ using System.Web;
 using AutoMapper;
 using Models.Users;
 using Ganss.XSS;
+using Microsoft.EntityFrameworkCore;
 
 namespace Core.Services.DocumentService
 {
@@ -137,7 +138,18 @@ namespace Core.Services.DocumentService
             foreach (var document in documents.GetRange(firstIndex, pageSize))
             {
                 var annotatingUsers = databaseContext.Annotations.Where(a => a.Document == document).Select(a => a.User).ToList();
-                List<UserInfo> annotatingUsersDto = annotatingUsers.Select(a => mapper.Map<UserInfo>(a)).ToList();
+                List<DocumentUserInfo> annotatingUsersDto = new();
+               
+                // Include annotation state
+                foreach (var annotatingUser in annotatingUsers)
+                {
+                    var annotation = databaseContext.Annotations
+                        .Include(a => a.Document)
+                        .Single(a => a.Document == document && a.User == annotatingUser);
+                    var dui = mapper.Map<DocumentUserInfo>(annotatingUser);
+                    dui.State = annotation.State;
+                    annotatingUsersDto.Add(dui);
+                }
 
                 DocumentListInfo dai = mapper.Map<DocumentListInfo>(document);
                 dai.AnnotatingUsers = annotatingUsersDto;
diff --git a/Backend/Models/Documents/DocumentListInfo.cs b/Backend/Models/Documents/DocumentListInfo.cs
index 3f1ba24..e7c8a30 100644
--- a/Backend/Models/Documents/DocumentListInfo.cs
+++ b/Backend/Models/Documents/DocumentListInfo.cs
@@ -14,5 +14,5 @@ public class DocumentListInfo
     public string Name { get; set; }
     public int Length { get; set; }
     public int RequiredAnnotations { get; set; }
-    public List<UserInfo> AnnotatingUsers { get; set; } = new();
+    public List<DocumentUserInfo> AnnotatingUsers { get; set; } = new();
 }
diff --git a/Backend/Models/Users/DocumentUserInfo.cs b/Backend/Models/Users/DocumentUserInfo.cs
new file mode 100644
index 0000000..e035944
--- /dev/null
+++ b/Backend/Models/Users/DocumentUserInfo.cs
@@ -0,0 +1,18 @@
+using Models.Enums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Models.Users
+{
+    public class DocumentUserInfo
+    {
+        public Guid Id { get; set; }
+        public string Username { get; set; }
+        public string Name { get; set; }
+        public string Surname { get; set; }
+        public EState State { get; set; }
+    }
+}
-- 
GitLab


From 19b68a2e9efb6b81550a552023a1f835c00287aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Vlc=CC=8Cek?= <vlcek@net-inout.cz>
Date: Thu, 5 May 2022 16:56:03 +0200
Subject: [PATCH 06/12] API client regenerated

---
 webapp/api/api.ts | 1952 ++++++++++++++++++++-------------------------
 1 file changed, 861 insertions(+), 1091 deletions(-)

diff --git a/webapp/api/api.ts b/webapp/api/api.ts
index e4725da..6035620 100644
--- a/webapp/api/api.ts
+++ b/webapp/api/api.ts
@@ -5,434 +5,457 @@
  * KIV/ASWI ZČU Plzeň, 2022
  *
  * The version of the OpenAPI document: 0.1.1
- *
+ * 
  *
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
  * https://openapi-generator.tech
  * Do not edit the class manually.
  */
 
+
 import { Configuration } from './configuration';
 import globalAxios, { AxiosPromise, AxiosInstance, AxiosRequestConfig } from 'axios';
 // Some imports not used depending on template conditions
 // @ts-ignore
-import {
-    DUMMY_BASE_URL,
-    assertParamExists,
-    setApiKeyToObject,
-    setBasicAuthToObject,
-    setBearerAuthToObject,
-    setOAuthToObject,
-    setSearchParams,
-    serializeDataIfNeeded,
-    toPathString,
-    createRequestFunction,
-} from './common';
+import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from './common';
 // @ts-ignore
-import {
-    BASE_PATH,
-    COLLECTION_FORMATS,
-    RequestArgs,
-    BaseAPI,
-    RequiredError,
-} from './base';
+import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from './base';
 
 /**
- *
+ * 
  * @export
  * @interface AnnotationInfo
  */
 export interface AnnotationInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof AnnotationInfo
      */
-    sourceDocumentContent?: string | null;
+    'sourceDocumentContent'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof AnnotationInfo
      */
-    documentToRender?: string | null;
+    'documentToRender'?: string | null;
     /**
-     *
+     * 
      * @type {Array<number>}
      * @memberof AnnotationInfo
      */
-    tagStartPositions?: Array<number> | null;
+    'tagStartPositions'?: Array<number> | null;
     /**
-     *
+     * 
      * @type {Array<number>}
      * @memberof AnnotationInfo
      */
-    tagLengths?: Array<number> | null;
+    'tagLengths'?: Array<number> | null;
     /**
-     *
+     * 
      * @type {EState}
      * @memberof AnnotationInfo
      */
-    state?: EState;
+    'state'?: EState;
     /**
-     *
+     * 
      * @type {EDocumentType}
      * @memberof AnnotationInfo
      */
-    type?: EDocumentType;
+    'type'?: EDocumentType;
     /**
-     *
+     * 
      * @type {string}
      * @memberof AnnotationInfo
      */
-    note?: string | null;
+    'note'?: string | null;
     /**
-     *
+     * 
      * @type {Array<TagInstanceInfo>}
      * @memberof AnnotationInfo
      */
-    tagInstances?: Array<TagInstanceInfo> | null;
+    'tagInstances'?: Array<TagInstanceInfo> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface AnnotationInstanceAddRequest
  */
 export interface AnnotationInstanceAddRequest {
     /**
-     *
+     * 
      * @type {number}
      * @memberof AnnotationInstanceAddRequest
      */
-    position?: number;
+    'position'?: number;
     /**
-     *
+     * 
      * @type {number}
      * @memberof AnnotationInstanceAddRequest
      */
-    length?: number;
+    'length'?: number;
     /**
-     *
+     * 
      * @type {ETagType}
      * @memberof AnnotationInstanceAddRequest
      */
-    type?: ETagType;
+    'type'?: ETagType;
     /**
-     *
+     * 
      * @type {string}
      * @memberof AnnotationInstanceAddRequest
      */
-    id?: string;
+    'id'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof AnnotationInstanceAddRequest
      */
-    instanceId?: string | null;
+    'instanceId'?: string | null;
 }
 /**
- *
+ * 
  * @export
  * @interface AnnotationListInfo
  */
 export interface AnnotationListInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof AnnotationListInfo
      */
-    documentName?: string | null;
+    'documentName'?: string | null;
     /**
-     *
+     * 
      * @type {EState}
      * @memberof AnnotationListInfo
      */
-    state?: EState;
+    'state'?: EState;
     /**
-     *
+     * 
      * @type {string}
      * @memberof AnnotationListInfo
      */
-    annotationId?: string;
+    'annotationId'?: string;
 }
 /**
- *
+ * 
  * @export
  * @interface AnnotationListResponse
  */
 export interface AnnotationListResponse {
     /**
-     *
+     * 
      * @type {Array<AnnotationListInfo>}
      * @memberof AnnotationListResponse
      */
-    annotations?: Array<AnnotationListInfo> | null;
+    'annotations'?: Array<AnnotationListInfo> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface AnnotationsAddRequest
  */
 export interface AnnotationsAddRequest {
     /**
-     *
+     * 
      * @type {Array<string>}
      * @memberof AnnotationsAddRequest
      */
-    userIdList?: Array<string> | null;
+    'userIdList'?: Array<string> | null;
     /**
-     *
+     * 
      * @type {Array<string>}
      * @memberof AnnotationsAddRequest
      */
-    documentIdList?: Array<string> | null;
+    'documentIdList'?: Array<string> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface ChangeUserInfoRequest
  */
 export interface ChangeUserInfoRequest {
     /**
-     *
+     * 
      * @type {string}
      * @memberof ChangeUserInfoRequest
      */
-    password?: string | null;
+    'password'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof ChangeUserInfoRequest
      */
-    username?: string | null;
+    'username'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof ChangeUserInfoRequest
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof ChangeUserInfoRequest
      */
-    surname?: string | null;
+    'surname'?: string | null;
     /**
-     *
+     * 
      * @type {ERole}
      * @memberof ChangeUserInfoRequest
      */
-    role?: ERole;
+    'role'?: ERole;
 }
 /**
- *
+ * 
  * @export
  * @interface ClientInfo
  */
 export interface ClientInfo {
     /**
-     *
+     * 
      * @type {boolean}
      * @memberof ClientInfo
      */
-    isLogged?: boolean;
+    'isLogged'?: boolean;
     /**
-     *
+     * 
      * @type {User}
      * @memberof ClientInfo
      */
-    loggedUser?: User;
+    'loggedUser'?: User;
     /**
-     *
+     * 
      * @type {string}
      * @memberof ClientInfo
      */
-    ip?: string | null;
+    'ip'?: string | null;
 }
 /**
- *
+ * 
  * @export
  * @interface CreateUserRequest
  */
 export interface CreateUserRequest {
     /**
-     *
+     * 
      * @type {string}
      * @memberof CreateUserRequest
      */
-    username?: string | null;
+    'username'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof CreateUserRequest
      */
-    password?: string | null;
+    'password'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof CreateUserRequest
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof CreateUserRequest
      */
-    surname?: string | null;
+    'surname'?: string | null;
     /**
-     *
+     * 
      * @type {ERole}
      * @memberof CreateUserRequest
      */
-    role?: ERole;
+    'role'?: ERole;
 }
 /**
- *
+ * 
  * @export
  * @interface DocumentAddInfo
  */
 export interface DocumentAddInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof DocumentAddInfo
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {EAddDocumentFormat}
      * @memberof DocumentAddInfo
      */
-    format?: EAddDocumentFormat;
+    'format'?: EAddDocumentFormat;
     /**
-     *
+     * 
      * @type {string}
      * @memberof DocumentAddInfo
      */
-    content?: string | null;
+    'content'?: string | null;
 }
 /**
- *
+ * 
  * @export
  * @interface DocumentAddRequest
  */
 export interface DocumentAddRequest {
     /**
-     *
+     * 
      * @type {Array<DocumentAddInfo>}
      * @memberof DocumentAddRequest
      */
-    documents?: Array<DocumentAddInfo> | null;
+    'documents'?: Array<DocumentAddInfo> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface DocumentListInfo
  */
 export interface DocumentListInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof DocumentListInfo
      */
-    id?: string;
+    'id'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof DocumentListInfo
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {number}
      * @memberof DocumentListInfo
      */
-    length?: number;
+    'length'?: number;
     /**
-     *
+     * 
      * @type {number}
      * @memberof DocumentListInfo
      */
-    requiredAnnotations?: number;
+    'requiredAnnotations'?: number;
     /**
-     *
-     * @type {Array<UserInfo>}
+     * 
+     * @type {Array<DocumentUserInfo>}
      * @memberof DocumentListInfo
      */
-    annotatingUsers?: Array<UserInfo> | null;
+    'annotatingUsers'?: Array<DocumentUserInfo> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface DocumentListResponse
  */
 export interface DocumentListResponse {
     /**
-     *
+     * 
      * @type {number}
      * @memberof DocumentListResponse
      */
-    totalCount?: number;
+    'totalCount'?: number;
     /**
-     *
+     * 
      * @type {number}
      * @memberof DocumentListResponse
      */
-    pageCount?: number;
+    'pageCount'?: number;
     /**
-     *
+     * 
      * @type {number}
      * @memberof DocumentListResponse
      */
-    pageIndex?: number;
+    'pageIndex'?: number;
     /**
-     *
+     * 
      * @type {Array<DocumentListInfo>}
      * @memberof DocumentListResponse
      */
-    documents?: Array<DocumentListInfo> | null;
+    'documents'?: Array<DocumentListInfo> | null;
 }
 /**
- *
+ * 
+ * @export
+ * @interface DocumentUserInfo
+ */
+export interface DocumentUserInfo {
+    /**
+     * 
+     * @type {string}
+     * @memberof DocumentUserInfo
+     */
+    'id'?: string;
+    /**
+     * 
+     * @type {string}
+     * @memberof DocumentUserInfo
+     */
+    'username'?: string | null;
+    /**
+     * 
+     * @type {string}
+     * @memberof DocumentUserInfo
+     */
+    'name'?: string | null;
+    /**
+     * 
+     * @type {string}
+     * @memberof DocumentUserInfo
+     */
+    'surname'?: string | null;
+    /**
+     * 
+     * @type {EState}
+     * @memberof DocumentUserInfo
+     */
+    'state'?: EState;
+}
+/**
+ * 
  * @export
  * @enum {string}
  */
 
 export const EAddDocumentFormat = {
     Zip: 'ZIP',
-    Textfile: 'TEXTFILE',
+    Textfile: 'TEXTFILE'
 } as const;
 
-export type EAddDocumentFormat =
-    typeof EAddDocumentFormat[keyof typeof EAddDocumentFormat];
+export type EAddDocumentFormat = typeof EAddDocumentFormat[keyof typeof EAddDocumentFormat];
+
 
 /**
- *
+ * 
  * @export
  * @enum {string}
  */
 
 export const EDocumentType = {
     Html: 'HTML',
-    Text: 'TEXT',
+    Text: 'TEXT'
 } as const;
 
 export type EDocumentType = typeof EDocumentType[keyof typeof EDocumentType];
 
+
 /**
- *
+ * 
  * @export
  * @enum {string}
  */
 
 export const ERole = {
     Annotator: 'ANNOTATOR',
-    Administrator: 'ADMINISTRATOR',
+    Administrator: 'ADMINISTRATOR'
 } as const;
 
 export type ERole = typeof ERole[keyof typeof ERole];
 
+
 /**
- *
+ * 
  * @export
  * @enum {string}
  */
@@ -440,76 +463,91 @@ export type ERole = typeof ERole[keyof typeof ERole];
 export const EState = {
     Done: 'DONE',
     InProgress: 'IN_PROGRESS',
-    New: 'NEW',
+    New: 'NEW'
 } as const;
 
 export type EState = typeof EState[keyof typeof EState];
 
+
 /**
- *
+ * 
  * @export
  * @enum {string}
  */
 
 export const ETagType = {
     Tag: 'TAG',
-    Subtag: 'SUBTAG',
+    Subtag: 'SUBTAG'
 } as const;
 
 export type ETagType = typeof ETagType[keyof typeof ETagType];
 
+
 /**
- *
+ * 
+ * @export
+ * @interface GetRequiredAnnotationsGlobalResponse
+ */
+export interface GetRequiredAnnotationsGlobalResponse {
+    /**
+     * 
+     * @type {number}
+     * @memberof GetRequiredAnnotationsGlobalResponse
+     */
+    'requiredAnnotationsGlobal'?: number;
+}
+/**
+ * 
  * @export
  * @interface LoginRequest
  */
 export interface LoginRequest {
     /**
-     *
+     * 
      * @type {string}
      * @memberof LoginRequest
      */
-    username?: string | null;
+    'username'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof LoginRequest
      */
-    password?: string | null;
+    'password'?: string | null;
 }
 /**
- *
+ * 
  * @export
  * @interface LoginResponse
  */
 export interface LoginResponse {
     /**
-     *
+     * 
      * @type {boolean}
      * @memberof LoginResponse
      */
-    ok?: boolean;
+    'ok'?: boolean;
     /**
-     *
+     * 
      * @type {string}
      * @memberof LoginResponse
      */
-    token?: string | null;
+    'token'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof LoginResponse
      */
-    expiration?: string;
+    'expiration'?: string;
     /**
-     *
+     * 
      * @type {ERole}
      * @memberof LoginResponse
      */
-    role?: ERole;
+    'role'?: ERole;
 }
 /**
- *
+ * 
  * @export
  * @interface ProblemDetails
  */
@@ -517,301 +555,333 @@ export interface ProblemDetails {
     [key: string]: any | any;
 
     /**
-     *
+     * 
      * @type {string}
      * @memberof ProblemDetails
      */
-    type?: string | null;
+    'type'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof ProblemDetails
      */
-    title?: string | null;
+    'title'?: string | null;
     /**
-     *
+     * 
      * @type {number}
      * @memberof ProblemDetails
      */
-    status?: number | null;
+    'status'?: number | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof ProblemDetails
      */
-    detail?: string | null;
+    'detail'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof ProblemDetails
      */
-    instance?: string | null;
+    'instance'?: string | null;
 }
 /**
- *
+ * 
+ * @export
+ * @interface SetRequiredAnnotationsGlobalRequest
+ */
+export interface SetRequiredAnnotationsGlobalRequest {
+    /**
+     * 
+     * @type {number}
+     * @memberof SetRequiredAnnotationsGlobalRequest
+     */
+    'requiredAnnotations'?: number;
+}
+/**
+ * 
+ * @export
+ * @interface SetRequiredAnnotationsRequest
+ */
+export interface SetRequiredAnnotationsRequest {
+    /**
+     * 
+     * @type {number}
+     * @memberof SetRequiredAnnotationsRequest
+     */
+    'requiredAnnotations'?: number;
+    /**
+     * 
+     * @type {Array<string>}
+     * @memberof SetRequiredAnnotationsRequest
+     */
+    'documentIds'?: Array<string> | null;
+}
+/**
+ * 
  * @export
  * @interface SubTagInfo
  */
 export interface SubTagInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof SubTagInfo
      */
-    id?: string;
+    'id'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof SubTagInfo
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof SubTagInfo
      */
-    description?: string | null;
+    'description'?: string | null;
 }
 /**
- *
+ * 
  * @export
  * @interface TagCategoryInfo
  */
 export interface TagCategoryInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagCategoryInfo
      */
-    id?: string;
+    'id'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagCategoryInfo
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagCategoryInfo
      */
-    description?: string | null;
+    'description'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagCategoryInfo
      */
-    color?: string | null;
+    'color'?: string | null;
     /**
-     *
+     * 
      * @type {Array<TagInfo>}
      * @memberof TagCategoryInfo
      */
-    tags?: Array<TagInfo> | null;
+    'tags'?: Array<TagInfo> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface TagInfo
  */
 export interface TagInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInfo
      */
-    id?: string;
+    'id'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInfo
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInfo
      */
-    description?: string | null;
+    'description'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInfo
      */
-    color?: string | null;
+    'color'?: string | null;
     /**
-     *
+     * 
      * @type {Array<SubTagInfo>}
      * @memberof TagInfo
      */
-    subTags?: Array<SubTagInfo> | null;
+    'subTags'?: Array<SubTagInfo> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface TagInstanceInfo
  */
 export interface TagInstanceInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    occurenceId?: string;
+    'occurenceId'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    tagName?: string | null;
+    'tagName'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    tagId?: string;
+    'tagId'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    tagCategoryName?: string | null;
+    'tagCategoryName'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    tagCategoryId?: string;
+    'tagCategoryId'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    subTagName?: string | null;
+    'subTagName'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    subTagId?: string | null;
+    'subTagId'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    instance?: string;
+    'instance'?: string;
     /**
-     *
+     * 
      * @type {number}
      * @memberof TagInstanceInfo
      */
-    position?: number;
+    'position'?: number;
     /**
-     *
+     * 
      * @type {number}
      * @memberof TagInstanceInfo
      */
-    length?: number;
+    'length'?: number;
     /**
-     *
+     * 
      * @type {string}
      * @memberof TagInstanceInfo
      */
-    note?: string | null;
+    'note'?: string | null;
 }
 /**
- *
+ * 
  * @export
  * @interface TagTreeResponse
  */
 export interface TagTreeResponse {
     /**
-     *
+     * 
      * @type {Array<TagCategoryInfo>}
      * @memberof TagTreeResponse
      */
-    tagCategories?: Array<TagCategoryInfo> | null;
+    'tagCategories'?: Array<TagCategoryInfo> | null;
 }
 /**
- *
+ * 
  * @export
  * @interface User
  */
 export interface User {
     /**
-     *
+     * 
      * @type {string}
      * @memberof User
      */
-    id?: string;
+    'id'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof User
      */
-    username?: string | null;
+    'username'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof User
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof User
      */
-    surname?: string | null;
+    'surname'?: string | null;
     /**
-     *
+     * 
      * @type {ERole}
      * @memberof User
      */
-    role?: ERole;
+    'role'?: ERole;
 }
 /**
- *
+ * 
  * @export
  * @interface UserInfo
  */
 export interface UserInfo {
     /**
-     *
+     * 
      * @type {string}
      * @memberof UserInfo
      */
-    id?: string;
+    'id'?: string;
     /**
-     *
+     * 
      * @type {string}
      * @memberof UserInfo
      */
-    username?: string | null;
+    'username'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof UserInfo
      */
-    name?: string | null;
+    'name'?: string | null;
     /**
-     *
+     * 
      * @type {string}
      * @memberof UserInfo
      */
-    surname?: string | null;
+    'surname'?: string | null;
 }
 /**
- *
+ * 
  * @export
  * @interface UserList
  */
 export interface UserList {
     /**
-     *
+     * 
      * @type {Array<UserInfo>}
      * @memberof UserList
      */
-    users?: Array<UserInfo> | null;
+    'users'?: Array<UserInfo> | null;
 }
 
 /**
@@ -821,21 +891,16 @@ export interface UserList {
 export const AnnotationApiAxiosParamCreator = function (configuration?: Configuration) {
     return {
         /**
-         *
-         * @param {string} annotationId
+         * 
+         * @param {string} annotationId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationAnnotationIdGet: async (
-            annotationId: string,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        annotationAnnotationIdGet: async (annotationId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'annotationId' is not null or undefined
-            assertParamExists('annotationAnnotationIdGet', 'annotationId', annotationId);
-            const localVarPath = `/annotation/{annotationId}`.replace(
-                `{${'annotationId'}}`,
-                encodeURIComponent(String(annotationId))
-            );
+            assertParamExists('annotationAnnotationIdGet', 'annotationId', annotationId)
+            const localVarPath = `/annotation/{annotationId}`
+                .replace(`{${"annotationId"}}`, encodeURIComponent(String(annotationId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
             let baseOptions;
@@ -843,18 +908,15 @@ export const AnnotationApiAxiosParamCreator = function (configuration?: Configur
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -862,32 +924,20 @@ export const AnnotationApiAxiosParamCreator = function (configuration?: Configur
             };
         },
         /**
-         *
-         * @param {string} annotationId
-         * @param {string} occurenceId
+         * 
+         * @param {string} annotationId 
+         * @param {string} occurenceId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationAnnotationIdOccurenceIdDelete: async (
-            annotationId: string,
-            occurenceId: string,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        annotationAnnotationIdOccurenceIdDelete: async (annotationId: string, occurenceId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'annotationId' is not null or undefined
-            assertParamExists(
-                'annotationAnnotationIdOccurenceIdDelete',
-                'annotationId',
-                annotationId
-            );
+            assertParamExists('annotationAnnotationIdOccurenceIdDelete', 'annotationId', annotationId)
             // verify required parameter 'occurenceId' is not null or undefined
-            assertParamExists(
-                'annotationAnnotationIdOccurenceIdDelete',
-                'occurenceId',
-                occurenceId
-            );
+            assertParamExists('annotationAnnotationIdOccurenceIdDelete', 'occurenceId', occurenceId)
             const localVarPath = `/annotation/{annotationId}/{occurenceId}`
-                .replace(`{${'annotationId'}}`, encodeURIComponent(String(annotationId)))
-                .replace(`{${'occurenceId'}}`, encodeURIComponent(String(occurenceId)));
+                .replace(`{${"annotationId"}}`, encodeURIComponent(String(annotationId)))
+                .replace(`{${"occurenceId"}}`, encodeURIComponent(String(occurenceId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
             let baseOptions;
@@ -895,22 +945,15 @@ export const AnnotationApiAxiosParamCreator = function (configuration?: Configur
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = {
-                method: 'DELETE',
-                ...baseOptions,
-                ...options,
-            };
+            const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -918,23 +961,17 @@ export const AnnotationApiAxiosParamCreator = function (configuration?: Configur
             };
         },
         /**
-         *
-         * @param {string} annotationId
-         * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest]
+         * 
+         * @param {string} annotationId 
+         * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationAnnotationIdPost: async (
-            annotationId: string,
-            annotationInstanceAddRequest?: AnnotationInstanceAddRequest,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        annotationAnnotationIdPost: async (annotationId: string, annotationInstanceAddRequest?: AnnotationInstanceAddRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'annotationId' is not null or undefined
-            assertParamExists('annotationAnnotationIdPost', 'annotationId', annotationId);
-            const localVarPath = `/annotation/{annotationId}`.replace(
-                `{${'annotationId'}}`,
-                encodeURIComponent(String(annotationId))
-            );
+            assertParamExists('annotationAnnotationIdPost', 'annotationId', annotationId)
+            const localVarPath = `/annotation/{annotationId}`
+                .replace(`{${"annotationId"}}`, encodeURIComponent(String(annotationId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
             let baseOptions;
@@ -942,25 +979,18 @@ export const AnnotationApiAxiosParamCreator = function (configuration?: Configur
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             localVarHeaderParameter['Content-Type'] = 'application/json';
 
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
-            localVarRequestOptions.data = serializeDataIfNeeded(
-                annotationInstanceAddRequest,
-                localVarRequestOptions,
-                configuration
-            );
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(annotationInstanceAddRequest, localVarRequestOptions, configuration)
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -968,15 +998,12 @@ export const AnnotationApiAxiosParamCreator = function (configuration?: Configur
             };
         },
         /**
-         *
-         * @param {AnnotationsAddRequest} [annotationsAddRequest]
+         * 
+         * @param {AnnotationsAddRequest} [annotationsAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationsPost: async (
-            annotationsAddRequest?: AnnotationsAddRequest,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        annotationsPost: async (annotationsAddRequest?: AnnotationsAddRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/annotations`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -985,217 +1012,123 @@ export const AnnotationApiAxiosParamCreator = function (configuration?: Configur
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             localVarHeaderParameter['Content-Type'] = 'application/json';
 
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
-            localVarRequestOptions.data = serializeDataIfNeeded(
-                annotationsAddRequest,
-                localVarRequestOptions,
-                configuration
-            );
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(annotationsAddRequest, localVarRequestOptions, configuration)
 
             return {
                 url: toPathString(localVarUrlObj),
                 options: localVarRequestOptions,
             };
         },
-    };
+    }
 };
 
 /**
  * AnnotationApi - functional programming interface
  * @export
  */
-export const AnnotationApiFp = function (configuration?: Configuration) {
-    const localVarAxiosParamCreator = AnnotationApiAxiosParamCreator(configuration);
+export const AnnotationApiFp = function(configuration?: Configuration) {
+    const localVarAxiosParamCreator = AnnotationApiAxiosParamCreator(configuration)
     return {
         /**
-         *
-         * @param {string} annotationId
+         * 
+         * @param {string} annotationId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async annotationAnnotationIdGet(
-            annotationId: string,
-            options?: AxiosRequestConfig
-        ): Promise<
-            (axios?: AxiosInstance, basePath?: string) => AxiosPromise<AnnotationInfo>
-        > {
-            const localVarAxiosArgs =
-                await localVarAxiosParamCreator.annotationAnnotationIdGet(
-                    annotationId,
-                    options
-                );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async annotationAnnotationIdGet(annotationId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<AnnotationInfo>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.annotationAnnotationIdGet(annotationId, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {string} annotationId
-         * @param {string} occurenceId
+         * 
+         * @param {string} annotationId 
+         * @param {string} occurenceId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async annotationAnnotationIdOccurenceIdDelete(
-            annotationId: string,
-            occurenceId: string,
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
-            const localVarAxiosArgs =
-                await localVarAxiosParamCreator.annotationAnnotationIdOccurenceIdDelete(
-                    annotationId,
-                    occurenceId,
-                    options
-                );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async annotationAnnotationIdOccurenceIdDelete(annotationId: string, occurenceId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.annotationAnnotationIdOccurenceIdDelete(annotationId, occurenceId, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {string} annotationId
-         * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest]
+         * 
+         * @param {string} annotationId 
+         * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async annotationAnnotationIdPost(
-            annotationId: string,
-            annotationInstanceAddRequest?: AnnotationInstanceAddRequest,
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
-            const localVarAxiosArgs =
-                await localVarAxiosParamCreator.annotationAnnotationIdPost(
-                    annotationId,
-                    annotationInstanceAddRequest,
-                    options
-                );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async annotationAnnotationIdPost(annotationId: string, annotationInstanceAddRequest?: AnnotationInstanceAddRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.annotationAnnotationIdPost(annotationId, annotationInstanceAddRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {AnnotationsAddRequest} [annotationsAddRequest]
+         * 
+         * @param {AnnotationsAddRequest} [annotationsAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async annotationsPost(
-            annotationsAddRequest?: AnnotationsAddRequest,
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.annotationsPost(
-                annotationsAddRequest,
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async annotationsPost(annotationsAddRequest?: AnnotationsAddRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.annotationsPost(annotationsAddRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
-    };
+    }
 };
 
 /**
  * AnnotationApi - factory interface
  * @export
  */
-export const AnnotationApiFactory = function (
-    configuration?: Configuration,
-    basePath?: string,
-    axios?: AxiosInstance
-) {
-    const localVarFp = AnnotationApiFp(configuration);
+export const AnnotationApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    const localVarFp = AnnotationApiFp(configuration)
     return {
         /**
-         *
-         * @param {string} annotationId
+         * 
+         * @param {string} annotationId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationAnnotationIdGet(
-            annotationId: string,
-            options?: any
-        ): AxiosPromise<AnnotationInfo> {
-            return localVarFp
-                .annotationAnnotationIdGet(annotationId, options)
-                .then((request) => request(axios, basePath));
+        annotationAnnotationIdGet(annotationId: string, options?: any): AxiosPromise<AnnotationInfo> {
+            return localVarFp.annotationAnnotationIdGet(annotationId, options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {string} annotationId
-         * @param {string} occurenceId
+         * 
+         * @param {string} annotationId 
+         * @param {string} occurenceId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationAnnotationIdOccurenceIdDelete(
-            annotationId: string,
-            occurenceId: string,
-            options?: any
-        ): AxiosPromise<void> {
-            return localVarFp
-                .annotationAnnotationIdOccurenceIdDelete(
-                    annotationId,
-                    occurenceId,
-                    options
-                )
-                .then((request) => request(axios, basePath));
+        annotationAnnotationIdOccurenceIdDelete(annotationId: string, occurenceId: string, options?: any): AxiosPromise<void> {
+            return localVarFp.annotationAnnotationIdOccurenceIdDelete(annotationId, occurenceId, options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {string} annotationId
-         * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest]
+         * 
+         * @param {string} annotationId 
+         * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationAnnotationIdPost(
-            annotationId: string,
-            annotationInstanceAddRequest?: AnnotationInstanceAddRequest,
-            options?: any
-        ): AxiosPromise<void> {
-            return localVarFp
-                .annotationAnnotationIdPost(
-                    annotationId,
-                    annotationInstanceAddRequest,
-                    options
-                )
-                .then((request) => request(axios, basePath));
+        annotationAnnotationIdPost(annotationId: string, annotationInstanceAddRequest?: AnnotationInstanceAddRequest, options?: any): AxiosPromise<void> {
+            return localVarFp.annotationAnnotationIdPost(annotationId, annotationInstanceAddRequest, options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {AnnotationsAddRequest} [annotationsAddRequest]
+         * 
+         * @param {AnnotationsAddRequest} [annotationsAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        annotationsPost(
-            annotationsAddRequest?: AnnotationsAddRequest,
-            options?: any
-        ): AxiosPromise<void> {
-            return localVarFp
-                .annotationsPost(annotationsAddRequest, options)
-                .then((request) => request(axios, basePath));
+        annotationsPost(annotationsAddRequest?: AnnotationsAddRequest, options?: any): AxiosPromise<void> {
+            return localVarFp.annotationsPost(annotationsAddRequest, options).then((request) => request(axios, basePath));
         },
     };
 };
@@ -1208,75 +1141,53 @@ export const AnnotationApiFactory = function (
  */
 export class AnnotationApi extends BaseAPI {
     /**
-     *
-     * @param {string} annotationId
+     * 
+     * @param {string} annotationId 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof AnnotationApi
      */
     public annotationAnnotationIdGet(annotationId: string, options?: AxiosRequestConfig) {
-        return AnnotationApiFp(this.configuration)
-            .annotationAnnotationIdGet(annotationId, options)
-            .then((request) => request(this.axios, this.basePath));
+        return AnnotationApiFp(this.configuration).annotationAnnotationIdGet(annotationId, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {string} annotationId
-     * @param {string} occurenceId
+     * 
+     * @param {string} annotationId 
+     * @param {string} occurenceId 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof AnnotationApi
      */
-    public annotationAnnotationIdOccurenceIdDelete(
-        annotationId: string,
-        occurenceId: string,
-        options?: AxiosRequestConfig
-    ) {
-        return AnnotationApiFp(this.configuration)
-            .annotationAnnotationIdOccurenceIdDelete(annotationId, occurenceId, options)
-            .then((request) => request(this.axios, this.basePath));
+    public annotationAnnotationIdOccurenceIdDelete(annotationId: string, occurenceId: string, options?: AxiosRequestConfig) {
+        return AnnotationApiFp(this.configuration).annotationAnnotationIdOccurenceIdDelete(annotationId, occurenceId, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {string} annotationId
-     * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest]
+     * 
+     * @param {string} annotationId 
+     * @param {AnnotationInstanceAddRequest} [annotationInstanceAddRequest] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof AnnotationApi
      */
-    public annotationAnnotationIdPost(
-        annotationId: string,
-        annotationInstanceAddRequest?: AnnotationInstanceAddRequest,
-        options?: AxiosRequestConfig
-    ) {
-        return AnnotationApiFp(this.configuration)
-            .annotationAnnotationIdPost(
-                annotationId,
-                annotationInstanceAddRequest,
-                options
-            )
-            .then((request) => request(this.axios, this.basePath));
+    public annotationAnnotationIdPost(annotationId: string, annotationInstanceAddRequest?: AnnotationInstanceAddRequest, options?: AxiosRequestConfig) {
+        return AnnotationApiFp(this.configuration).annotationAnnotationIdPost(annotationId, annotationInstanceAddRequest, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {AnnotationsAddRequest} [annotationsAddRequest]
+     * 
+     * @param {AnnotationsAddRequest} [annotationsAddRequest] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof AnnotationApi
      */
-    public annotationsPost(
-        annotationsAddRequest?: AnnotationsAddRequest,
-        options?: AxiosRequestConfig
-    ) {
-        return AnnotationApiFp(this.configuration)
-            .annotationsPost(annotationsAddRequest, options)
-            .then((request) => request(this.axios, this.basePath));
+    public annotationsPost(annotationsAddRequest?: AnnotationsAddRequest, options?: AxiosRequestConfig) {
+        return AnnotationApiFp(this.configuration).annotationsPost(annotationsAddRequest, options).then((request) => request(this.axios, this.basePath));
     }
 }
 
+
 /**
  * AuthApi - axios parameter creator
  * @export
@@ -1284,15 +1195,12 @@ export class AnnotationApi extends BaseAPI {
 export const AuthApiAxiosParamCreator = function (configuration?: Configuration) {
     return {
         /**
-         *
-         * @param {LoginRequest} [loginRequest]
+         * 
+         * @param {LoginRequest} [loginRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        authLoginPost: async (
-            loginRequest?: LoginRequest,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        authLoginPost: async (loginRequest?: LoginRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/auth/login`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -1301,25 +1209,18 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             localVarHeaderParameter['Content-Type'] = 'application/json';
 
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
-            localVarRequestOptions.data = serializeDataIfNeeded(
-                loginRequest,
-                localVarRequestOptions,
-                configuration
-            );
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(loginRequest, localVarRequestOptions, configuration)
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -1327,7 +1228,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
             };
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
@@ -1340,18 +1241,15 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -1359,7 +1257,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
             };
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
@@ -1372,144 +1270,93 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
                 options: localVarRequestOptions,
             };
         },
-    };
+    }
 };
 
 /**
  * AuthApi - functional programming interface
  * @export
  */
-export const AuthApiFp = function (configuration?: Configuration) {
-    const localVarAxiosParamCreator = AuthApiAxiosParamCreator(configuration);
+export const AuthApiFp = function(configuration?: Configuration) {
+    const localVarAxiosParamCreator = AuthApiAxiosParamCreator(configuration)
     return {
         /**
-         *
-         * @param {LoginRequest} [loginRequest]
+         * 
+         * @param {LoginRequest} [loginRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async authLoginPost(
-            loginRequest?: LoginRequest,
-            options?: AxiosRequestConfig
-        ): Promise<
-            (axios?: AxiosInstance, basePath?: string) => AxiosPromise<LoginResponse>
-        > {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.authLoginPost(
-                loginRequest,
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async authLoginPost(loginRequest?: LoginRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<LoginResponse>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.authLoginPost(loginRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async authTestAaGet(
-            options?: AxiosRequestConfig
-        ): Promise<
-            (axios?: AxiosInstance, basePath?: string) => AxiosPromise<ClientInfo>
-        > {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.authTestAaGet(
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async authTestAaGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ClientInfo>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.authTestAaGet(options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async authTestGet(
-            options?: AxiosRequestConfig
-        ): Promise<
-            (axios?: AxiosInstance, basePath?: string) => AxiosPromise<ClientInfo>
-        > {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.authTestGet(
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async authTestGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ClientInfo>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.authTestGet(options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
-    };
+    }
 };
 
 /**
  * AuthApi - factory interface
  * @export
  */
-export const AuthApiFactory = function (
-    configuration?: Configuration,
-    basePath?: string,
-    axios?: AxiosInstance
-) {
-    const localVarFp = AuthApiFp(configuration);
+export const AuthApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    const localVarFp = AuthApiFp(configuration)
     return {
         /**
-         *
-         * @param {LoginRequest} [loginRequest]
+         * 
+         * @param {LoginRequest} [loginRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        authLoginPost(
-            loginRequest?: LoginRequest,
-            options?: any
-        ): AxiosPromise<LoginResponse> {
-            return localVarFp
-                .authLoginPost(loginRequest, options)
-                .then((request) => request(axios, basePath));
+        authLoginPost(loginRequest?: LoginRequest, options?: any): AxiosPromise<LoginResponse> {
+            return localVarFp.authLoginPost(loginRequest, options).then((request) => request(axios, basePath));
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
         authTestAaGet(options?: any): AxiosPromise<ClientInfo> {
-            return localVarFp
-                .authTestAaGet(options)
-                .then((request) => request(axios, basePath));
+            return localVarFp.authTestAaGet(options).then((request) => request(axios, basePath));
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
         authTestGet(options?: any): AxiosPromise<ClientInfo> {
-            return localVarFp
-                .authTestGet(options)
-                .then((request) => request(axios, basePath));
+            return localVarFp.authTestGet(options).then((request) => request(axios, basePath));
         },
     };
 };
@@ -1522,43 +1369,38 @@ export const AuthApiFactory = function (
  */
 export class AuthApi extends BaseAPI {
     /**
-     *
-     * @param {LoginRequest} [loginRequest]
+     * 
+     * @param {LoginRequest} [loginRequest] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof AuthApi
      */
     public authLoginPost(loginRequest?: LoginRequest, options?: AxiosRequestConfig) {
-        return AuthApiFp(this.configuration)
-            .authLoginPost(loginRequest, options)
-            .then((request) => request(this.axios, this.basePath));
+        return AuthApiFp(this.configuration).authLoginPost(loginRequest, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
+     * 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof AuthApi
      */
     public authTestAaGet(options?: AxiosRequestConfig) {
-        return AuthApiFp(this.configuration)
-            .authTestAaGet(options)
-            .then((request) => request(this.axios, this.basePath));
+        return AuthApiFp(this.configuration).authTestAaGet(options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
+     * 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof AuthApi
      */
     public authTestGet(options?: AxiosRequestConfig) {
-        return AuthApiFp(this.configuration)
-            .authTestGet(options)
-            .then((request) => request(this.axios, this.basePath));
+        return AuthApiFp(this.configuration).authTestGet(options).then((request) => request(this.axios, this.basePath));
     }
 }
 
+
 /**
  * DocumentApi - axios parameter creator
  * @export
@@ -1566,17 +1408,13 @@ export class AuthApi extends BaseAPI {
 export const DocumentApiAxiosParamCreator = function (configuration?: Configuration) {
     return {
         /**
-         *
-         * @param {number} [pageIndex]
-         * @param {number} [pageSize]
+         * 
+         * @param {number} [pageIndex] 
+         * @param {number} [pageSize] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        documentsGet: async (
-            pageIndex?: number,
-            pageSize?: number,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        documentsGet: async (pageIndex?: number, pageSize?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/documents`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -1585,7 +1423,7 @@ export const DocumentApiAxiosParamCreator = function (configuration?: Configurat
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -1597,14 +1435,11 @@ export const DocumentApiAxiosParamCreator = function (configuration?: Configurat
                 localVarQueryParameter['pageSize'] = pageSize;
             }
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -1612,15 +1447,12 @@ export const DocumentApiAxiosParamCreator = function (configuration?: Configurat
             };
         },
         /**
-         *
-         * @param {DocumentAddRequest} [documentAddRequest]
+         * 
+         * @param {DocumentAddRequest} [documentAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        documentsPost: async (
-            documentAddRequest?: DocumentAddRequest,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        documentsPost: async (documentAddRequest?: DocumentAddRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/documents`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -1629,134 +1461,233 @@ export const DocumentApiAxiosParamCreator = function (configuration?: Configurat
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             localVarHeaderParameter['Content-Type'] = 'application/json';
 
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(documentAddRequest, localVarRequestOptions, configuration)
+
+            return {
+                url: toPathString(localVarUrlObj),
+                options: localVarRequestOptions,
             };
-            localVarRequestOptions.data = serializeDataIfNeeded(
-                documentAddRequest,
-                localVarRequestOptions,
-                configuration
-            );
+        },
+        /**
+         * 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        documentsRequiredAnnotationsGlobalGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/documents/requiredAnnotations/global`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+
+    
+            setSearchParams(localVarUrlObj, localVarQueryParameter);
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
                 options: localVarRequestOptions,
             };
         },
-    };
+        /**
+         * 
+         * @param {SetRequiredAnnotationsGlobalRequest} [setRequiredAnnotationsGlobalRequest] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        documentsRequiredAnnotationsGlobalPost: async (setRequiredAnnotationsGlobalRequest?: SetRequiredAnnotationsGlobalRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/documents/requiredAnnotations/global`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+
+            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+
+    
+            localVarHeaderParameter['Content-Type'] = 'application/json';
+
+            setSearchParams(localVarUrlObj, localVarQueryParameter);
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(setRequiredAnnotationsGlobalRequest, localVarRequestOptions, configuration)
+
+            return {
+                url: toPathString(localVarUrlObj),
+                options: localVarRequestOptions,
+            };
+        },
+        /**
+         * 
+         * @param {SetRequiredAnnotationsRequest} [setRequiredAnnotationsRequest] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        documentsRequiredAnnotationsPost: async (setRequiredAnnotationsRequest?: SetRequiredAnnotationsRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/documents/requiredAnnotations`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+
+            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+
+    
+            localVarHeaderParameter['Content-Type'] = 'application/json';
+
+            setSearchParams(localVarUrlObj, localVarQueryParameter);
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(setRequiredAnnotationsRequest, localVarRequestOptions, configuration)
+
+            return {
+                url: toPathString(localVarUrlObj),
+                options: localVarRequestOptions,
+            };
+        },
+    }
 };
 
 /**
  * DocumentApi - functional programming interface
  * @export
  */
-export const DocumentApiFp = function (configuration?: Configuration) {
-    const localVarAxiosParamCreator = DocumentApiAxiosParamCreator(configuration);
+export const DocumentApiFp = function(configuration?: Configuration) {
+    const localVarAxiosParamCreator = DocumentApiAxiosParamCreator(configuration)
     return {
         /**
-         *
-         * @param {number} [pageIndex]
-         * @param {number} [pageSize]
+         * 
+         * @param {number} [pageIndex] 
+         * @param {number} [pageSize] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async documentsGet(
-            pageIndex?: number,
-            pageSize?: number,
-            options?: AxiosRequestConfig
-        ): Promise<
-            (
-                axios?: AxiosInstance,
-                basePath?: string
-            ) => AxiosPromise<DocumentListResponse>
-        > {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.documentsGet(
-                pageIndex,
-                pageSize,
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async documentsGet(pageIndex?: number, pageSize?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<DocumentListResponse>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.documentsGet(pageIndex, pageSize, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {DocumentAddRequest} [documentAddRequest]
+         * 
+         * @param {DocumentAddRequest} [documentAddRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async documentsPost(
-            documentAddRequest?: DocumentAddRequest,
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.documentsPost(
-                documentAddRequest,
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async documentsPost(documentAddRequest?: DocumentAddRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.documentsPost(documentAddRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
-    };
+        /**
+         * 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async documentsRequiredAnnotationsGlobalGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<GetRequiredAnnotationsGlobalResponse>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.documentsRequiredAnnotationsGlobalGet(options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
+        },
+        /**
+         * 
+         * @param {SetRequiredAnnotationsGlobalRequest} [setRequiredAnnotationsGlobalRequest] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async documentsRequiredAnnotationsGlobalPost(setRequiredAnnotationsGlobalRequest?: SetRequiredAnnotationsGlobalRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.documentsRequiredAnnotationsGlobalPost(setRequiredAnnotationsGlobalRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
+        },
+        /**
+         * 
+         * @param {SetRequiredAnnotationsRequest} [setRequiredAnnotationsRequest] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async documentsRequiredAnnotationsPost(setRequiredAnnotationsRequest?: SetRequiredAnnotationsRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.documentsRequiredAnnotationsPost(setRequiredAnnotationsRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
+        },
+    }
 };
 
 /**
  * DocumentApi - factory interface
  * @export
  */
-export const DocumentApiFactory = function (
-    configuration?: Configuration,
-    basePath?: string,
-    axios?: AxiosInstance
-) {
-    const localVarFp = DocumentApiFp(configuration);
+export const DocumentApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    const localVarFp = DocumentApiFp(configuration)
     return {
         /**
-         *
-         * @param {number} [pageIndex]
-         * @param {number} [pageSize]
+         * 
+         * @param {number} [pageIndex] 
+         * @param {number} [pageSize] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        documentsGet(pageIndex?: number, pageSize?: number, options?: any): AxiosPromise<DocumentListResponse> {
+            return localVarFp.documentsGet(pageIndex, pageSize, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @param {DocumentAddRequest} [documentAddRequest] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        documentsPost(documentAddRequest?: DocumentAddRequest, options?: any): AxiosPromise<void> {
+            return localVarFp.documentsPost(documentAddRequest, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        documentsRequiredAnnotationsGlobalGet(options?: any): AxiosPromise<GetRequiredAnnotationsGlobalResponse> {
+            return localVarFp.documentsRequiredAnnotationsGlobalGet(options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @param {SetRequiredAnnotationsGlobalRequest} [setRequiredAnnotationsGlobalRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        documentsGet(
-            pageIndex?: number,
-            pageSize?: number,
-            options?: any
-        ): AxiosPromise<DocumentListResponse> {
-            return localVarFp
-                .documentsGet(pageIndex, pageSize, options)
-                .then((request) => request(axios, basePath));
+        documentsRequiredAnnotationsGlobalPost(setRequiredAnnotationsGlobalRequest?: SetRequiredAnnotationsGlobalRequest, options?: any): AxiosPromise<void> {
+            return localVarFp.documentsRequiredAnnotationsGlobalPost(setRequiredAnnotationsGlobalRequest, options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {DocumentAddRequest} [documentAddRequest]
+         * 
+         * @param {SetRequiredAnnotationsRequest} [setRequiredAnnotationsRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        documentsPost(
-            documentAddRequest?: DocumentAddRequest,
-            options?: any
-        ): AxiosPromise<void> {
-            return localVarFp
-                .documentsPost(documentAddRequest, options)
-                .then((request) => request(axios, basePath));
+        documentsRequiredAnnotationsPost(setRequiredAnnotationsRequest?: SetRequiredAnnotationsRequest, options?: any): AxiosPromise<void> {
+            return localVarFp.documentsRequiredAnnotationsPost(setRequiredAnnotationsRequest, options).then((request) => request(axios, basePath));
         },
     };
 };
@@ -1769,40 +1700,62 @@ export const DocumentApiFactory = function (
  */
 export class DocumentApi extends BaseAPI {
     /**
-     *
-     * @param {number} [pageIndex]
-     * @param {number} [pageSize]
+     * 
+     * @param {number} [pageIndex] 
+     * @param {number} [pageSize] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof DocumentApi
+     */
+    public documentsGet(pageIndex?: number, pageSize?: number, options?: AxiosRequestConfig) {
+        return DocumentApiFp(this.configuration).documentsGet(pageIndex, pageSize, options).then((request) => request(this.axios, this.basePath));
+    }
+
+    /**
+     * 
+     * @param {DocumentAddRequest} [documentAddRequest] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof DocumentApi
+     */
+    public documentsPost(documentAddRequest?: DocumentAddRequest, options?: AxiosRequestConfig) {
+        return DocumentApiFp(this.configuration).documentsPost(documentAddRequest, options).then((request) => request(this.axios, this.basePath));
+    }
+
+    /**
+     * 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof DocumentApi
+     */
+    public documentsRequiredAnnotationsGlobalGet(options?: AxiosRequestConfig) {
+        return DocumentApiFp(this.configuration).documentsRequiredAnnotationsGlobalGet(options).then((request) => request(this.axios, this.basePath));
+    }
+
+    /**
+     * 
+     * @param {SetRequiredAnnotationsGlobalRequest} [setRequiredAnnotationsGlobalRequest] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof DocumentApi
      */
-    public documentsGet(
-        pageIndex?: number,
-        pageSize?: number,
-        options?: AxiosRequestConfig
-    ) {
-        return DocumentApiFp(this.configuration)
-            .documentsGet(pageIndex, pageSize, options)
-            .then((request) => request(this.axios, this.basePath));
+    public documentsRequiredAnnotationsGlobalPost(setRequiredAnnotationsGlobalRequest?: SetRequiredAnnotationsGlobalRequest, options?: AxiosRequestConfig) {
+        return DocumentApiFp(this.configuration).documentsRequiredAnnotationsGlobalPost(setRequiredAnnotationsGlobalRequest, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {DocumentAddRequest} [documentAddRequest]
+     * 
+     * @param {SetRequiredAnnotationsRequest} [setRequiredAnnotationsRequest] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof DocumentApi
      */
-    public documentsPost(
-        documentAddRequest?: DocumentAddRequest,
-        options?: AxiosRequestConfig
-    ) {
-        return DocumentApiFp(this.configuration)
-            .documentsPost(documentAddRequest, options)
-            .then((request) => request(this.axios, this.basePath));
+    public documentsRequiredAnnotationsPost(setRequiredAnnotationsRequest?: SetRequiredAnnotationsRequest, options?: AxiosRequestConfig) {
+        return DocumentApiFp(this.configuration).documentsRequiredAnnotationsPost(setRequiredAnnotationsRequest, options).then((request) => request(this.axios, this.basePath));
     }
 }
 
+
 /**
  * TagApi - axios parameter creator
  * @export
@@ -1810,7 +1763,7 @@ export class DocumentApi extends BaseAPI {
 export const TagApiAxiosParamCreator = function (configuration?: Configuration) {
     return {
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
@@ -1823,75 +1776,57 @@ export const TagApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
                 options: localVarRequestOptions,
             };
         },
-    };
+    }
 };
 
 /**
  * TagApi - functional programming interface
  * @export
  */
-export const TagApiFp = function (configuration?: Configuration) {
-    const localVarAxiosParamCreator = TagApiAxiosParamCreator(configuration);
+export const TagApiFp = function(configuration?: Configuration) {
+    const localVarAxiosParamCreator = TagApiAxiosParamCreator(configuration)
     return {
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async tagsGet(
-            options?: AxiosRequestConfig
-        ): Promise<
-            (axios?: AxiosInstance, basePath?: string) => AxiosPromise<TagTreeResponse>
-        > {
+        async tagsGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<TagTreeResponse>> {
             const localVarAxiosArgs = await localVarAxiosParamCreator.tagsGet(options);
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
-    };
+    }
 };
 
 /**
  * TagApi - factory interface
  * @export
  */
-export const TagApiFactory = function (
-    configuration?: Configuration,
-    basePath?: string,
-    axios?: AxiosInstance
-) {
-    const localVarFp = TagApiFp(configuration);
+export const TagApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    const localVarFp = TagApiFp(configuration)
     return {
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
         tagsGet(options?: any): AxiosPromise<TagTreeResponse> {
-            return localVarFp
-                .tagsGet(options)
-                .then((request) => request(axios, basePath));
+            return localVarFp.tagsGet(options).then((request) => request(axios, basePath));
         },
     };
 };
@@ -1904,18 +1839,17 @@ export const TagApiFactory = function (
  */
 export class TagApi extends BaseAPI {
     /**
-     *
+     * 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof TagApi
      */
     public tagsGet(options?: AxiosRequestConfig) {
-        return TagApiFp(this.configuration)
-            .tagsGet(options)
-            .then((request) => request(this.axios, this.basePath));
+        return TagApiFp(this.configuration).tagsGet(options).then((request) => request(this.axios, this.basePath));
     }
 }
 
+
 /**
  * UserApi - axios parameter creator
  * @export
@@ -1923,13 +1857,11 @@ export class TagApi extends BaseAPI {
 export const UserApiAxiosParamCreator = function (configuration?: Configuration) {
     return {
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        userAnnotationsGet: async (
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        userAnnotationsGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/user/annotations`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -1938,18 +1870,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -1957,21 +1886,16 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
             };
         },
         /**
-         *
-         * @param {string} userId
+         * 
+         * @param {string} userId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        userUserIdAnnotationsGet: async (
-            userId: string,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        userUserIdAnnotationsGet: async (userId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'userId' is not null or undefined
-            assertParamExists('userUserIdAnnotationsGet', 'userId', userId);
-            const localVarPath = `/user/{userId}/annotations`.replace(
-                `{${'userId'}}`,
-                encodeURIComponent(String(userId))
-            );
+            assertParamExists('userUserIdAnnotationsGet', 'userId', userId)
+            const localVarPath = `/user/{userId}/annotations`
+                .replace(`{${"userId"}}`, encodeURIComponent(String(userId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
             let baseOptions;
@@ -1979,18 +1903,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -1998,21 +1919,16 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
             };
         },
         /**
-         *
-         * @param {string} userId
+         * 
+         * @param {string} userId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        userUserIdDelete: async (
-            userId: string,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        userUserIdDelete: async (userId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'userId' is not null or undefined
-            assertParamExists('userUserIdDelete', 'userId', userId);
-            const localVarPath = `/user/{userId}`.replace(
-                `{${'userId'}}`,
-                encodeURIComponent(String(userId))
-            );
+            assertParamExists('userUserIdDelete', 'userId', userId)
+            const localVarPath = `/user/{userId}`
+                .replace(`{${"userId"}}`, encodeURIComponent(String(userId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
             let baseOptions;
@@ -2020,22 +1936,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = {
-                method: 'DELETE',
-                ...baseOptions,
-                ...options,
-            };
+            const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -2043,23 +1952,17 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
             };
         },
         /**
-         *
-         * @param {string} userId
-         * @param {ChangeUserInfoRequest} [changeUserInfoRequest]
+         * 
+         * @param {string} userId 
+         * @param {ChangeUserInfoRequest} [changeUserInfoRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        userUserIdPut: async (
-            userId: string,
-            changeUserInfoRequest?: ChangeUserInfoRequest,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        userUserIdPut: async (userId: string, changeUserInfoRequest?: ChangeUserInfoRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'userId' is not null or undefined
-            assertParamExists('userUserIdPut', 'userId', userId);
-            const localVarPath = `/user/{userId}`.replace(
-                `{${'userId'}}`,
-                encodeURIComponent(String(userId))
-            );
+            assertParamExists('userUserIdPut', 'userId', userId)
+            const localVarPath = `/user/{userId}`
+                .replace(`{${"userId"}}`, encodeURIComponent(String(userId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
             let baseOptions;
@@ -2067,25 +1970,18 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             localVarHeaderParameter['Content-Type'] = 'application/json';
 
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
-            localVarRequestOptions.data = serializeDataIfNeeded(
-                changeUserInfoRequest,
-                localVarRequestOptions,
-                configuration
-            );
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(changeUserInfoRequest, localVarRequestOptions, configuration)
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -2093,7 +1989,7 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
             };
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
@@ -2106,18 +2002,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
             return {
                 url: toPathString(localVarUrlObj),
@@ -2125,15 +2018,12 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
             };
         },
         /**
-         *
-         * @param {CreateUserRequest} [createUserRequest]
+         * 
+         * @param {CreateUserRequest} [createUserRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        usersPost: async (
-            createUserRequest?: CreateUserRequest,
-            options: AxiosRequestConfig = {}
-        ): Promise<RequestArgs> => {
+        usersPost: async (createUserRequest?: CreateUserRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/users`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -2142,258 +2032,155 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration)
                 baseOptions = configuration.baseOptions;
             }
 
-            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options };
+            const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
+
+    
             localVarHeaderParameter['Content-Type'] = 'application/json';
 
             setSearchParams(localVarUrlObj, localVarQueryParameter);
-            let headersFromBaseOptions =
-                baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {
-                ...localVarHeaderParameter,
-                ...headersFromBaseOptions,
-                ...options.headers,
-            };
-            localVarRequestOptions.data = serializeDataIfNeeded(
-                createUserRequest,
-                localVarRequestOptions,
-                configuration
-            );
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = serializeDataIfNeeded(createUserRequest, localVarRequestOptions, configuration)
 
             return {
                 url: toPathString(localVarUrlObj),
                 options: localVarRequestOptions,
             };
         },
-    };
+    }
 };
 
 /**
  * UserApi - functional programming interface
  * @export
  */
-export const UserApiFp = function (configuration?: Configuration) {
-    const localVarAxiosParamCreator = UserApiAxiosParamCreator(configuration);
+export const UserApiFp = function(configuration?: Configuration) {
+    const localVarAxiosParamCreator = UserApiAxiosParamCreator(configuration)
     return {
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async userAnnotationsGet(
-            options?: AxiosRequestConfig
-        ): Promise<
-            (
-                axios?: AxiosInstance,
-                basePath?: string
-            ) => AxiosPromise<AnnotationListResponse>
-        > {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.userAnnotationsGet(
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async userAnnotationsGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<AnnotationListResponse>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.userAnnotationsGet(options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {string} userId
+         * 
+         * @param {string} userId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async userUserIdAnnotationsGet(
-            userId: string,
-            options?: AxiosRequestConfig
-        ): Promise<
-            (
-                axios?: AxiosInstance,
-                basePath?: string
-            ) => AxiosPromise<AnnotationListResponse>
-        > {
-            const localVarAxiosArgs =
-                await localVarAxiosParamCreator.userUserIdAnnotationsGet(userId, options);
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async userUserIdAnnotationsGet(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<AnnotationListResponse>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.userUserIdAnnotationsGet(userId, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {string} userId
+         * 
+         * @param {string} userId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async userUserIdDelete(
-            userId: string,
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.userUserIdDelete(
-                userId,
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async userUserIdDelete(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.userUserIdDelete(userId, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {string} userId
-         * @param {ChangeUserInfoRequest} [changeUserInfoRequest]
+         * 
+         * @param {string} userId 
+         * @param {ChangeUserInfoRequest} [changeUserInfoRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async userUserIdPut(
-            userId: string,
-            changeUserInfoRequest?: ChangeUserInfoRequest,
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.userUserIdPut(
-                userId,
-                changeUserInfoRequest,
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async userUserIdPut(userId: string, changeUserInfoRequest?: ChangeUserInfoRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.userUserIdPut(userId, changeUserInfoRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async usersGet(
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<UserList>> {
+        async usersGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<UserList>> {
             const localVarAxiosArgs = await localVarAxiosParamCreator.usersGet(options);
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
         /**
-         *
-         * @param {CreateUserRequest} [createUserRequest]
+         * 
+         * @param {CreateUserRequest} [createUserRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async usersPost(
-            createUserRequest?: CreateUserRequest,
-            options?: AxiosRequestConfig
-        ): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
-            const localVarAxiosArgs = await localVarAxiosParamCreator.usersPost(
-                createUserRequest,
-                options
-            );
-            return createRequestFunction(
-                localVarAxiosArgs,
-                globalAxios,
-                BASE_PATH,
-                configuration
-            );
+        async usersPost(createUserRequest?: CreateUserRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
+            const localVarAxiosArgs = await localVarAxiosParamCreator.usersPost(createUserRequest, options);
+            return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
         },
-    };
+    }
 };
 
 /**
  * UserApi - factory interface
  * @export
  */
-export const UserApiFactory = function (
-    configuration?: Configuration,
-    basePath?: string,
-    axios?: AxiosInstance
-) {
-    const localVarFp = UserApiFp(configuration);
+export const UserApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    const localVarFp = UserApiFp(configuration)
     return {
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
         userAnnotationsGet(options?: any): AxiosPromise<AnnotationListResponse> {
-            return localVarFp
-                .userAnnotationsGet(options)
-                .then((request) => request(axios, basePath));
+            return localVarFp.userAnnotationsGet(options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {string} userId
+         * 
+         * @param {string} userId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        userUserIdAnnotationsGet(
-            userId: string,
-            options?: any
-        ): AxiosPromise<AnnotationListResponse> {
-            return localVarFp
-                .userUserIdAnnotationsGet(userId, options)
-                .then((request) => request(axios, basePath));
+        userUserIdAnnotationsGet(userId: string, options?: any): AxiosPromise<AnnotationListResponse> {
+            return localVarFp.userUserIdAnnotationsGet(userId, options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {string} userId
+         * 
+         * @param {string} userId 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
         userUserIdDelete(userId: string, options?: any): AxiosPromise<void> {
-            return localVarFp
-                .userUserIdDelete(userId, options)
-                .then((request) => request(axios, basePath));
+            return localVarFp.userUserIdDelete(userId, options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {string} userId
-         * @param {ChangeUserInfoRequest} [changeUserInfoRequest]
+         * 
+         * @param {string} userId 
+         * @param {ChangeUserInfoRequest} [changeUserInfoRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        userUserIdPut(
-            userId: string,
-            changeUserInfoRequest?: ChangeUserInfoRequest,
-            options?: any
-        ): AxiosPromise<void> {
-            return localVarFp
-                .userUserIdPut(userId, changeUserInfoRequest, options)
-                .then((request) => request(axios, basePath));
+        userUserIdPut(userId: string, changeUserInfoRequest?: ChangeUserInfoRequest, options?: any): AxiosPromise<void> {
+            return localVarFp.userUserIdPut(userId, changeUserInfoRequest, options).then((request) => request(axios, basePath));
         },
         /**
-         *
+         * 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
         usersGet(options?: any): AxiosPromise<UserList> {
-            return localVarFp
-                .usersGet(options)
-                .then((request) => request(axios, basePath));
+            return localVarFp.usersGet(options).then((request) => request(axios, basePath));
         },
         /**
-         *
-         * @param {CreateUserRequest} [createUserRequest]
+         * 
+         * @param {CreateUserRequest} [createUserRequest] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        usersPost(
-            createUserRequest?: CreateUserRequest,
-            options?: any
-        ): AxiosPromise<void> {
-            return localVarFp
-                .usersPost(createUserRequest, options)
-                .then((request) => request(axios, basePath));
+        usersPost(createUserRequest?: CreateUserRequest, options?: any): AxiosPromise<void> {
+            return localVarFp.usersPost(createUserRequest, options).then((request) => request(axios, basePath));
         },
     };
 };
@@ -2406,86 +2193,69 @@ export const UserApiFactory = function (
  */
 export class UserApi extends BaseAPI {
     /**
-     *
+     * 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof UserApi
      */
     public userAnnotationsGet(options?: AxiosRequestConfig) {
-        return UserApiFp(this.configuration)
-            .userAnnotationsGet(options)
-            .then((request) => request(this.axios, this.basePath));
+        return UserApiFp(this.configuration).userAnnotationsGet(options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {string} userId
+     * 
+     * @param {string} userId 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof UserApi
      */
     public userUserIdAnnotationsGet(userId: string, options?: AxiosRequestConfig) {
-        return UserApiFp(this.configuration)
-            .userUserIdAnnotationsGet(userId, options)
-            .then((request) => request(this.axios, this.basePath));
+        return UserApiFp(this.configuration).userUserIdAnnotationsGet(userId, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {string} userId
+     * 
+     * @param {string} userId 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof UserApi
      */
     public userUserIdDelete(userId: string, options?: AxiosRequestConfig) {
-        return UserApiFp(this.configuration)
-            .userUserIdDelete(userId, options)
-            .then((request) => request(this.axios, this.basePath));
+        return UserApiFp(this.configuration).userUserIdDelete(userId, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {string} userId
-     * @param {ChangeUserInfoRequest} [changeUserInfoRequest]
+     * 
+     * @param {string} userId 
+     * @param {ChangeUserInfoRequest} [changeUserInfoRequest] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof UserApi
      */
-    public userUserIdPut(
-        userId: string,
-        changeUserInfoRequest?: ChangeUserInfoRequest,
-        options?: AxiosRequestConfig
-    ) {
-        return UserApiFp(this.configuration)
-            .userUserIdPut(userId, changeUserInfoRequest, options)
-            .then((request) => request(this.axios, this.basePath));
+    public userUserIdPut(userId: string, changeUserInfoRequest?: ChangeUserInfoRequest, options?: AxiosRequestConfig) {
+        return UserApiFp(this.configuration).userUserIdPut(userId, changeUserInfoRequest, options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
+     * 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof UserApi
      */
     public usersGet(options?: AxiosRequestConfig) {
-        return UserApiFp(this.configuration)
-            .usersGet(options)
-            .then((request) => request(this.axios, this.basePath));
+        return UserApiFp(this.configuration).usersGet(options).then((request) => request(this.axios, this.basePath));
     }
 
     /**
-     *
-     * @param {CreateUserRequest} [createUserRequest]
+     * 
+     * @param {CreateUserRequest} [createUserRequest] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof UserApi
      */
-    public usersPost(
-        createUserRequest?: CreateUserRequest,
-        options?: AxiosRequestConfig
-    ) {
-        return UserApiFp(this.configuration)
-            .usersPost(createUserRequest, options)
-            .then((request) => request(this.axios, this.basePath));
+    public usersPost(createUserRequest?: CreateUserRequest, options?: AxiosRequestConfig) {
+        return UserApiFp(this.configuration).usersPost(createUserRequest, options).then((request) => request(this.axios, this.basePath));
     }
 }
+
+
-- 
GitLab


From afd6a1e8a36653706545f6250a50a86bb5aae1dc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Vlc=CC=8Cek?= <vlcek@net-inout.cz>
Date: Thu, 5 May 2022 16:56:55 +0200
Subject: [PATCH 07/12] AnnotationStrings refactor

---
 webapp/pages/documents/annotator/index.tsx | 21 +++++------
 webapp/utils/strings.ts                    | 42 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 12 deletions(-)
 create mode 100644 webapp/utils/strings.ts

diff --git a/webapp/pages/documents/annotator/index.tsx b/webapp/pages/documents/annotator/index.tsx
index 3fe867b..7b8cae0 100644
--- a/webapp/pages/documents/annotator/index.tsx
+++ b/webapp/pages/documents/annotator/index.tsx
@@ -9,7 +9,11 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { LoggedUserContext } from '../../../contexts/LoggedUserContext';
 import { MainLayout } from '../../../layouts/MainLayout';
 import { userController } from '../../../controllers';
-import { AnnotationListInfo } from '../../../api';
+import { AnnotationListInfo, EState } from '../../../api';
+import {
+    getAnnotationStateString,
+    getAnnotationStateColor,
+} from '../../../utils/strings';
 
 function UserDocumentPage() {
     const redirecting = useUnauthRedirect('/login');
@@ -43,17 +47,10 @@ function UserDocumentPage() {
             title: 'Stav anotace',
             key: 'state',
             dataIndex: 'state',
-            render: (state: string) => {
-                let color = 'green';
-                let label = 'Hotovo';
-                if (state === 'NEW') {
-                    color = 'volcano';
-                    label = 'NovĂ˝';
-                }
-                if (state === 'IN_PROGRESS') {
-                    color = 'orange';
-                    label = 'Rozpracováno';
-                }
+            render: (state: EState) => {
+                const color = getAnnotationStateColor(state);
+                const label = getAnnotationStateString(state);
+
                 return (
                     <Tag color={color} key={label}>
                         {label.toUpperCase()}
diff --git a/webapp/utils/strings.ts b/webapp/utils/strings.ts
new file mode 100644
index 0000000..57133ed
--- /dev/null
+++ b/webapp/utils/strings.ts
@@ -0,0 +1,42 @@
+import { EState, UserInfo } from '../api';
+
+export function getName(user: UserInfo) {
+    //return `${user.name} ${user.surname}`;
+    return `${user.surname} ${user.name}`;
+}
+
+export function getNameTruncated(user: UserInfo, maxLength: number = 15) {
+    const name = getName(user);
+    if (name.length > maxLength) {
+        return name.substring(0, maxLength - 3) + '...';
+    } else {
+        return name;
+    }
+}
+
+export function getUserInfoAlt(user: UserInfo) {
+    return `${getName(user)}\nUživatelské jméno: ${user.username}`;
+}
+
+export function getAnnotationStateString(state: EState) {
+    switch (state) {
+        case 'NEW':
+            return 'NovĂ˝';
+        case 'IN_PROGRESS':
+            return 'RozpracovanĂ˝';
+        case 'DONE':
+            return 'Hotovo';
+    }
+}
+
+export function getAnnotationStateColor(state: EState | undefined) {
+    switch (state) {
+        case 'NEW':
+            return 'indianred';
+        case 'IN_PROGRESS':
+            return 'orange';
+        case 'DONE':
+            return 'green';
+    }
+    return 'black';
+}
-- 
GitLab


From ff61085f1524d4f30a215e192529c5bb43bb5251 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Vlc=CC=8Cek?= <vlcek@net-inout.cz>
Date: Thu, 5 May 2022 16:57:36 +0200
Subject: [PATCH 08/12] Annotators in documents management

---
 webapp/pages/documents/admin/index.tsx | 29 ++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/webapp/pages/documents/admin/index.tsx b/webapp/pages/documents/admin/index.tsx
index 2ea195f..c668503 100644
--- a/webapp/pages/documents/admin/index.tsx
+++ b/webapp/pages/documents/admin/index.tsx
@@ -9,11 +9,22 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { LoggedUserContext } from '../../../contexts/LoggedUserContext';
 import { MainLayout } from '../../../layouts/MainLayout';
 import AddDocumentModal from '../../../components/modals/AddDocumentModal';
-import { AnnotationListInfo, DocumentListInfo, UserInfo } from '../../../api';
+import {
+    AnnotationListInfo,
+    DocumentListInfo,
+    DocumentUserInfo,
+    EState,
+    UserInfo,
+} from '../../../api';
 import { documentController, userController } from '../../../controllers';
 import AssignDocumentModal from '../../../components/modals/AssignDocumentModal';
 import { ShowToast } from '../../../utils/alerts';
 import { TableDocInfo } from '../../../components/types/TableDocInfo';
+import {
+    getAnnotationStateColor,
+    getNameTruncated,
+    getUserInfoAlt,
+} from '../../../utils/strings';
 
 function AdminDocumentPage() {
     const redirecting = useUnauthRedirect('/login');
@@ -79,19 +90,29 @@ function AdminDocumentPage() {
             title: 'Anotátoři',
             dataIndex: 'annotatingUsers',
             key: 'annotatingUsers',
-            render: (columnData: UserInfo[], record: DocumentListInfo, index: number) => {
+            render: (
+                columnData: DocumentUserInfo[],
+                record: DocumentListInfo,
+                index: number
+            ) => {
                 return (
                     <div>
                         {columnData.map((e) => (
                             <span
                                 key={e.username + '.' + record.id}
-                                title={e.username ?? ''}
+                                title={getUserInfoAlt(e) + '\nStav: ' + e.state}
+                                style={{
+                                    color: getAnnotationStateColor(e.state),
+                                    padding: 3,
+                                }}
+                                className={'me-3'}
                             >
                                 <FontAwesomeIcon
                                     icon={faUser}
-                                    title={e.username ?? ''}
+                                    title={getUserInfoAlt(e)}
                                     className={'me-2'}
                                 />
+                                {getNameTruncated(e)}
                             </span>
                         ))}
                     </div>
-- 
GitLab


From 3df6328888fd50669fee366723641cd4dd6b7c3c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Vlc=CC=8Cek?= <vlcek@net-inout.cz>
Date: Thu, 5 May 2022 17:19:01 +0200
Subject: [PATCH 09/12] Custom badge component added

---
 webapp/components/common/ABadge.tsx | 48 +++++++++++++++++++++++++++++
 webapp/constants.ts                 |  6 ++++
 2 files changed, 54 insertions(+)
 create mode 100644 webapp/components/common/ABadge.tsx
 create mode 100644 webapp/constants.ts

diff --git a/webapp/components/common/ABadge.tsx b/webapp/components/common/ABadge.tsx
new file mode 100644
index 0000000..920613f
--- /dev/null
+++ b/webapp/components/common/ABadge.tsx
@@ -0,0 +1,48 @@
+import { ReactNode } from 'react';
+import {
+    BORDER_RADIUS,
+    COLOR_ERROR,
+    COLOR_GENERAL,
+    COLOR_SUCCESS,
+    COLOR_WARNING,
+} from '../../constants';
+
+export enum BadgeStyle {
+    GENERAL,
+    SUCCESS,
+    WARNING,
+    ERROR,
+}
+
+export interface BadgeProps {
+    style: BadgeStyle;
+    children: ReactNode | ReactNode[];
+}
+
+export function ABadge(props: BadgeProps) {
+    function getBackgroundColor() {
+        switch (props.style) {
+            case BadgeStyle.GENERAL:
+                return COLOR_GENERAL;
+            case BadgeStyle.ERROR:
+                return COLOR_ERROR;
+            case BadgeStyle.SUCCESS:
+                return COLOR_SUCCESS;
+            case BadgeStyle.WARNING:
+                return COLOR_WARNING;
+        }
+    }
+
+    return (
+        <span
+            style={{
+                backgroundColor: getBackgroundColor(),
+                color: 'white',
+                padding: '5px',
+                borderRadius: BORDER_RADIUS,
+            }}
+        >
+            {props.children}
+        </span>
+    );
+}
diff --git a/webapp/constants.ts b/webapp/constants.ts
new file mode 100644
index 0000000..bdabaf5
--- /dev/null
+++ b/webapp/constants.ts
@@ -0,0 +1,6 @@
+export const COLOR_GENERAL = 'gray';
+export const COLOR_SUCCESS = 'darkgreen';
+export const COLOR_WARNING = 'darkorange';
+export const COLOR_ERROR = 'indianred';
+
+export const BORDER_RADIUS = 4;
-- 
GitLab


From 87a3d8d1fe1ef69c4a1ad725dcdf5ef167b02457 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Vlc=CC=8Cek?= <vlcek@net-inout.cz>
Date: Thu, 5 May 2022 17:19:14 +0200
Subject: [PATCH 10/12] Showing counts of annotations in admin document
 management

---
 webapp/pages/documents/admin/index.tsx | 50 +++++++++++++++++++++++---
 1 file changed, 46 insertions(+), 4 deletions(-)

diff --git a/webapp/pages/documents/admin/index.tsx b/webapp/pages/documents/admin/index.tsx
index c668503..20f8142 100644
--- a/webapp/pages/documents/admin/index.tsx
+++ b/webapp/pages/documents/admin/index.tsx
@@ -3,20 +3,19 @@ import React, { useContext, useEffect, useState } from 'react';
 
 import { useUnauthRedirect } from '../../../hooks';
 import { useRouter } from 'next/router';
-import { Button, Table, Tag, Typography } from 'antd';
+import { Button, Table, Typography } from 'antd';
 import { faFileLines, faUser } from '@fortawesome/free-solid-svg-icons';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { LoggedUserContext } from '../../../contexts/LoggedUserContext';
 import { MainLayout } from '../../../layouts/MainLayout';
 import AddDocumentModal from '../../../components/modals/AddDocumentModal';
 import {
-    AnnotationListInfo,
     DocumentListInfo,
+    DocumentListResponse,
     DocumentUserInfo,
     EState,
-    UserInfo,
 } from '../../../api';
-import { documentController, userController } from '../../../controllers';
+import { documentController } from '../../../controllers';
 import AssignDocumentModal from '../../../components/modals/AssignDocumentModal';
 import { ShowToast } from '../../../utils/alerts';
 import { TableDocInfo } from '../../../components/types/TableDocInfo';
@@ -25,6 +24,7 @@ import {
     getNameTruncated,
     getUserInfoAlt,
 } from '../../../utils/strings';
+import { ABadge, BadgeStyle } from '../../../components/common/ABadge';
 
 function AdminDocumentPage() {
     const redirecting = useUnauthRedirect('/login');
@@ -86,6 +86,48 @@ function AdminDocumentPage() {
             dataIndex: 'length',
             key: 'length',
         },
+        {
+            title: 'Dokončeno | přiřazeno | vyžadováno',
+            key: 'annotationCounts',
+            render: (
+                columnData: DocumentListResponse,
+                record: DocumentListInfo,
+                index: number
+            ) => {
+                const finished =
+                    record.annotatingUsers?.filter((d) => d.state === EState.Done)
+                        .length ?? 0;
+
+                return (
+                    <div>
+                        <ABadge
+                            style={
+                                finished === record.annotatingUsers?.length
+                                    ? BadgeStyle.SUCCESS
+                                    : BadgeStyle.WARNING
+                            }
+                        >
+                            {finished}
+                        </ABadge>
+                        {' | '}
+                        <ABadge
+                            style={
+                                record.annotatingUsers?.length ===
+                                record.requiredAnnotations
+                                    ? BadgeStyle.SUCCESS
+                                    : BadgeStyle.WARNING
+                            }
+                        >
+                            {record.annotatingUsers?.length}
+                        </ABadge>
+                        {' | '}
+                        <ABadge style={BadgeStyle.GENERAL}>
+                            {record.requiredAnnotations}
+                        </ABadge>
+                    </div>
+                );
+            },
+        },
         {
             title: 'Anotátoři',
             dataIndex: 'annotatingUsers',
-- 
GitLab


From ef2143b8a1287ac35d0678cf6a36b239bb0c5258 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Vlc=CC=8Cek?= <vlcek@net-inout.cz>
Date: Sat, 7 May 2022 14:11:18 +0200
Subject: [PATCH 11/12] Minor table colors changes

---
 webapp/pages/documents/admin/index.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/webapp/pages/documents/admin/index.tsx b/webapp/pages/documents/admin/index.tsx
index 20f8142..517cb13 100644
--- a/webapp/pages/documents/admin/index.tsx
+++ b/webapp/pages/documents/admin/index.tsx
@@ -112,8 +112,8 @@ function AdminDocumentPage() {
                         {' | '}
                         <ABadge
                             style={
-                                record.annotatingUsers?.length ===
-                                record.requiredAnnotations
+                                (record.annotatingUsers?.length ?? 0) >=
+                                (record.requiredAnnotations ?? 0)
                                     ? BadgeStyle.SUCCESS
                                     : BadgeStyle.WARNING
                             }
-- 
GitLab


From e7eca311c12afcfd9decb840ca44bc8092239fa6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Vlc=CC=8Cek?= <vlcek@net-inout.cz>
Date: Sat, 7 May 2022 14:12:03 +0200
Subject: [PATCH 12/12] Required annotations count changing - modal - done

---
 .../SetRequiredAnnotationsCountModal.tsx      | 85 +++++++++++++++++++
 webapp/pages/documents/admin/index.tsx        | 26 +++++-
 2 files changed, 110 insertions(+), 1 deletion(-)
 create mode 100644 webapp/components/modals/SetRequiredAnnotationsCountModal.tsx

diff --git a/webapp/components/modals/SetRequiredAnnotationsCountModal.tsx b/webapp/components/modals/SetRequiredAnnotationsCountModal.tsx
new file mode 100644
index 0000000..bec7e6b
--- /dev/null
+++ b/webapp/components/modals/SetRequiredAnnotationsCountModal.tsx
@@ -0,0 +1,85 @@
+import { Button, Form, Input, Modal } from 'antd';
+import 'antd/dist/antd.css';
+import React from 'react';
+import { SetRequiredAnnotationsRequest } from '../../api';
+import { documentController } from '../../controllers';
+import { ShowToast } from '../../utils/alerts';
+
+interface ModalProps {
+    onCancel: () => void;
+    documentsIds: string[];
+}
+
+function SetRequiredAnnotationsCountModal({ onCancel, documentsIds }: ModalProps) {
+    const handleOk = () => {
+        onCancel();
+    };
+
+    const handleCancel = () => {
+        onCancel();
+    };
+
+    const onFinish = async (values: any) => {
+        if (documentsIds && documentsIds.length !== 0) {
+            const req: SetRequiredAnnotationsRequest = {
+                requiredAnnotations: values.annotationsCount,
+                documentIds: documentsIds,
+            };
+
+            await documentController.documentsRequiredAnnotationsPost(req);
+
+            ShowToast(
+                'Požadovaný počet anotací úspěšně nastaven',
+                'success',
+                3000,
+                'top-end'
+            );
+        }
+
+        handleOk();
+    };
+
+    const onFinishFailed = (errorInfo: any) => {
+        ShowToast('Zadané údaje nejsou validní', 'error', 3000, 'top-end');
+    };
+
+    return (
+        <Modal
+            title={'Nastavit poĹľadovanĂ˝ poÄŤet anotacĂ­'}
+            onOk={handleOk}
+            visible={true}
+            onCancel={handleCancel}
+            footer={null}
+            width={400}
+            centered
+        >
+            <Form
+                onFinish={onFinish}
+                onFinishFailed={onFinishFailed}
+                autoComplete="off"
+                labelCol={{ span: 4 }}
+                layout="horizontal"
+            >
+                PoĹľadovanĂ˝ poÄŤet anotacĂ­:
+                <Form.Item
+                    name="annotationsCount"
+                    rules={[
+                        {
+                            required: true,
+                            message: 'Zadejte poÄŤet anotacĂ­',
+                        },
+                    ]}
+                >
+                    <Input placeholder="PoÄŤet anotacĂ­" />
+                </Form.Item>
+                <Form.Item>
+                    <Button type="primary" htmlType="submit" className="w-100">
+                        Změnit
+                    </Button>
+                </Form.Item>
+            </Form>
+        </Modal>
+    );
+}
+
+export default SetRequiredAnnotationsCountModal;
diff --git a/webapp/pages/documents/admin/index.tsx b/webapp/pages/documents/admin/index.tsx
index 517cb13..936a8b5 100644
--- a/webapp/pages/documents/admin/index.tsx
+++ b/webapp/pages/documents/admin/index.tsx
@@ -25,12 +25,15 @@ import {
     getUserInfoAlt,
 } from '../../../utils/strings';
 import { ABadge, BadgeStyle } from '../../../components/common/ABadge';
+import SetRequiredAnnotationsCountModal from '../../../components/modals/SetRequiredAnnotationsCountModal';
 
 function AdminDocumentPage() {
     const redirecting = useUnauthRedirect('/login');
     const { logout, role } = useContext(LoggedUserContext);
     const [visibleAdd, setVisibleAdd] = React.useState(false);
     const [visibleAssign, setVisibleAssign] = React.useState(false);
+    const [visibleSetCount, setVisibleSetCount] = React.useState(false);
+
     const router = useRouter();
 
     const [documents, setDocuments] = useState<TableDocInfo[]>([]);
@@ -64,7 +67,18 @@ function AdminDocumentPage() {
             setVisibleAssign(true);
         }
     };
-
+    const showRequiredAnnotationsCountModal = () => {
+        if (selectedDocs.length == 0) {
+            ShowToast(
+                'Vyberte dokument, pro které chcete nastavit požadovaný počet anotací',
+                'warning',
+                3000,
+                'top-end'
+            );
+        } else {
+            setVisibleSetCount(true);
+        }
+    };
     const showAddModal = () => {
         setVisibleAdd(true);
     };
@@ -73,6 +87,7 @@ function AdminDocumentPage() {
         fetchData();
         setVisibleAdd(false);
         setVisibleAssign(false);
+        setVisibleSetCount(false);
     };
 
     const columns = [
@@ -179,10 +194,19 @@ function AdminDocumentPage() {
                 Nahrát dokument
             </Button>
             <Button onClick={showAssignModal}>Přiřadit dokumenty</Button>
+            <Button onClick={showRequiredAnnotationsCountModal}>
+                Nastavit poĹľadovanĂ˝ poÄŤet anotacĂ­
+            </Button>
             {visibleAdd && <AddDocumentModal onCancel={hideModal} />}
             {visibleAssign && (
                 <AssignDocumentModal documentsIds={selectedDocs} onCancel={hideModal} />
             )}
+            {visibleSetCount && (
+                <SetRequiredAnnotationsCountModal
+                    documentsIds={selectedDocs}
+                    onCancel={hideModal}
+                />
+            )}
 
             <Table
                 rowSelection={{
-- 
GitLab