diff --git a/Api/Api.csproj b/Api/Api.csproj
new file mode 100644
index 0000000..e92b9c7
--- /dev/null
+++ b/Api/Api.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Api/Program.cs b/Api/Program.cs
new file mode 100644
index 0000000..04e6c05
--- /dev/null
+++ b/Api/Program.cs
@@ -0,0 +1,22 @@
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen();
+
+var app = builder.Build();
+
+
+app.UseSwagger();
+app.UseSwaggerUI();
+
+app.UseHttpsRedirection();
+
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.Run();
diff --git a/Api/Properties/launchSettings.json b/Api/Properties/launchSettings.json
new file mode 100644
index 0000000..a3659ea
--- /dev/null
+++ b/Api/Properties/launchSettings.json
@@ -0,0 +1,41 @@
+{
+ "$schema": "http://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:50314",
+ "sslPort": 44341
+ }
+ },
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "http://localhost:5026",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "https://localhost:7021;http://localhost:5026",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/Api/appsettings.Development.json b/Api/appsettings.Development.json
new file mode 100644
index 0000000..0c208ae
--- /dev/null
+++ b/Api/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/Api/appsettings.json b/Api/appsettings.json
new file mode 100644
index 0000000..10f68b8
--- /dev/null
+++ b/Api/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/Database/ApplicationContext.cs b/Database/ApplicationContext.cs
new file mode 100644
index 0000000..5cc4ec9
--- /dev/null
+++ b/Database/ApplicationContext.cs
@@ -0,0 +1,44 @@
+using Database.Entities;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+
+namespace Database;
+
+public class ApplicationContext(DbContextOptions options) : IdentityDbContext, Guid, IdentityUserClaim,
+ IdentityUserRole, IdentityUserLogin, IdentityRoleClaim, IdentityUserToken>(options)
+{
+
+ public DbSet Admonitions { get; set; }
+
+ public DbSet Alliances { get; set; }
+
+ public DbSet DesertStorms { get; set; }
+
+ public DbSet MarshalGuards { get; set; }
+
+ public DbSet Notes { get; set; }
+
+ public DbSet Players { get; set; }
+
+ public DbSet Ranks { get; set; }
+
+ public DbSet VsDuels { get; set; }
+
+ protected override void OnModelCreating(ModelBuilder builder)
+ {
+ base.OnModelCreating(builder);
+
+ builder.HasDefaultSchema("dbo");
+
+ builder.Entity(entity => { entity.ToTable(name: "Users"); });
+ builder.Entity>(entity => entity.ToTable(name: "Roles"));
+ builder.Entity>(entity => entity.ToTable(name: "UserRoles"));
+ builder.Entity>(entity => entity.ToTable(name: "RoleClaims"));
+ builder.Entity>(entity => entity.ToTable(name: "UserLogins"));
+ builder.Entity>(entity => entity.ToTable(name: "UserTokens"));
+ builder.Entity>(entity => entity.ToTable(name: "UserClaims"));
+
+ builder.ApplyConfigurationsFromAssembly(typeof(ApplicationContext).Assembly);
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/AdmonitionConfiguration.cs b/Database/Configurations/AdmonitionConfiguration.cs
new file mode 100644
index 0000000..85aa39f
--- /dev/null
+++ b/Database/Configurations/AdmonitionConfiguration.cs
@@ -0,0 +1,15 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class AdmonitionConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(admonition => admonition.Id);
+
+ builder.Property(admonition => admonition.Reason).IsRequired().HasMaxLength(250);
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/DesertStormConfiguration.cs b/Database/Configurations/DesertStormConfiguration.cs
new file mode 100644
index 0000000..1d5337f
--- /dev/null
+++ b/Database/Configurations/DesertStormConfiguration.cs
@@ -0,0 +1,18 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class DesertStormConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(desertStorm => desertStorm.Id);
+
+ builder.Property(desertStorm => desertStorm.CalendarWeek).IsRequired();
+ builder.Property(desertStorm => desertStorm.Participated).IsRequired();
+ builder.Property(desertStorm => desertStorm.Registered).IsRequired();
+ builder.Property(desertStorm => desertStorm.Year).IsRequired();
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/MarshalGuardConfiguration.cs b/Database/Configurations/MarshalGuardConfiguration.cs
new file mode 100644
index 0000000..967bb68
--- /dev/null
+++ b/Database/Configurations/MarshalGuardConfiguration.cs
@@ -0,0 +1,18 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class MarshalGuardConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(marshalGuard => marshalGuard.Id);
+
+ builder.Property(marshalGuard => marshalGuard.Year).IsRequired();
+ builder.Property(marshalGuard => marshalGuard.Day).IsRequired();
+ builder.Property(marshalGuard => marshalGuard.Month).IsRequired();
+ builder.Property(marshalGuard => marshalGuard.Participated).IsRequired();
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/NoteConfiguration.cs b/Database/Configurations/NoteConfiguration.cs
new file mode 100644
index 0000000..4c0bdca
--- /dev/null
+++ b/Database/Configurations/NoteConfiguration.cs
@@ -0,0 +1,15 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class NoteConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(note => note.Id);
+
+ builder.Property(note => note.PlayerNote).IsRequired().HasMaxLength(500);
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/PlayerConfiguration.cs b/Database/Configurations/PlayerConfiguration.cs
new file mode 100644
index 0000000..8b7664b
--- /dev/null
+++ b/Database/Configurations/PlayerConfiguration.cs
@@ -0,0 +1,46 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class PlayerConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(player => player.Id);
+
+ builder.Property(player => player.PlayerName).IsRequired().HasMaxLength(250);
+ builder.Property(player => player.Level).IsRequired().HasMaxLength(3);
+
+ builder.HasOne(player => player.Rank)
+ .WithOne(rank => rank.Player)
+ .HasForeignKey(rank => rank.PlayerId)
+ .OnDelete(DeleteBehavior.Cascade);
+
+ builder.HasMany(player => player.VsDuels)
+ .WithOne(vsDuel => vsDuel.Player)
+ .HasForeignKey(vsDuel => vsDuel.PlayerId)
+ .OnDelete(DeleteBehavior.Cascade);
+
+ builder.HasMany(player => player.DesertStorms)
+ .WithOne(desertStorm => desertStorm.Player)
+ .HasForeignKey(desertStorm => desertStorm.PlayerId)
+ .OnDelete(DeleteBehavior.Cascade);
+
+ builder.HasMany(player => player.MarshalGuards)
+ .WithOne(marshalGuard => marshalGuard.Player)
+ .HasForeignKey(marshalGuard => marshalGuard.PlayerId)
+ .OnDelete(DeleteBehavior.Cascade);
+
+ builder.HasMany(player => player.Notes)
+ .WithOne(notes => notes.Player)
+ .HasForeignKey(note => note.PlayerId)
+ .OnDelete(DeleteBehavior.Cascade);
+
+ builder.HasMany(player => player.Admonitions)
+ .WithOne(admonitions => admonitions.Player)
+ .HasForeignKey(admonition => admonition.PlayerId)
+ .OnDelete(DeleteBehavior.Cascade);
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/RankConfiguration.cs b/Database/Configurations/RankConfiguration.cs
new file mode 100644
index 0000000..9529dc9
--- /dev/null
+++ b/Database/Configurations/RankConfiguration.cs
@@ -0,0 +1,51 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class RankConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(rank => rank.Id);
+
+ builder.Property(rank => rank.Name).IsRequired().HasMaxLength(2);
+
+ var ranks = new List()
+ {
+ new()
+ {
+ Id = new Guid(""),
+ Name = "R5",
+ Player = null!
+ },
+ new()
+ {
+ Id = new Guid(""),
+ Name = "R4",
+ Player = null!
+ },
+ new()
+ {
+ Id = new Guid(""),
+ Name = "R3",
+ Player = null!
+ },
+ new()
+ {
+ Id = new Guid(""),
+ Name = "R2",
+ Player = null!
+ },
+ new()
+ {
+ Id = new Guid(""),
+ Name = "R1",
+ Player = null!
+ }
+ };
+
+ builder.HasData(ranks);
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/RoleConfiguration.cs b/Database/Configurations/RoleConfiguration.cs
new file mode 100644
index 0000000..ce0dba8
--- /dev/null
+++ b/Database/Configurations/RoleConfiguration.cs
@@ -0,0 +1,42 @@
+using Microsoft.AspNetCore.Identity;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using Utilities.Constants;
+
+namespace Database.Configurations;
+
+public class RoleConfiguration : IEntityTypeConfiguration>
+{
+ public void Configure(EntityTypeBuilder> builder)
+ {
+ var roles = new List>()
+ {
+ new()
+ {
+ Id = new Guid(""),
+ NormalizedName = ApplicationRoles.SystemAdministrator.ToUpper(),
+ Name = ApplicationRoles.SystemAdministrator
+ },
+ new()
+ {
+ Id = new Guid(""),
+ NormalizedName = ApplicationRoles.Administrator.ToUpper(),
+ Name = ApplicationRoles.Administrator
+ },
+ new()
+ {
+ Id = new Guid(""),
+ NormalizedName = ApplicationRoles.User.ToUpper(),
+ Name = ApplicationRoles.User
+ },
+ new()
+ {
+ Id = new Guid(""),
+ NormalizedName = ApplicationRoles.ReadOnly.ToUpper(),
+ Name = ApplicationRoles.ReadOnly
+ }
+ };
+
+ builder.HasData(roles);
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/UserConfiguration.cs b/Database/Configurations/UserConfiguration.cs
new file mode 100644
index 0000000..0aec250
--- /dev/null
+++ b/Database/Configurations/UserConfiguration.cs
@@ -0,0 +1,18 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class UserConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.Property(user => user.PlayerName).IsRequired().HasMaxLength(200);
+
+ builder.HasOne(user => user.Alliance)
+ .WithOne(alliance => alliance.User)
+ .HasForeignKey(alliance => alliance.UserId)
+ .OnDelete(DeleteBehavior.NoAction);
+ }
+}
\ No newline at end of file
diff --git a/Database/Configurations/VsDuelConfiguration.cs b/Database/Configurations/VsDuelConfiguration.cs
new file mode 100644
index 0000000..fddd609
--- /dev/null
+++ b/Database/Configurations/VsDuelConfiguration.cs
@@ -0,0 +1,17 @@
+using Database.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Database.Configurations;
+
+public class VsDuelConfiguration : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(vsDuel => vsDuel.Id);
+
+ builder.Property(vsDuel => vsDuel.Year).IsRequired();
+ builder.Property(vsDuel => vsDuel.WeeklyPoints).IsRequired();
+ builder.Property(vsDuel => vsDuel.CalendarWeek).IsRequired();
+ }
+}
\ No newline at end of file
diff --git a/Database/Database.csproj b/Database/Database.csproj
new file mode 100644
index 0000000..fabce66
--- /dev/null
+++ b/Database/Database.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Database/DatabaseDependencyInjection.cs b/Database/DatabaseDependencyInjection.cs
new file mode 100644
index 0000000..912a699
--- /dev/null
+++ b/Database/DatabaseDependencyInjection.cs
@@ -0,0 +1,41 @@
+using Database.Entities;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Database;
+
+public static class DatabaseDependencyInjection
+{
+ public static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddDbContext(options =>
+ {
+ options.UseSqlServer(configuration.GetConnectionString("ApplicationDbConnection"));
+ });
+
+ services.AddIdentityCore(options =>
+ {
+ options.Password.RequiredLength = 7;
+ options.Password.RequireDigit = true;
+ options.Password.RequireLowercase = true;
+ options.Password.RequireUppercase = true;
+ options.Password.RequireNonAlphanumeric = true;
+
+ options.User.RequireUniqueEmail = true;
+ })
+ .AddRoles>()
+ .AddTokenProvider>("PlayerManagerApi")
+ .AddEntityFrameworkStores()
+ .AddDefaultTokenProviders();
+
+ services.Configure(options =>
+ {
+ options.TokenLifespan = TimeSpan.FromHours(2);
+ });
+
+
+ return services;
+ }
+}
\ No newline at end of file
diff --git a/Database/Entities/Admonition.cs b/Database/Entities/Admonition.cs
new file mode 100644
index 0000000..44d2636
--- /dev/null
+++ b/Database/Entities/Admonition.cs
@@ -0,0 +1,10 @@
+namespace Database.Entities;
+
+public class Admonition : BaseEntity
+{
+ public required string Reason { get; set; }
+
+ public Guid PlayerId { get; set; }
+
+ public required Player Player { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/Alliance.cs b/Database/Entities/Alliance.cs
new file mode 100644
index 0000000..ff39083
--- /dev/null
+++ b/Database/Entities/Alliance.cs
@@ -0,0 +1,16 @@
+namespace Database.Entities;
+
+public class Alliance : BaseEntity
+{
+ public int Server { get; set; }
+
+ public required string Name { get; set; }
+
+ public required string Abbreviation { get; set; }
+
+ public User User { get; set; }
+
+ public Guid UserId { get; set; }
+
+ public ICollection Players { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/BaseEntity.cs b/Database/Entities/BaseEntity.cs
new file mode 100644
index 0000000..d7fe021
--- /dev/null
+++ b/Database/Entities/BaseEntity.cs
@@ -0,0 +1,6 @@
+namespace Database.Entities;
+
+public abstract class BaseEntity
+{
+ public Guid Id { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/DesertStorm.cs b/Database/Entities/DesertStorm.cs
new file mode 100644
index 0000000..1e6ca88
--- /dev/null
+++ b/Database/Entities/DesertStorm.cs
@@ -0,0 +1,17 @@
+namespace Database.Entities;
+
+public class DesertStorm : BaseEntity
+{
+ public bool Registered { get; set; }
+
+ public bool Participated { get; set; }
+
+ public int Year { get; set; }
+
+ public int CalendarWeek { get; set; }
+
+
+ public Guid PlayerId { get; set; }
+
+ public required Player Player { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/MarshalGuard.cs b/Database/Entities/MarshalGuard.cs
new file mode 100644
index 0000000..9cec772
--- /dev/null
+++ b/Database/Entities/MarshalGuard.cs
@@ -0,0 +1,16 @@
+namespace Database.Entities;
+
+public class MarshalGuard : BaseEntity
+{
+ public bool Participated { get; set; }
+
+ public int Year { get; set; }
+
+ public int Month { get; set; }
+
+ public int Day { get; set; }
+
+ public Guid PlayerId { get; set; }
+
+ public required Player Player { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/Note.cs b/Database/Entities/Note.cs
new file mode 100644
index 0000000..b9ae908
--- /dev/null
+++ b/Database/Entities/Note.cs
@@ -0,0 +1,10 @@
+namespace Database.Entities;
+
+public class Note : BaseEntity
+{
+ public required string PlayerNote { get; set; }
+
+ public Guid PlayerId { get; set; }
+
+ public required Player Player { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/Player.cs b/Database/Entities/Player.cs
new file mode 100644
index 0000000..4fa1cf3
--- /dev/null
+++ b/Database/Entities/Player.cs
@@ -0,0 +1,23 @@
+namespace Database.Entities;
+
+public class Player : BaseEntity
+{
+ public required string PlayerName { get; set; }
+
+ public required Rank Rank { get; set; }
+
+ public Alliance Alliance { get; set; }
+
+ public required string Level { get; set; }
+
+ public ICollection DesertStorms { get; set; } = [];
+
+ public ICollection VsDuels { get; set; } = [];
+
+ public ICollection MarshalGuards { get; set; } = [];
+
+ public ICollection Admonitions { get; set; } = [];
+
+
+ public ICollection Notes { get; set; } = [];
+}
\ No newline at end of file
diff --git a/Database/Entities/Rank.cs b/Database/Entities/Rank.cs
new file mode 100644
index 0000000..ec86b4a
--- /dev/null
+++ b/Database/Entities/Rank.cs
@@ -0,0 +1,10 @@
+namespace Database.Entities;
+
+public class Rank : BaseEntity
+{
+ public required string Name { get; set; }
+
+ public Guid PlayerId { get; set; }
+
+ public required Player Player { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/User.cs b/Database/Entities/User.cs
new file mode 100644
index 0000000..44078dc
--- /dev/null
+++ b/Database/Entities/User.cs
@@ -0,0 +1,10 @@
+using Microsoft.AspNetCore.Identity;
+
+namespace Database.Entities;
+
+public class User : IdentityUser
+{
+ public required Alliance Alliance { get; set; }
+
+ public required string PlayerName { get; set; }
+}
\ No newline at end of file
diff --git a/Database/Entities/VsDuel.cs b/Database/Entities/VsDuel.cs
new file mode 100644
index 0000000..7227fd8
--- /dev/null
+++ b/Database/Entities/VsDuel.cs
@@ -0,0 +1,15 @@
+namespace Database.Entities;
+
+public class VsDuel : BaseEntity
+{
+ public int WeeklyPoints { get; set; }
+
+ public int Year { get; set; }
+
+ public int CalendarWeek { get; set; }
+
+
+ public Guid PlayerId { get; set; }
+
+ public required Player Player { get; set; }
+}
\ No newline at end of file
diff --git a/PlayerManagement.sln b/PlayerManagement.sln
new file mode 100644
index 0000000..a16ca63
--- /dev/null
+++ b/PlayerManagement.sln
@@ -0,0 +1,37 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.10.35122.118
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Database", "Database\Database.csproj", "{93C305BF-7225-492E-9FBA-D2DD9B0698DF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utilities", "Utilities\Utilities.csproj", "{FA8FEE7C-58A5-458F-A7D5-509D9364159B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Api", "Api\Api.csproj", "{B3CFE8A6-2BA3-4CB2-893F-3F2B0FABB08F}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {93C305BF-7225-492E-9FBA-D2DD9B0698DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {93C305BF-7225-492E-9FBA-D2DD9B0698DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {93C305BF-7225-492E-9FBA-D2DD9B0698DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {93C305BF-7225-492E-9FBA-D2DD9B0698DF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FA8FEE7C-58A5-458F-A7D5-509D9364159B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FA8FEE7C-58A5-458F-A7D5-509D9364159B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FA8FEE7C-58A5-458F-A7D5-509D9364159B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FA8FEE7C-58A5-458F-A7D5-509D9364159B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B3CFE8A6-2BA3-4CB2-893F-3F2B0FABB08F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B3CFE8A6-2BA3-4CB2-893F-3F2B0FABB08F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B3CFE8A6-2BA3-4CB2-893F-3F2B0FABB08F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B3CFE8A6-2BA3-4CB2-893F-3F2B0FABB08F}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {5EBDD59D-2E4D-45EB-BDEB-A5CE1CBC5440}
+ EndGlobalSection
+EndGlobal
diff --git a/Utilities/Constants/ApplicationRoles.cs b/Utilities/Constants/ApplicationRoles.cs
new file mode 100644
index 0000000..293365a
--- /dev/null
+++ b/Utilities/Constants/ApplicationRoles.cs
@@ -0,0 +1,12 @@
+namespace Utilities.Constants;
+
+public static class ApplicationRoles
+{
+ public const string SystemAdministrator = "SystemAdministrator";
+
+ public const string Administrator = "Administrator";
+
+ public const string User = "User";
+
+ public const string ReadOnly = "ReadOnly";
+}
\ No newline at end of file
diff --git a/Utilities/Utilities.csproj b/Utilities/Utilities.csproj
new file mode 100644
index 0000000..886b95f
--- /dev/null
+++ b/Utilities/Utilities.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+