diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index c414dd5..7167412 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -7,10 +7,10 @@ name: "Security - CodeQL"
on:
push:
- branches: [development, main, staging]
+ branches: [main]
pull_request:
# The branches below must be a subset of the branches above
- branches: [development]
+ branches: [main]
schedule:
- cron: "0 5 * * 5"
@@ -30,15 +30,15 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
- name: Load dotnet
- uses: actions/setup-dotnet@v4
+ uses: actions/setup-dotnet@v5
with:
- dotnet-version: "8.0.x"
+ dotnet-version: "10.0.x"
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
@@ -47,7 +47,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v1
+ uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -60,4 +60,4 @@ jobs:
dotnet build -c Release
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v1
+ uses: github/codeql-action/analyze@v4
diff --git a/Dockerfile b/Dockerfile
index 2993f87..fa021e6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,7 @@
# Adapted from https://github.com/dotnet/dotnet-docker/blob/main/samples/aspnetapp/Dockerfile.chiseled
# Build stage
-FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build
ARG TARGETARCH
WORKDIR /source
@@ -19,7 +19,7 @@ WORKDIR /source/Steamfitter.Api
RUN dotnet publish -a $TARGETARCH --no-restore -o /app
# Debug Stage
-FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS debug
+FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS debug
ENV DOTNET_HOSTBUILDER__RELOADCONFIGCHANGE=false
EXPOSE 8080
WORKDIR /app
@@ -28,11 +28,11 @@ USER $APP_UID
ENTRYPOINT ["./Steamfitter.Api"]
# Production stage
-FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble-chiseled AS prod
+FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-chiseled AS prod
ARG commit
ENV COMMIT=$commit
ENV DOTNET_HOSTBUILDER__RELOADCONFIGCHANGE=false
EXPOSE 8080
WORKDIR /app
COPY --link --from=build /app .
-ENTRYPOINT ["./Steamfitter.Api"]
\ No newline at end of file
+ENTRYPOINT ["./Steamfitter.Api"]
diff --git a/Steamfitter.Api.Data/Steamfitter.Api.Data.csproj b/Steamfitter.Api.Data/Steamfitter.Api.Data.csproj
index c011eee..aafbd1b 100644
--- a/Steamfitter.Api.Data/Steamfitter.Api.Data.csproj
+++ b/Steamfitter.Api.Data/Steamfitter.Api.Data.csproj
@@ -1,10 +1,11 @@
- net8.0
+ net10.0
InProcess
{0C65D9CC-A91F-46D5-BC1A-19A658064836}
+ latest
-
+
diff --git a/Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.Designer.cs b/Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.Designer.cs
new file mode 100644
index 0000000..10109c3
--- /dev/null
+++ b/Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.Designer.cs
@@ -0,0 +1,1400 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Steamfitter.Api.Data;
+
+#nullable disable
+
+namespace Steamfitter.Api.Migrations.PostgreSQL.Migrations
+{
+ [DbContext(typeof(SteamfitterContext))]
+ [Migration("20251113223256_Version10UpgradeSync")]
+ partial class Version10UpgradeSync
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "uuid-ossp");
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.BondAgent", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("AgentInstalledPath")
+ .HasColumnType("text")
+ .HasColumnName("agent_installed_path");
+
+ b.Property("AgentName")
+ .HasColumnType("text")
+ .HasColumnName("agent_name");
+
+ b.Property("AgentVersion")
+ .HasColumnType("text")
+ .HasColumnName("agent_version");
+
+ b.Property("CheckinTime")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("checkin_time");
+
+ b.Property("FQDN")
+ .HasColumnType("text")
+ .HasColumnName("fqdn");
+
+ b.Property("GuestIp")
+ .HasColumnType("text")
+ .HasColumnName("guest_ip");
+
+ b.Property("MachineName")
+ .HasColumnType("text")
+ .HasColumnName("machine_name");
+
+ b.Property("OperatingSystemId")
+ .HasColumnType("integer")
+ .HasColumnName("operating_system_id");
+
+ b.Property("VmWareName")
+ .HasColumnType("uuid")
+ .HasColumnName("vm_ware_name");
+
+ b.Property("VmWareUuid")
+ .HasColumnType("uuid")
+ .HasColumnName("vm_ware_uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OperatingSystemId");
+
+ b.ToTable("bond_agents");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.FileEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("Length")
+ .HasColumnType("bigint")
+ .HasColumnName("length");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property("StoragePath")
+ .HasColumnType("text")
+ .HasColumnName("storage_path");
+
+ b.HasKey("Id");
+
+ b.ToTable("files");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.GroupEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.HasKey("Id");
+
+ b.ToTable("groups");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.GroupMembershipEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("GroupId")
+ .HasColumnType("uuid")
+ .HasColumnName("group_id");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("GroupId", "UserId")
+ .IsUnique();
+
+ b.ToTable("group_memberships");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.LocalUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("BondAgentId")
+ .HasColumnType("uuid")
+ .HasColumnName("bond_agent_id");
+
+ b.Property("Domain")
+ .HasColumnType("text")
+ .HasColumnName("domain");
+
+ b.Property("IsCurrent")
+ .HasColumnType("boolean")
+ .HasColumnName("is_current");
+
+ b.Property("Username")
+ .HasColumnType("text")
+ .HasColumnName("username");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BondAgentId");
+
+ b.ToTable("local_user");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.MonitoredTool", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("BondAgentId")
+ .HasColumnType("uuid")
+ .HasColumnName("bond_agent_id");
+
+ b.Property("IsRunning")
+ .HasColumnType("boolean")
+ .HasColumnName("is_running");
+
+ b.Property("Location")
+ .HasColumnType("text")
+ .HasColumnName("location");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property("Version")
+ .HasColumnType("text")
+ .HasColumnName("version");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BondAgentId");
+
+ b.ToTable("monitored_tool");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.OS", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Platform")
+ .HasColumnType("text")
+ .HasColumnName("platform");
+
+ b.Property("ServicePack")
+ .HasColumnType("text")
+ .HasColumnName("service_pack");
+
+ b.Property("Version")
+ .HasColumnType("text")
+ .HasColumnName("version");
+
+ b.Property("VersionString")
+ .HasColumnType("text")
+ .HasColumnName("version_string");
+
+ b.HasKey("Id");
+
+ b.ToTable("os");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.PermissionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("Key")
+ .HasColumnType("text")
+ .HasColumnName("key");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("ReadOnly")
+ .HasColumnType("boolean")
+ .HasColumnName("read_only");
+
+ b.Property("Value")
+ .HasColumnType("text")
+ .HasColumnName("value");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Key", "Value")
+ .IsUnique();
+
+ b.ToTable("permissions");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ResultEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("Action")
+ .HasColumnType("integer")
+ .HasColumnName("action");
+
+ b.Property("ActualOutput")
+ .HasColumnType("text")
+ .HasColumnName("actual_output");
+
+ b.Property("ApiUrl")
+ .HasColumnType("text")
+ .HasColumnName("api_url");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("CurrentIteration")
+ .HasColumnType("integer")
+ .HasColumnName("current_iteration");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("ExpectedOutput")
+ .HasColumnType("text")
+ .HasColumnName("expected_output");
+
+ b.Property("ExpirationSeconds")
+ .HasColumnType("integer")
+ .HasColumnName("expiration_seconds");
+
+ b.Property("InputString")
+ .HasColumnType("text")
+ .HasColumnName("input_string");
+
+ b.Property("IntervalSeconds")
+ .HasColumnType("integer")
+ .HasColumnName("interval_seconds");
+
+ b.Property("Iterations")
+ .HasColumnType("integer")
+ .HasColumnName("iterations");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("SentDate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("sent_date");
+
+ b.Property("Status")
+ .HasColumnType("integer")
+ .HasColumnName("status");
+
+ b.Property("StatusDate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("status_date");
+
+ b.Property("TaskId")
+ .HasColumnType("uuid")
+ .HasColumnName("task_id");
+
+ b.Property("VmId")
+ .HasColumnType("uuid")
+ .HasColumnName("vm_id");
+
+ b.Property("VmName")
+ .HasColumnType("text")
+ .HasColumnName("vm_name");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TaskId");
+
+ b.ToTable("results");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("DefaultVmCredentialId")
+ .HasColumnType("uuid")
+ .HasColumnName("default_vm_credential_id");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("EndDate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("end_date");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property("OnDemand")
+ .HasColumnType("boolean")
+ .HasColumnName("on_demand");
+
+ b.Property("ScenarioTemplateId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_template_id");
+
+ b.Property("Score")
+ .HasColumnType("integer")
+ .HasColumnName("score");
+
+ b.Property("ScoreEarned")
+ .HasColumnType("integer")
+ .HasColumnName("score_earned");
+
+ b.Property("StartDate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("start_date");
+
+ b.Property("Status")
+ .HasColumnType("integer")
+ .HasColumnName("status");
+
+ b.Property("UpdateScores")
+ .HasColumnType("boolean")
+ .HasColumnName("update_scores");
+
+ b.Property("View")
+ .HasColumnType("text")
+ .HasColumnName("view");
+
+ b.Property("ViewId")
+ .HasColumnType("uuid")
+ .HasColumnName("view_id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ScenarioTemplateId");
+
+ b.ToTable("scenarios");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioMembershipEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("GroupId")
+ .HasColumnType("uuid")
+ .HasColumnName("group_id");
+
+ b.Property("RoleId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasDefaultValue(new Guid("f870d8ee-7332-4f7f-8ee0-63bd07cfd7e4"))
+ .HasColumnName("role_id");
+
+ b.Property("ScenarioId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_id");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GroupId");
+
+ b.HasIndex("RoleId");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("ScenarioId", "UserId", "GroupId")
+ .IsUnique();
+
+ b.ToTable("scenario_memberships");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioRoleEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("AllPermissions")
+ .HasColumnType("boolean")
+ .HasColumnName("all_permissions");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.PrimitiveCollection("Permissions")
+ .HasColumnType("integer[]")
+ .HasColumnName("permissions");
+
+ b.HasKey("Id");
+
+ b.ToTable("scenario_roles");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("1a3f26cd-9d99-4b98-b914-12931e786198"),
+ AllPermissions = true,
+ Description = "Can perform all actions on the Scenario",
+ Name = "Manager",
+ Permissions = new int[0]
+ },
+ new
+ {
+ Id = new Guid("39aa296e-05ba-4fb0-8d74-c92cf3354c6f"),
+ AllPermissions = false,
+ Description = "Has read only access to the Scenario",
+ Name = "Observer",
+ Permissions = new[] { 0 }
+ },
+ new
+ {
+ Id = new Guid("f870d8ee-7332-4f7f-8ee0-63bd07cfd7e4"),
+ AllPermissions = false,
+ Description = "Has read only access to the Scenario",
+ Name = "Member",
+ Permissions = new[] { 0, 1 }
+ });
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioTemplateEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("DefaultVmCredentialId")
+ .HasColumnType("uuid")
+ .HasColumnName("default_vm_credential_id");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("DurationHours")
+ .HasColumnType("integer")
+ .HasColumnName("duration_hours");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property("Score")
+ .HasColumnType("integer")
+ .HasColumnName("score");
+
+ b.Property("UpdateScores")
+ .HasColumnType("boolean")
+ .HasColumnName("update_scores");
+
+ b.HasKey("Id");
+
+ b.ToTable("scenario_templates");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioTemplateMembershipEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("GroupId")
+ .HasColumnType("uuid")
+ .HasColumnName("group_id");
+
+ b.Property("RoleId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasDefaultValue(new Guid("f870d8ee-7332-4f7f-8ee0-63bd07cfd7e4"))
+ .HasColumnName("role_id");
+
+ b.Property("ScenarioTemplateId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_template_id");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GroupId");
+
+ b.HasIndex("RoleId");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("ScenarioTemplateId", "UserId", "GroupId")
+ .IsUnique();
+
+ b.ToTable("scenario_template_memberships");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioTemplateRoleEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("AllPermissions")
+ .HasColumnType("boolean")
+ .HasColumnName("all_permissions");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.PrimitiveCollection("Permissions")
+ .HasColumnType("integer[]")
+ .HasColumnName("permissions");
+
+ b.HasKey("Id");
+
+ b.ToTable("scenario_template_roles");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("1a3f26cd-9d99-4b98-b914-12931e786198"),
+ AllPermissions = true,
+ Description = "Can perform all actions on the ScenarioTemplate",
+ Name = "Manager",
+ Permissions = new int[0]
+ },
+ new
+ {
+ Id = new Guid("39aa296e-05ba-4fb0-8d74-c92cf3354c6f"),
+ AllPermissions = false,
+ Description = "Has read only access to the ScenarioTemplate",
+ Name = "Observer",
+ Permissions = new[] { 0 }
+ },
+ new
+ {
+ Id = new Guid("f870d8ee-7332-4f7f-8ee0-63bd07cfd7e4"),
+ AllPermissions = false,
+ Description = "Has read only access to the ScenarioTemplate",
+ Name = "Member",
+ Permissions = new[] { 0, 1 }
+ });
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.SshPort", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("BondAgentId")
+ .HasColumnType("uuid")
+ .HasColumnName("bond_agent_id");
+
+ b.Property("Guest")
+ .HasColumnType("text")
+ .HasColumnName("guest");
+
+ b.Property("GuestPort")
+ .HasColumnType("bigint")
+ .HasColumnName("guest_port");
+
+ b.Property("Server")
+ .HasColumnType("text")
+ .HasColumnName("server");
+
+ b.Property("ServerPort")
+ .HasColumnType("bigint")
+ .HasColumnName("server_port");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BondAgentId");
+
+ b.ToTable("ssh_port");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.SystemRoleEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("AllPermissions")
+ .HasColumnType("boolean")
+ .HasColumnName("all_permissions");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("Immutable")
+ .HasColumnType("boolean")
+ .HasColumnName("immutable");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.PrimitiveCollection("Permissions")
+ .HasColumnType("integer[]")
+ .HasColumnName("permissions");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("system_roles");
+
+ b.HasData(
+ new
+ {
+ Id = new Guid("f35e8fff-f996-4cba-b303-3ba515ad8d2f"),
+ AllPermissions = true,
+ Description = "Can perform all actions",
+ Immutable = true,
+ Name = "Administrator",
+ Permissions = new int[0]
+ },
+ new
+ {
+ Id = new Guid("d80b73c3-95d7-4468-8650-c62bbd082507"),
+ AllPermissions = false,
+ Description = "Can create and manage their own Scenario Templates and Scenarios.",
+ Immutable = false,
+ Name = "Content Developer",
+ Permissions = new[] { 0, 4, 7 }
+ },
+ new
+ {
+ Id = new Guid("1da3027e-725d-4753-9455-a836ed9bdb1e"),
+ AllPermissions = false,
+ Description = "Can View all Scenario Templates and Scenarios, but cannot make any changes.",
+ Immutable = false,
+ Name = "Observer",
+ Permissions = new[] { 1, 5, 10, 12, 14 }
+ });
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.TaskEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("Action")
+ .HasColumnType("integer")
+ .HasColumnName("action");
+
+ b.Property("ApiUrl")
+ .HasColumnType("text")
+ .HasColumnName("api_url");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("CurrentIteration")
+ .HasColumnType("integer")
+ .HasColumnName("current_iteration");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("DelaySeconds")
+ .HasColumnType("integer")
+ .HasColumnName("delay_seconds");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("ExpectedOutput")
+ .HasColumnType("text")
+ .HasColumnName("expected_output");
+
+ b.Property("ExpirationSeconds")
+ .HasColumnType("integer")
+ .HasColumnName("expiration_seconds");
+
+ b.Property("InputString")
+ .HasColumnType("text")
+ .HasColumnName("input_string");
+
+ b.Property("IntervalSeconds")
+ .HasColumnType("integer")
+ .HasColumnName("interval_seconds");
+
+ b.Property("IterationTermination")
+ .HasColumnType("integer")
+ .HasColumnName("iteration_termination");
+
+ b.Property("Iterations")
+ .HasColumnType("integer")
+ .HasColumnName("iterations");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property("Repeatable")
+ .HasColumnType("boolean")
+ .HasColumnName("repeatable");
+
+ b.Property("ScenarioId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_id");
+
+ b.Property("ScenarioTemplateId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_template_id");
+
+ b.Property("Score")
+ .HasColumnType("integer")
+ .HasColumnName("score");
+
+ b.Property("Status")
+ .HasColumnType("integer")
+ .HasColumnName("status");
+
+ b.Property("TotalScore")
+ .HasColumnType("integer")
+ .HasColumnName("total_score");
+
+ b.Property("TotalScoreEarned")
+ .HasColumnType("integer")
+ .HasColumnName("total_score_earned");
+
+ b.Property("TotalStatus")
+ .HasColumnType("integer")
+ .HasColumnName("total_status");
+
+ b.Property("TriggerCondition")
+ .HasColumnType("integer")
+ .HasColumnName("trigger_condition");
+
+ b.Property("TriggerTaskId")
+ .HasColumnType("uuid")
+ .HasColumnName("trigger_task_id");
+
+ b.Property("UserExecutable")
+ .HasColumnType("boolean")
+ .HasColumnName("user_executable");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.Property("VmMask")
+ .HasColumnType("text")
+ .HasColumnName("vm_mask");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ScenarioId");
+
+ b.HasIndex("ScenarioTemplateId");
+
+ b.HasIndex("TriggerTaskId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("tasks");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.UserEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property("RoleId")
+ .HasColumnType("uuid")
+ .HasColumnName("role_id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Id")
+ .IsUnique();
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("users");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.UserPermissionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("PermissionId")
+ .HasColumnType("uuid")
+ .HasColumnName("permission_id");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PermissionId");
+
+ b.HasIndex("UserId", "PermissionId")
+ .IsUnique();
+
+ b.ToTable("user_permissions");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.UserScenarioEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("ScenarioId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_id");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ScenarioId");
+
+ b.HasIndex("UserId", "ScenarioId")
+ .IsUnique();
+
+ b.ToTable("user_scenario_entity");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.VmCredentialEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .HasDefaultValueSql("uuid_generate_v4()");
+
+ b.Property("CreatedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("created_by");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created");
+
+ b.Property("DateModified")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_modified");
+
+ b.Property("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property("ModifiedBy")
+ .HasColumnType("uuid")
+ .HasColumnName("modified_by");
+
+ b.Property("Password")
+ .HasColumnType("text")
+ .HasColumnName("password");
+
+ b.Property("ScenarioId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_id");
+
+ b.Property("ScenarioTemplateId")
+ .HasColumnType("uuid")
+ .HasColumnName("scenario_template_id");
+
+ b.Property("Username")
+ .HasColumnType("text")
+ .HasColumnName("username");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ScenarioId");
+
+ b.HasIndex("ScenarioTemplateId");
+
+ b.ToTable("vm_credentials");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.BondAgent", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.OS", "OperatingSystem")
+ .WithMany()
+ .HasForeignKey("OperatingSystemId");
+
+ b.Navigation("OperatingSystem");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.GroupMembershipEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.GroupEntity", "Group")
+ .WithMany("Memberships")
+ .HasForeignKey("GroupId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Steamfitter.Api.Data.Models.UserEntity", "User")
+ .WithMany("GroupMemberships")
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Group");
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.LocalUser", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.BondAgent", null)
+ .WithMany("LocalUsers")
+ .HasForeignKey("BondAgentId");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.MonitoredTool", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.BondAgent", null)
+ .WithMany("MonitoredTools")
+ .HasForeignKey("BondAgentId");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ResultEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.TaskEntity", "Task")
+ .WithMany("Results")
+ .HasForeignKey("TaskId")
+ .OnDelete(DeleteBehavior.SetNull);
+
+ b.Navigation("Task");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioTemplateEntity", "ScenarioTemplate")
+ .WithMany("Scenarios")
+ .HasForeignKey("ScenarioTemplateId")
+ .OnDelete(DeleteBehavior.SetNull);
+
+ b.Navigation("ScenarioTemplate");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioMembershipEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.GroupEntity", "Group")
+ .WithMany("ScenarioMemberships")
+ .HasForeignKey("GroupId");
+
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioRoleEntity", "Role")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioEntity", "Scenario")
+ .WithMany("Memberships")
+ .HasForeignKey("ScenarioId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Steamfitter.Api.Data.Models.UserEntity", "User")
+ .WithMany("ScenarioMemberships")
+ .HasForeignKey("UserId");
+
+ b.Navigation("Group");
+
+ b.Navigation("Role");
+
+ b.Navigation("Scenario");
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioTemplateMembershipEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.GroupEntity", "Group")
+ .WithMany("ScenarioTemplateMemberships")
+ .HasForeignKey("GroupId");
+
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioTemplateRoleEntity", "Role")
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioTemplateEntity", "ScenarioTemplate")
+ .WithMany("Memberships")
+ .HasForeignKey("ScenarioTemplateId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Steamfitter.Api.Data.Models.UserEntity", "User")
+ .WithMany("ScenarioTemplateMemberships")
+ .HasForeignKey("UserId");
+
+ b.Navigation("Group");
+
+ b.Navigation("Role");
+
+ b.Navigation("ScenarioTemplate");
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.SshPort", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.BondAgent", null)
+ .WithMany("SshPorts")
+ .HasForeignKey("BondAgentId");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.TaskEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioEntity", "Scenario")
+ .WithMany("Tasks")
+ .HasForeignKey("ScenarioId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioTemplateEntity", "ScenarioTemplate")
+ .WithMany("Tasks")
+ .HasForeignKey("ScenarioTemplateId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Steamfitter.Api.Data.Models.TaskEntity", "TriggerTask")
+ .WithMany("Children")
+ .HasForeignKey("TriggerTaskId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Scenario");
+
+ b.Navigation("ScenarioTemplate");
+
+ b.Navigation("TriggerTask");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.UserEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.SystemRoleEntity", "Role")
+ .WithMany()
+ .HasForeignKey("RoleId");
+
+ b.Navigation("Role");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.UserPermissionEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.PermissionEntity", "Permission")
+ .WithMany("UserPermissions")
+ .HasForeignKey("PermissionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Steamfitter.Api.Data.Models.UserEntity", "User")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Permission");
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.UserScenarioEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioEntity", "Scenario")
+ .WithMany()
+ .HasForeignKey("ScenarioId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Steamfitter.Api.Data.Models.UserEntity", "User")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Scenario");
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.VmCredentialEntity", b =>
+ {
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioEntity", "Scenario")
+ .WithMany("VmCredentials")
+ .HasForeignKey("ScenarioId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.HasOne("Steamfitter.Api.Data.Models.ScenarioTemplateEntity", "ScenarioTemplate")
+ .WithMany("VmCredentials")
+ .HasForeignKey("ScenarioTemplateId")
+ .OnDelete(DeleteBehavior.Cascade);
+
+ b.Navigation("Scenario");
+
+ b.Navigation("ScenarioTemplate");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.BondAgent", b =>
+ {
+ b.Navigation("LocalUsers");
+
+ b.Navigation("MonitoredTools");
+
+ b.Navigation("SshPorts");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.GroupEntity", b =>
+ {
+ b.Navigation("Memberships");
+
+ b.Navigation("ScenarioMemberships");
+
+ b.Navigation("ScenarioTemplateMemberships");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.PermissionEntity", b =>
+ {
+ b.Navigation("UserPermissions");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioEntity", b =>
+ {
+ b.Navigation("Memberships");
+
+ b.Navigation("Tasks");
+
+ b.Navigation("VmCredentials");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.ScenarioTemplateEntity", b =>
+ {
+ b.Navigation("Memberships");
+
+ b.Navigation("Scenarios");
+
+ b.Navigation("Tasks");
+
+ b.Navigation("VmCredentials");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.TaskEntity", b =>
+ {
+ b.Navigation("Children");
+
+ b.Navigation("Results");
+ });
+
+ modelBuilder.Entity("Steamfitter.Api.Data.Models.UserEntity", b =>
+ {
+ b.Navigation("GroupMemberships");
+
+ b.Navigation("ScenarioMemberships");
+
+ b.Navigation("ScenarioTemplateMemberships");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.cs b/Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.cs
new file mode 100644
index 0000000..1809f0f
--- /dev/null
+++ b/Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.cs
@@ -0,0 +1,47 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Steamfitter.Api.Migrations.PostgreSQL.Migrations
+{
+ ///
+ public partial class Version10UpgradeSync : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.UpdateData(
+ table: "system_roles",
+ keyColumn: "id",
+ keyValue: new Guid("1da3027e-725d-4753-9455-a836ed9bdb1e"),
+ column: "description",
+ value: "Can View all Scenario Templates and Scenarios, but cannot make any changes.");
+
+ migrationBuilder.UpdateData(
+ table: "system_roles",
+ keyColumn: "id",
+ keyValue: new Guid("d80b73c3-95d7-4468-8650-c62bbd082507"),
+ column: "description",
+ value: "Can create and manage their own Scenario Templates and Scenarios.");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.UpdateData(
+ table: "system_roles",
+ keyColumn: "id",
+ keyValue: new Guid("1da3027e-725d-4753-9455-a836ed9bdb1e"),
+ column: "description",
+ value: "Can perform all View actions, but not make any changes.");
+
+ migrationBuilder.UpdateData(
+ table: "system_roles",
+ keyColumn: "id",
+ keyValue: new Guid("d80b73c3-95d7-4468-8650-c62bbd082507"),
+ column: "description",
+ value: "Can create and manage their own Projects.");
+ }
+ }
+}
diff --git a/Steamfitter.Api.Migrations.PostgreSQL/Migrations/SteamfitterContextModelSnapshot.cs b/Steamfitter.Api.Migrations.PostgreSQL/Migrations/SteamfitterContextModelSnapshot.cs
index 7ee6118..91091c4 100644
--- a/Steamfitter.Api.Migrations.PostgreSQL/Migrations/SteamfitterContextModelSnapshot.cs
+++ b/Steamfitter.Api.Migrations.PostgreSQL/Migrations/SteamfitterContextModelSnapshot.cs
@@ -1,8 +1,3 @@
-/*
-Copyright 2021 Carnegie Mellon University. All Rights Reserved.
- Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information.
-*/
-
//
using System;
using Microsoft.EntityFrameworkCore;
@@ -22,7 +17,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "8.0.8")
+ .HasAnnotation("ProductVersion", "10.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "uuid-ossp");
@@ -551,7 +546,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
.HasColumnType("text")
.HasColumnName("name");
- b.Property("Permissions")
+ b.PrimitiveCollection("Permissions")
.HasColumnType("integer[]")
.HasColumnName("permissions");
@@ -699,7 +694,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
.HasColumnType("text")
.HasColumnName("name");
- b.Property("Permissions")
+ b.PrimitiveCollection("Permissions")
.HasColumnType("integer[]")
.HasColumnName("permissions");
@@ -794,7 +789,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
.HasColumnType("text")
.HasColumnName("name");
- b.Property("Permissions")
+ b.PrimitiveCollection("Permissions")
.HasColumnType("integer[]")
.HasColumnName("permissions");
@@ -819,7 +814,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
{
Id = new Guid("d80b73c3-95d7-4468-8650-c62bbd082507"),
AllPermissions = false,
- Description = "Can create and manage their own Projects.",
+ Description = "Can create and manage their own Scenario Templates and Scenarios.",
Immutable = false,
Name = "Content Developer",
Permissions = new[] { 0, 4, 7 }
@@ -828,7 +823,7 @@ protected override void BuildModel(ModelBuilder modelBuilder)
{
Id = new Guid("1da3027e-725d-4753-9455-a836ed9bdb1e"),
AllPermissions = false,
- Description = "Can perform all View actions, but not make any changes.",
+ Description = "Can View all Scenario Templates and Scenarios, but cannot make any changes.",
Immutable = false,
Name = "Observer",
Permissions = new[] { 1, 5, 10, 12, 14 }
diff --git a/Steamfitter.Api.Migrations.PostgreSQL/Steamfitter.Api.Migrations.PostgreSQL.csproj b/Steamfitter.Api.Migrations.PostgreSQL/Steamfitter.Api.Migrations.PostgreSQL.csproj
index 5798a5b..81bc7be 100644
--- a/Steamfitter.Api.Migrations.PostgreSQL/Steamfitter.Api.Migrations.PostgreSQL.csproj
+++ b/Steamfitter.Api.Migrations.PostgreSQL/Steamfitter.Api.Migrations.PostgreSQL.csproj
@@ -1,11 +1,12 @@
- net8.0
+ net10.0
InProcess
{9B0A7220-4E76-4D56-9AA0-2280A0238AA7}
+ latest
-
+
diff --git a/Steamfitter.Api/Infrastructure/Extensions/ServiceCollectionExtensions.cs b/Steamfitter.Api/Infrastructure/Extensions/ServiceCollectionExtensions.cs
index c409dde..0972210 100644
--- a/Steamfitter.Api/Infrastructure/Extensions/ServiceCollectionExtensions.cs
+++ b/Steamfitter.Api/Infrastructure/Extensions/ServiceCollectionExtensions.cs
@@ -4,7 +4,6 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.CodeAnalysis;
using Microsoft.AspNetCore.Http;
-using Microsoft.OpenApi.Models;
using Steamfitter.Api.Infrastructure.Options;
using Steamfitter.Api.Infrastructure.OperationFilters;
using System;
@@ -12,9 +11,9 @@
using System.IO;
using System.Reflection;
using System.Text.Json;
-using Player.Api;
using Player.Vm.Api;
using System.Net.Http;
+using Microsoft.OpenApi;
using Player.Api.Client;
namespace Steamfitter.Api.Infrastructure.Extensions
@@ -49,27 +48,31 @@ public static void AddSwagger(this IServiceCollection services, AuthorizationOpt
}
});
- c.AddSecurityRequirement(new OpenApiSecurityRequirement()
+ c.AddSecurityRequirement((document) => new OpenApiSecurityRequirement
{
- {
- new OpenApiSecurityScheme
- {
- Reference = new OpenApiReference
- {
- Type = ReferenceType.SecurityScheme,
- Id = "oauth2"
- },
- Scheme = "oauth2"
- },
- new[] {authOptions.AuthorizationScope}
- }
+ { new OpenApiSecuritySchemeReference("oauth2", document), [authOptions.AuthorizationScope] }
});
c.IncludeXmlComments(commentsFile);
c.EnableAnnotations();
c.OperationFilter();
- c.MapType>(() => new OpenApiSchema { Type = "string", Format = "uuid", Nullable = true });
- c.MapType(() => new OpenApiSchema { Type = "object", Nullable = true });
+ c.MapType>(() => new OpenApiSchema
+ {
+ OneOf = new List
+ {
+ new OpenApiSchema { Type = JsonSchemaType.String, Format = "uuid" },
+ new OpenApiSchema { Type = JsonSchemaType.Null }
+ }
+ });
+
+ c.MapType(() => new OpenApiSchema
+ {
+ OneOf = new List
+ {
+ new OpenApiSchema { Type = JsonSchemaType.Object },
+ new OpenApiSchema { Type = JsonSchemaType.Null }
+ }
+ });
});
}
diff --git a/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs b/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs
index 285e6c7..787d9d6 100644
--- a/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs
+++ b/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs
@@ -3,11 +3,11 @@
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
-using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace Steamfitter.Api.Infrastructure.OperationFilters
-{
+{
public class DefaultResponseOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
diff --git a/Steamfitter.Api/Steamfitter.Api.csproj b/Steamfitter.Api/Steamfitter.Api.csproj
index 7c819eb..bf6e46a 100644
--- a/Steamfitter.Api/Steamfitter.Api.csproj
+++ b/Steamfitter.Api/Steamfitter.Api.csproj
@@ -1,10 +1,11 @@
+ net10.0
3.9.3
- net8.0
bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml
CS1591
{F4047D97-1F7B-4B2D-8751-02C5AACF20FE}
+ latest
@@ -14,33 +15,31 @@
-
-
-
-
-
+
+
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
diff --git a/global.json b/global.json
index fac3bf2..dcf907b 100644
--- a/global.json
+++ b/global.json
@@ -1,7 +1,7 @@
{
"sdk": {
- "version": "8.0.304",
+ "version": "10.0",
"allowPrerelease": false,
"rollForward": "latestMinor"
}
-}
\ No newline at end of file
+}