From e618a969e6a8efbb8c978abfab5d4fb4bdd9780a Mon Sep 17 00:00:00 2001 From: Dustin Updyke Date: Thu, 13 Nov 2025 17:36:13 -0500 Subject: [PATCH 1/2] Upgrades projects to .NET 10; updates most dependencies to current versions --- Dockerfile | 8 +- .../Steamfitter.Api.Data.csproj | 5 +- ...113223256_Version10UpgradeSync.Designer.cs | 1400 +++++++++++++++++ .../20251113223256_Version10UpgradeSync.cs | 47 + .../SteamfitterContextModelSnapshot.cs | 17 +- ...eamfitter.Api.Migrations.PostgreSQL.csproj | 5 +- .../Extensions/ServiceCollectionExtensions.cs | 37 +- .../OperationFilters/DefaultResponse.cs | 6 +- Steamfitter.Api/Steamfitter.Api.csproj | 43 +- global.json | 4 +- 10 files changed, 1510 insertions(+), 62 deletions(-) create mode 100644 Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.Designer.cs create mode 100644 Steamfitter.Api.Migrations.PostgreSQL/Migrations/20251113223256_Version10UpgradeSync.cs 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..62f238d 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..7749074 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..df9ba6b 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) @@ -15,7 +15,7 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) operation.Responses.Add("default", new OpenApiResponse { Description = "Problem response", - Content = new Dictionary + Content = new Dictionary { [ "application/json" ] = new OpenApiMediaType { diff --git a/Steamfitter.Api/Steamfitter.Api.csproj b/Steamfitter.Api/Steamfitter.Api.csproj index a8e6384..572a9a3 100644 --- a/Steamfitter.Api/Steamfitter.Api.csproj +++ b/Steamfitter.Api/Steamfitter.Api.csproj @@ -1,9 +1,10 @@ - net8.0 + net10.0 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml CS1591 {F4047D97-1F7B-4B2D-8751-02C5AACF20FE} + latest @@ -13,33 +14,33 @@ - - - - - + + + + + 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 +} From e52c186a42f79c5c5bc62d81fbf146a11a3a7342 Mon Sep 17 00:00:00 2001 From: Dustin Updyke Date: Thu, 20 Nov 2025 21:08:08 -0500 Subject: [PATCH 2/2] removes unused dependencies and updates codeql --- .github/workflows/codeql-analysis.yml | 14 +++++++------- .../OperationFilters/DefaultResponse.cs | 2 +- Steamfitter.Api/Steamfitter.Api.csproj | 2 -- 3 files changed, 8 insertions(+), 10 deletions(-) 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/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs b/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs index df9ba6b..787d9d6 100644 --- a/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs +++ b/Steamfitter.Api/Infrastructure/OperationFilters/DefaultResponse.cs @@ -15,7 +15,7 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) operation.Responses.Add("default", new OpenApiResponse { Description = "Problem response", - Content = new Dictionary + Content = new Dictionary { [ "application/json" ] = new OpenApiMediaType { diff --git a/Steamfitter.Api/Steamfitter.Api.csproj b/Steamfitter.Api/Steamfitter.Api.csproj index 572a9a3..e3e437f 100644 --- a/Steamfitter.Api/Steamfitter.Api.csproj +++ b/Steamfitter.Api/Steamfitter.Api.csproj @@ -14,8 +14,6 @@ - -