From be8073d4d660a5cb4402afaeccc15ad867c5812f Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Thu, 22 Jun 2023 07:44:20 -0700 Subject: [PATCH] Add migrations. --- Server/Data/AppDb.cs | 3 +- ...622144413_Add_Agent_MacAddress.Designer.cs | 1180 ++++++++++++++++ .../20230622144413_Add_Agent_MacAddress.cs | 28 + .../PostgreSqlDbContextModelSnapshot.cs | 5 +- ...622144404_Add_Agent_MacAddress.Designer.cs | 1183 +++++++++++++++++ .../20230622144404_Add_Agent_MacAddress.cs | 28 + .../SqlServerDbContextModelSnapshot.cs | 5 +- ...622144355_Add_Agent_MacAddress.Designer.cs | 1176 ++++++++++++++++ .../20230622144355_Add_Agent_MacAddress.cs | 28 + .../Sqlite/SqliteDbContextModelSnapshot.cs | 5 +- submodules/Immense.RemoteControl | 2 +- 11 files changed, 3638 insertions(+), 5 deletions(-) create mode 100644 Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.Designer.cs create mode 100644 Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.cs create mode 100644 Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.Designer.cs create mode 100644 Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.cs create mode 100644 Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.Designer.cs create mode 100644 Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.cs diff --git a/Server/Data/AppDb.cs b/Server/Data/AppDb.cs index 7d430737..b2e2f400 100644 --- a/Server/Data/AppDb.cs +++ b/Server/Data/AppDb.cs @@ -141,7 +141,8 @@ namespace Remotely.Server.Data .Property(x => x.MacAddresses) .HasConversion( x => JsonSerializer.Serialize(x, jsonOptions), - x => DeserializeStringArray(x, jsonOptions)); + x => DeserializeStringArray(x, jsonOptions), + valueComparer: _stringArrayComparer); builder.Entity() .HasMany(x => x.Devices); diff --git a/Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.Designer.cs b/Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.Designer.cs new file mode 100644 index 00000000..1e26335b --- /dev/null +++ b/Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.Designer.cs @@ -0,0 +1,1180 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Remotely.Server.Data; + +#nullable disable + +namespace Remotely.Server.Migrations.PostgreSql +{ + [DbContext(typeof(PostgreSqlDbContext))] + [Migration("20230622144413_Add_Agent_MacAddress")] + partial class Add_Agent_MacAddress + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("DeviceGroupRemotelyUser", b => + { + b.Property("DeviceGroupsID") + .HasColumnType("text"); + + b.Property("UsersId") + .HasColumnType("text"); + + b.HasKey("DeviceGroupsID", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("DeviceGroupRemotelyUser"); + }); + + modelBuilder.Entity("DeviceGroupScriptSchedule", b => + { + b.Property("DeviceGroupsID") + .HasColumnType("text"); + + b.Property("ScriptSchedulesId") + .HasColumnType("integer"); + + b.HasKey("DeviceGroupsID", "ScriptSchedulesId"); + + b.HasIndex("ScriptSchedulesId"); + + b.ToTable("DeviceGroupScriptSchedule"); + }); + + modelBuilder.Entity("DeviceScriptRun", b => + { + b.Property("DevicesID") + .HasColumnType("text"); + + b.Property("ScriptRunsId") + .HasColumnType("integer"); + + b.HasKey("DevicesID", "ScriptRunsId"); + + b.HasIndex("ScriptRunsId"); + + b.ToTable("DeviceScriptRun"); + }); + + modelBuilder.Entity("DeviceScriptRun1", b => + { + b.Property("DevicesCompletedID") + .HasColumnType("text"); + + b.Property("ScriptRunsCompletedId") + .HasColumnType("integer"); + + b.HasKey("DevicesCompletedID", "ScriptRunsCompletedId"); + + b.HasIndex("ScriptRunsCompletedId"); + + b.ToTable("DeviceScriptRun1"); + }); + + modelBuilder.Entity("DeviceScriptSchedule", b => + { + b.Property("DevicesID") + .HasColumnType("text"); + + b.Property("ScriptSchedulesId") + .HasColumnType("integer"); + + b.HasKey("DevicesID", "ScriptSchedulesId"); + + b.HasIndex("ScriptSchedulesId"); + + b.ToTable("DeviceScriptSchedule"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("RemotelyUsers", (string)null); + + b.HasDiscriminator("Discriminator").HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("text"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Alert", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("CreatedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Details") + .HasColumnType("text"); + + b.Property("DeviceID") + .HasColumnType("text"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("UserID") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("DeviceID"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("UserID"); + + b.ToTable("Alerts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("LastUsed") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("Secret") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("ApiTokens"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.BrandingInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("ButtonForegroundBlue") + .HasColumnType("smallint"); + + b.Property("ButtonForegroundGreen") + .HasColumnType("smallint"); + + b.Property("ButtonForegroundRed") + .HasColumnType("smallint"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("bytea"); + + b.Property("OrganizationId") + .HasColumnType("text"); + + b.Property("Product") + .IsRequired() + .HasMaxLength(25) + .HasColumnType("character varying(25)"); + + b.Property("TitleBackgroundBlue") + .HasColumnType("smallint"); + + b.Property("TitleBackgroundGreen") + .HasColumnType("smallint"); + + b.Property("TitleBackgroundRed") + .HasColumnType("smallint"); + + b.Property("TitleForegroundBlue") + .HasColumnType("smallint"); + + b.Property("TitleForegroundGreen") + .HasColumnType("smallint"); + + b.Property("TitleForegroundRed") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId") + .IsUnique(); + + b.ToTable("BrandingInfos"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Property("ID") + .HasColumnType("text"); + + b.Property("AgentVersion") + .HasColumnType("text"); + + b.Property("Alias") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CpuUtilization") + .HasColumnType("double precision"); + + b.Property("CurrentUser") + .HasColumnType("text"); + + b.Property("DeviceGroupID") + .HasColumnType("text"); + + b.Property("DeviceName") + .HasColumnType("text"); + + b.Property("Drives") + .HasColumnType("text"); + + b.Property("Is64Bit") + .HasColumnType("boolean"); + + b.Property("IsOnline") + .HasColumnType("boolean"); + + b.Property("LastOnline") + .HasColumnType("timestamp with time zone"); + + b.Property("MacAddresses") + .HasColumnType("text"); + + b.Property("Notes") + .HasMaxLength(5000) + .HasColumnType("character varying(5000)"); + + b.Property("OSArchitecture") + .HasColumnType("integer"); + + b.Property("OSDescription") + .HasColumnType("text"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("Platform") + .HasColumnType("text"); + + b.Property("ProcessorCount") + .HasColumnType("integer"); + + b.Property("PublicIP") + .HasColumnType("text"); + + b.Property("ServerVerificationToken") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("TotalMemory") + .HasColumnType("double precision"); + + b.Property("TotalStorage") + .HasColumnType("double precision"); + + b.Property("UsedMemory") + .HasColumnType("double precision"); + + b.Property("UsedStorage") + .HasColumnType("double precision"); + + b.HasKey("ID"); + + b.HasIndex("DeviceGroupID"); + + b.HasIndex("DeviceName"); + + b.HasIndex("OrganizationID"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("DeviceGroups"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("DateSent") + .HasColumnType("timestamp with time zone"); + + b.Property("InvitedUser") + .HasColumnType("text"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("ResetUrl") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("InviteLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("IsDefaultOrganization") + .HasColumnType("boolean"); + + b.Property("OrganizationName") + .HasMaxLength(25) + .HasColumnType("character varying(25)"); + + b.HasKey("ID"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SavedScript", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreatorId") + .HasColumnType("text"); + + b.Property("FolderPath") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("GenerateAlertOnError") + .HasColumnType("boolean"); + + b.Property("IsPublic") + .HasColumnType("boolean"); + + b.Property("IsQuickScript") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("SendEmailOnError") + .HasColumnType("boolean"); + + b.Property("SendErrorEmailTo") + .HasColumnType("text"); + + b.Property("Shell") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SavedScripts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptResult", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("DeviceID") + .HasColumnType("text"); + + b.Property("ErrorOutput") + .HasColumnType("text"); + + b.Property("HadErrors") + .HasColumnType("boolean"); + + b.Property("InputType") + .HasColumnType("integer"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("RunTime") + .HasColumnType("interval"); + + b.Property("SavedScriptId") + .HasColumnType("uuid"); + + b.Property("ScheduleId") + .HasColumnType("integer"); + + b.Property("ScriptInput") + .HasColumnType("text"); + + b.Property("ScriptRunId") + .HasColumnType("integer"); + + b.Property("SenderConnectionID") + .HasColumnType("text"); + + b.Property("SenderUserName") + .HasColumnType("text"); + + b.Property("Shell") + .HasColumnType("integer"); + + b.Property("StandardOutput") + .HasColumnType("text"); + + b.Property("TimeStamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("ID"); + + b.HasIndex("DeviceID"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("ScheduleId"); + + b.HasIndex("ScriptRunId"); + + b.ToTable("ScriptResults"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Initiator") + .HasColumnType("text"); + + b.Property("InputType") + .HasColumnType("integer"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("RunAt") + .HasColumnType("timestamp with time zone"); + + b.Property("RunOnNextConnect") + .HasColumnType("boolean"); + + b.Property("SavedScriptId") + .HasColumnType("uuid"); + + b.Property("ScheduleId") + .HasColumnType("integer"); + + b.Property("ScriptScheduleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("ScriptScheduleId"); + + b.ToTable("ScriptRuns"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatorId") + .HasColumnType("text"); + + b.Property("Interval") + .HasColumnType("integer"); + + b.Property("LastRun") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("NextRun") + .HasColumnType("timestamp with time zone"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("RunOnNextConnect") + .HasColumnType("boolean"); + + b.Property("SavedScriptId") + .HasColumnType("uuid"); + + b.Property("StartAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("OrganizationID"); + + b.ToTable("ScriptSchedules"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("text"); + + b.Property("ContentType") + .HasColumnType("text"); + + b.Property("FileContents") + .HasColumnType("bytea"); + + b.Property("FileName") + .HasColumnType("text"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsAdministrator") + .HasColumnType("boolean"); + + b.Property("IsServerAdmin") + .HasColumnType("boolean"); + + b.Property("OrganizationID") + .HasColumnType("text"); + + b.Property("TempPassword") + .HasColumnType("text"); + + b.Property("UserOptions") + .HasColumnType("text"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("UserName"); + + b.HasDiscriminator().HasValue("RemotelyUser"); + }); + + modelBuilder.Entity("DeviceGroupRemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", null) + .WithMany() + .HasForeignKey("DeviceGroupsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceGroupScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", null) + .WithMany() + .HasForeignKey("DeviceGroupsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany() + .HasForeignKey("ScriptSchedulesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptRun", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany() + .HasForeignKey("ScriptRunsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptRun1", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesCompletedID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany() + .HasForeignKey("ScriptRunsCompletedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany() + .HasForeignKey("ScriptSchedulesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Alert", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("Alerts") + .HasForeignKey("DeviceID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Alerts") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", "User") + .WithMany("Alerts") + .HasForeignKey("UserID"); + + b.Navigation("Device"); + + b.Navigation("Organization"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ApiTokens") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.BrandingInfo", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithOne("BrandingInfo") + .HasForeignKey("Remotely.Shared.Models.BrandingInfo", "OrganizationId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", "DeviceGroup") + .WithMany("Devices") + .HasForeignKey("DeviceGroupID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Devices") + .HasForeignKey("OrganizationID"); + + b.Navigation("DeviceGroup"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("DeviceGroups") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("InviteLinks") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SavedScript", b => + { + b.HasOne("Remotely.Shared.Models.RemotelyUser", "Creator") + .WithMany("SavedScripts") + .HasForeignKey("CreatorId"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SavedScripts") + .HasForeignKey("OrganizationID"); + + b.Navigation("Creator"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptResult", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("ScriptResults") + .HasForeignKey("DeviceID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptResults") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", "Schedule") + .WithMany() + .HasForeignKey("ScheduleId"); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany("Results") + .HasForeignKey("ScriptRunId"); + + b.Navigation("Device"); + + b.Navigation("Organization"); + + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptRuns") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany("ScriptRuns") + .HasForeignKey("ScriptScheduleId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.RemotelyUser", "Creator") + .WithMany("ScriptSchedules") + .HasForeignKey("CreatorId"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptSchedules") + .HasForeignKey("OrganizationID"); + + b.Navigation("Creator"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SharedFiles") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("RemotelyUsers") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Navigation("Alerts"); + + b.Navigation("ScriptResults"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.Navigation("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Navigation("Alerts"); + + b.Navigation("ApiTokens"); + + b.Navigation("BrandingInfo"); + + b.Navigation("DeviceGroups"); + + b.Navigation("Devices"); + + b.Navigation("InviteLinks"); + + b.Navigation("RemotelyUsers"); + + b.Navigation("SavedScripts"); + + b.Navigation("ScriptResults"); + + b.Navigation("ScriptRuns"); + + b.Navigation("ScriptSchedules"); + + b.Navigation("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.Navigation("Results"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.Navigation("ScriptRuns"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.Navigation("Alerts"); + + b.Navigation("SavedScripts"); + + b.Navigation("ScriptSchedules"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.cs b/Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.cs new file mode 100644 index 00000000..d8203eae --- /dev/null +++ b/Server/Migrations/PostgreSql/20230622144413_Add_Agent_MacAddress.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Remotely.Server.Migrations.PostgreSql +{ + /// + public partial class Add_Agent_MacAddress : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "MacAddresses", + table: "Devices", + type: "text", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "MacAddresses", + table: "Devices"); + } + } +} diff --git a/Server/Migrations/PostgreSql/PostgreSqlDbContextModelSnapshot.cs b/Server/Migrations/PostgreSql/PostgreSqlDbContextModelSnapshot.cs index 5343ee4a..fd996a8c 100644 --- a/Server/Migrations/PostgreSql/PostgreSqlDbContextModelSnapshot.cs +++ b/Server/Migrations/PostgreSql/PostgreSqlDbContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace Remotely.Server.Migrations.PostgreSql { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("ProductVersion", "7.0.7") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -451,6 +451,9 @@ namespace Remotely.Server.Migrations.PostgreSql b.Property("LastOnline") .HasColumnType("timestamp with time zone"); + b.Property("MacAddresses") + .HasColumnType("text"); + b.Property("Notes") .HasMaxLength(5000) .HasColumnType("character varying(5000)"); diff --git a/Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.Designer.cs b/Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.Designer.cs new file mode 100644 index 00000000..02b6499e --- /dev/null +++ b/Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.Designer.cs @@ -0,0 +1,1183 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Remotely.Server.Data; + +#nullable disable + +namespace Remotely.Server.Migrations.SqlServer +{ + [DbContext(typeof(SqlServerDbContext))] + [Migration("20230622144404_Add_Agent_MacAddress")] + partial class Add_Agent_MacAddress + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("DeviceGroupRemotelyUser", b => + { + b.Property("DeviceGroupsID") + .HasColumnType("nvarchar(450)"); + + b.Property("UsersId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("DeviceGroupsID", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("DeviceGroupRemotelyUser"); + }); + + modelBuilder.Entity("DeviceGroupScriptSchedule", b => + { + b.Property("DeviceGroupsID") + .HasColumnType("nvarchar(450)"); + + b.Property("ScriptSchedulesId") + .HasColumnType("int"); + + b.HasKey("DeviceGroupsID", "ScriptSchedulesId"); + + b.HasIndex("ScriptSchedulesId"); + + b.ToTable("DeviceGroupScriptSchedule"); + }); + + modelBuilder.Entity("DeviceScriptRun", b => + { + b.Property("DevicesID") + .HasColumnType("nvarchar(450)"); + + b.Property("ScriptRunsId") + .HasColumnType("int"); + + b.HasKey("DevicesID", "ScriptRunsId"); + + b.HasIndex("ScriptRunsId"); + + b.ToTable("DeviceScriptRun"); + }); + + modelBuilder.Entity("DeviceScriptRun1", b => + { + b.Property("DevicesCompletedID") + .HasColumnType("nvarchar(450)"); + + b.Property("ScriptRunsCompletedId") + .HasColumnType("int"); + + b.HasKey("DevicesCompletedID", "ScriptRunsCompletedId"); + + b.HasIndex("ScriptRunsCompletedId"); + + b.ToTable("DeviceScriptRun1"); + }); + + modelBuilder.Entity("DeviceScriptSchedule", b => + { + b.Property("DevicesID") + .HasColumnType("nvarchar(450)"); + + b.Property("ScriptSchedulesId") + .HasColumnType("int"); + + b.HasKey("DevicesID", "ScriptSchedulesId"); + + b.HasIndex("ScriptSchedulesId"); + + b.ToTable("DeviceScriptSchedule"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("RemotelyUsers", (string)null); + + b.HasDiscriminator("Discriminator").HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Alert", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("CreatedOn") + .HasColumnType("datetimeoffset"); + + b.Property("Details") + .HasColumnType("nvarchar(max)"); + + b.Property("DeviceID") + .HasColumnType("nvarchar(450)"); + + b.Property("Message") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("UserID") + .HasColumnType("nvarchar(450)"); + + b.HasKey("ID"); + + b.HasIndex("DeviceID"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("UserID"); + + b.ToTable("Alerts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("LastUsed") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("Secret") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("ApiTokens"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.BrandingInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("ButtonForegroundBlue") + .HasColumnType("tinyint"); + + b.Property("ButtonForegroundGreen") + .HasColumnType("tinyint"); + + b.Property("ButtonForegroundRed") + .HasColumnType("tinyint"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("OrganizationId") + .HasColumnType("nvarchar(450)"); + + b.Property("Product") + .IsRequired() + .HasMaxLength(25) + .HasColumnType("nvarchar(25)"); + + b.Property("TitleBackgroundBlue") + .HasColumnType("tinyint"); + + b.Property("TitleBackgroundGreen") + .HasColumnType("tinyint"); + + b.Property("TitleBackgroundRed") + .HasColumnType("tinyint"); + + b.Property("TitleForegroundBlue") + .HasColumnType("tinyint"); + + b.Property("TitleForegroundGreen") + .HasColumnType("tinyint"); + + b.Property("TitleForegroundRed") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId") + .IsUnique() + .HasFilter("[OrganizationId] IS NOT NULL"); + + b.ToTable("BrandingInfos"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Property("ID") + .HasColumnType("nvarchar(450)"); + + b.Property("AgentVersion") + .HasColumnType("nvarchar(max)"); + + b.Property("Alias") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CpuUtilization") + .HasColumnType("float"); + + b.Property("CurrentUser") + .HasColumnType("nvarchar(max)"); + + b.Property("DeviceGroupID") + .HasColumnType("nvarchar(450)"); + + b.Property("DeviceName") + .HasColumnType("nvarchar(450)"); + + b.Property("Drives") + .HasColumnType("nvarchar(max)"); + + b.Property("Is64Bit") + .HasColumnType("bit"); + + b.Property("IsOnline") + .HasColumnType("bit"); + + b.Property("LastOnline") + .HasColumnType("datetimeoffset"); + + b.Property("MacAddresses") + .HasColumnType("nvarchar(max)"); + + b.Property("Notes") + .HasMaxLength(5000) + .HasColumnType("nvarchar(max)"); + + b.Property("OSArchitecture") + .HasColumnType("int"); + + b.Property("OSDescription") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("Platform") + .HasColumnType("nvarchar(max)"); + + b.Property("ProcessorCount") + .HasColumnType("int"); + + b.Property("PublicIP") + .HasColumnType("nvarchar(max)"); + + b.Property("ServerVerificationToken") + .HasColumnType("nvarchar(max)"); + + b.Property("Tags") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("TotalMemory") + .HasColumnType("float"); + + b.Property("TotalStorage") + .HasColumnType("float"); + + b.Property("UsedMemory") + .HasColumnType("float"); + + b.Property("UsedStorage") + .HasColumnType("float"); + + b.HasKey("ID"); + + b.HasIndex("DeviceGroupID"); + + b.HasIndex("DeviceName"); + + b.HasIndex("OrganizationID"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("DeviceGroups"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("DateSent") + .HasColumnType("datetimeoffset"); + + b.Property("InvitedUser") + .HasColumnType("nvarchar(max)"); + + b.Property("IsAdmin") + .HasColumnType("bit"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("ResetUrl") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("InviteLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("IsDefaultOrganization") + .HasColumnType("bit"); + + b.Property("OrganizationName") + .HasMaxLength(25) + .HasColumnType("nvarchar(25)"); + + b.HasKey("ID"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SavedScript", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Content") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CreatorId") + .HasColumnType("nvarchar(450)"); + + b.Property("FolderPath") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("GenerateAlertOnError") + .HasColumnType("bit"); + + b.Property("IsPublic") + .HasColumnType("bit"); + + b.Property("IsQuickScript") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("SendEmailOnError") + .HasColumnType("bit"); + + b.Property("SendErrorEmailTo") + .HasColumnType("nvarchar(max)"); + + b.Property("Shell") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SavedScripts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptResult", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("DeviceID") + .HasColumnType("nvarchar(450)"); + + b.Property("ErrorOutput") + .HasColumnType("nvarchar(max)"); + + b.Property("HadErrors") + .HasColumnType("bit"); + + b.Property("InputType") + .HasColumnType("int"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("RunTime") + .HasColumnType("time"); + + b.Property("SavedScriptId") + .HasColumnType("uniqueidentifier"); + + b.Property("ScheduleId") + .HasColumnType("int"); + + b.Property("ScriptInput") + .HasColumnType("nvarchar(max)"); + + b.Property("ScriptRunId") + .HasColumnType("int"); + + b.Property("SenderConnectionID") + .HasColumnType("nvarchar(max)"); + + b.Property("SenderUserName") + .HasColumnType("nvarchar(max)"); + + b.Property("Shell") + .HasColumnType("int"); + + b.Property("StandardOutput") + .HasColumnType("nvarchar(max)"); + + b.Property("TimeStamp") + .HasColumnType("datetimeoffset"); + + b.HasKey("ID"); + + b.HasIndex("DeviceID"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("ScheduleId"); + + b.HasIndex("ScriptRunId"); + + b.ToTable("ScriptResults"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Initiator") + .HasColumnType("nvarchar(max)"); + + b.Property("InputType") + .HasColumnType("int"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("RunAt") + .HasColumnType("datetimeoffset"); + + b.Property("RunOnNextConnect") + .HasColumnType("bit"); + + b.Property("SavedScriptId") + .HasColumnType("uniqueidentifier"); + + b.Property("ScheduleId") + .HasColumnType("int"); + + b.Property("ScriptScheduleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("ScriptScheduleId"); + + b.ToTable("ScriptRuns"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("CreatorId") + .HasColumnType("nvarchar(450)"); + + b.Property("Interval") + .HasColumnType("int"); + + b.Property("LastRun") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("NextRun") + .HasColumnType("datetimeoffset"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("RunOnNextConnect") + .HasColumnType("bit"); + + b.Property("SavedScriptId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartAt") + .HasColumnType("datetimeoffset"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("OrganizationID"); + + b.ToTable("ScriptSchedules"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("ContentType") + .HasColumnType("nvarchar(max)"); + + b.Property("FileContents") + .HasColumnType("varbinary(max)"); + + b.Property("FileName") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("Timestamp") + .HasColumnType("datetimeoffset"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsAdministrator") + .HasColumnType("bit"); + + b.Property("IsServerAdmin") + .HasColumnType("bit"); + + b.Property("OrganizationID") + .HasColumnType("nvarchar(450)"); + + b.Property("TempPassword") + .HasColumnType("nvarchar(max)"); + + b.Property("UserOptions") + .HasColumnType("nvarchar(max)"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("UserName"); + + b.HasDiscriminator().HasValue("RemotelyUser"); + }); + + modelBuilder.Entity("DeviceGroupRemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", null) + .WithMany() + .HasForeignKey("DeviceGroupsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceGroupScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", null) + .WithMany() + .HasForeignKey("DeviceGroupsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany() + .HasForeignKey("ScriptSchedulesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptRun", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany() + .HasForeignKey("ScriptRunsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptRun1", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesCompletedID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany() + .HasForeignKey("ScriptRunsCompletedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany() + .HasForeignKey("ScriptSchedulesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Alert", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("Alerts") + .HasForeignKey("DeviceID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Alerts") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", "User") + .WithMany("Alerts") + .HasForeignKey("UserID"); + + b.Navigation("Device"); + + b.Navigation("Organization"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ApiTokens") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.BrandingInfo", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithOne("BrandingInfo") + .HasForeignKey("Remotely.Shared.Models.BrandingInfo", "OrganizationId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", "DeviceGroup") + .WithMany("Devices") + .HasForeignKey("DeviceGroupID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Devices") + .HasForeignKey("OrganizationID"); + + b.Navigation("DeviceGroup"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("DeviceGroups") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("InviteLinks") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SavedScript", b => + { + b.HasOne("Remotely.Shared.Models.RemotelyUser", "Creator") + .WithMany("SavedScripts") + .HasForeignKey("CreatorId"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SavedScripts") + .HasForeignKey("OrganizationID"); + + b.Navigation("Creator"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptResult", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("ScriptResults") + .HasForeignKey("DeviceID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptResults") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", "Schedule") + .WithMany() + .HasForeignKey("ScheduleId"); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany("Results") + .HasForeignKey("ScriptRunId"); + + b.Navigation("Device"); + + b.Navigation("Organization"); + + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptRuns") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany("ScriptRuns") + .HasForeignKey("ScriptScheduleId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.RemotelyUser", "Creator") + .WithMany("ScriptSchedules") + .HasForeignKey("CreatorId"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptSchedules") + .HasForeignKey("OrganizationID"); + + b.Navigation("Creator"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SharedFiles") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("RemotelyUsers") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Navigation("Alerts"); + + b.Navigation("ScriptResults"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.Navigation("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Navigation("Alerts"); + + b.Navigation("ApiTokens"); + + b.Navigation("BrandingInfo"); + + b.Navigation("DeviceGroups"); + + b.Navigation("Devices"); + + b.Navigation("InviteLinks"); + + b.Navigation("RemotelyUsers"); + + b.Navigation("SavedScripts"); + + b.Navigation("ScriptResults"); + + b.Navigation("ScriptRuns"); + + b.Navigation("ScriptSchedules"); + + b.Navigation("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.Navigation("Results"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.Navigation("ScriptRuns"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.Navigation("Alerts"); + + b.Navigation("SavedScripts"); + + b.Navigation("ScriptSchedules"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.cs b/Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.cs new file mode 100644 index 00000000..29391188 --- /dev/null +++ b/Server/Migrations/SqlServer/20230622144404_Add_Agent_MacAddress.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Remotely.Server.Migrations.SqlServer +{ + /// + public partial class Add_Agent_MacAddress : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "MacAddresses", + table: "Devices", + type: "nvarchar(max)", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "MacAddresses", + table: "Devices"); + } + } +} diff --git a/Server/Migrations/SqlServer/SqlServerDbContextModelSnapshot.cs b/Server/Migrations/SqlServer/SqlServerDbContextModelSnapshot.cs index fbcea8b3..24a0740b 100644 --- a/Server/Migrations/SqlServer/SqlServerDbContextModelSnapshot.cs +++ b/Server/Migrations/SqlServer/SqlServerDbContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace Remotely.Server.Migrations.SqlServer { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("ProductVersion", "7.0.7") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -454,6 +454,9 @@ namespace Remotely.Server.Migrations.SqlServer b.Property("LastOnline") .HasColumnType("datetimeoffset"); + b.Property("MacAddresses") + .HasColumnType("nvarchar(max)"); + b.Property("Notes") .HasMaxLength(5000) .HasColumnType("nvarchar(max)"); diff --git a/Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.Designer.cs b/Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.Designer.cs new file mode 100644 index 00000000..ef45f741 --- /dev/null +++ b/Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.Designer.cs @@ -0,0 +1,1176 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Remotely.Server.Data; + +#nullable disable + +namespace Remotely.Server.Migrations.Sqlite +{ + [DbContext(typeof(SqliteDbContext))] + [Migration("20230622144355_Add_Agent_MacAddress")] + partial class Add_Agent_MacAddress + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.7"); + + modelBuilder.Entity("DeviceGroupRemotelyUser", b => + { + b.Property("DeviceGroupsID") + .HasColumnType("TEXT"); + + b.Property("UsersId") + .HasColumnType("TEXT"); + + b.HasKey("DeviceGroupsID", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("DeviceGroupRemotelyUser"); + }); + + modelBuilder.Entity("DeviceGroupScriptSchedule", b => + { + b.Property("DeviceGroupsID") + .HasColumnType("TEXT"); + + b.Property("ScriptSchedulesId") + .HasColumnType("INTEGER"); + + b.HasKey("DeviceGroupsID", "ScriptSchedulesId"); + + b.HasIndex("ScriptSchedulesId"); + + b.ToTable("DeviceGroupScriptSchedule"); + }); + + modelBuilder.Entity("DeviceScriptRun", b => + { + b.Property("DevicesID") + .HasColumnType("TEXT"); + + b.Property("ScriptRunsId") + .HasColumnType("INTEGER"); + + b.HasKey("DevicesID", "ScriptRunsId"); + + b.HasIndex("ScriptRunsId"); + + b.ToTable("DeviceScriptRun"); + }); + + modelBuilder.Entity("DeviceScriptRun1", b => + { + b.Property("DevicesCompletedID") + .HasColumnType("TEXT"); + + b.Property("ScriptRunsCompletedId") + .HasColumnType("INTEGER"); + + b.HasKey("DevicesCompletedID", "ScriptRunsCompletedId"); + + b.HasIndex("ScriptRunsCompletedId"); + + b.ToTable("DeviceScriptRun1"); + }); + + modelBuilder.Entity("DeviceScriptSchedule", b => + { + b.Property("DevicesID") + .HasColumnType("TEXT"); + + b.Property("ScriptSchedulesId") + .HasColumnType("INTEGER"); + + b.HasKey("DevicesID", "ScriptSchedulesId"); + + b.HasIndex("ScriptSchedulesId"); + + b.ToTable("DeviceScriptSchedule"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("RemotelyUsers", (string)null); + + b.HasDiscriminator("Discriminator").HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("TEXT"); + + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Alert", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreatedOn") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Details") + .HasColumnType("TEXT"); + + b.Property("DeviceID") + .HasColumnType("TEXT"); + + b.Property("Message") + .HasColumnType("TEXT"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("UserID") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("DeviceID"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("UserID"); + + b.ToTable("Alerts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("LastUsed") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("Secret") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("ApiTokens"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.BrandingInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ButtonForegroundBlue") + .HasColumnType("INTEGER"); + + b.Property("ButtonForegroundGreen") + .HasColumnType("INTEGER"); + + b.Property("ButtonForegroundRed") + .HasColumnType("INTEGER"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("BLOB"); + + b.Property("OrganizationId") + .HasColumnType("TEXT"); + + b.Property("Product") + .IsRequired() + .HasMaxLength(25) + .HasColumnType("TEXT"); + + b.Property("TitleBackgroundBlue") + .HasColumnType("INTEGER"); + + b.Property("TitleBackgroundGreen") + .HasColumnType("INTEGER"); + + b.Property("TitleBackgroundRed") + .HasColumnType("INTEGER"); + + b.Property("TitleForegroundBlue") + .HasColumnType("INTEGER"); + + b.Property("TitleForegroundGreen") + .HasColumnType("INTEGER"); + + b.Property("TitleForegroundRed") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId") + .IsUnique(); + + b.ToTable("BrandingInfos"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Property("ID") + .HasColumnType("TEXT"); + + b.Property("AgentVersion") + .HasColumnType("TEXT"); + + b.Property("Alias") + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("CpuUtilization") + .HasColumnType("REAL"); + + b.Property("CurrentUser") + .HasColumnType("TEXT"); + + b.Property("DeviceGroupID") + .HasColumnType("TEXT"); + + b.Property("DeviceName") + .HasColumnType("TEXT"); + + b.Property("Drives") + .HasColumnType("TEXT"); + + b.Property("Is64Bit") + .HasColumnType("INTEGER"); + + b.Property("IsOnline") + .HasColumnType("INTEGER"); + + b.Property("LastOnline") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MacAddresses") + .HasColumnType("TEXT"); + + b.Property("Notes") + .HasMaxLength(5000) + .HasColumnType("TEXT"); + + b.Property("OSArchitecture") + .HasColumnType("INTEGER"); + + b.Property("OSDescription") + .HasColumnType("TEXT"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("Platform") + .HasColumnType("TEXT"); + + b.Property("ProcessorCount") + .HasColumnType("INTEGER"); + + b.Property("PublicIP") + .HasColumnType("TEXT"); + + b.Property("ServerVerificationToken") + .HasColumnType("TEXT"); + + b.Property("Tags") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("TotalMemory") + .HasColumnType("REAL"); + + b.Property("TotalStorage") + .HasColumnType("REAL"); + + b.Property("UsedMemory") + .HasColumnType("REAL"); + + b.Property("UsedStorage") + .HasColumnType("REAL"); + + b.HasKey("ID"); + + b.HasIndex("DeviceGroupID"); + + b.HasIndex("DeviceName"); + + b.HasIndex("OrganizationID"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("DeviceGroups"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DateSent") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("InvitedUser") + .HasColumnType("TEXT"); + + b.Property("IsAdmin") + .HasColumnType("INTEGER"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("ResetUrl") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("InviteLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("IsDefaultOrganization") + .HasColumnType("INTEGER"); + + b.Property("OrganizationName") + .HasMaxLength(25) + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SavedScript", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Content") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatorId") + .HasColumnType("TEXT"); + + b.Property("FolderPath") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("GenerateAlertOnError") + .HasColumnType("INTEGER"); + + b.Property("IsPublic") + .HasColumnType("INTEGER"); + + b.Property("IsQuickScript") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("SendEmailOnError") + .HasColumnType("INTEGER"); + + b.Property("SendErrorEmailTo") + .HasColumnType("TEXT"); + + b.Property("Shell") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SavedScripts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptResult", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DeviceID") + .HasColumnType("TEXT"); + + b.Property("ErrorOutput") + .HasColumnType("TEXT"); + + b.Property("HadErrors") + .HasColumnType("INTEGER"); + + b.Property("InputType") + .HasColumnType("INTEGER"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("RunTime") + .HasColumnType("TEXT"); + + b.Property("SavedScriptId") + .HasColumnType("TEXT"); + + b.Property("ScheduleId") + .HasColumnType("INTEGER"); + + b.Property("ScriptInput") + .HasColumnType("TEXT"); + + b.Property("ScriptRunId") + .HasColumnType("INTEGER"); + + b.Property("SenderConnectionID") + .HasColumnType("TEXT"); + + b.Property("SenderUserName") + .HasColumnType("TEXT"); + + b.Property("Shell") + .HasColumnType("INTEGER"); + + b.Property("StandardOutput") + .HasColumnType("TEXT"); + + b.Property("TimeStamp") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("DeviceID"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("ScheduleId"); + + b.HasIndex("ScriptRunId"); + + b.ToTable("ScriptResults"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Initiator") + .HasColumnType("TEXT"); + + b.Property("InputType") + .HasColumnType("INTEGER"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("RunAt") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RunOnNextConnect") + .HasColumnType("INTEGER"); + + b.Property("SavedScriptId") + .HasColumnType("TEXT"); + + b.Property("ScheduleId") + .HasColumnType("INTEGER"); + + b.Property("ScriptScheduleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("ScriptScheduleId"); + + b.ToTable("ScriptRuns"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedAt") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CreatorId") + .HasColumnType("TEXT"); + + b.Property("Interval") + .HasColumnType("INTEGER"); + + b.Property("LastRun") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("NextRun") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("RunOnNextConnect") + .HasColumnType("INTEGER"); + + b.Property("SavedScriptId") + .HasColumnType("TEXT"); + + b.Property("StartAt") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("OrganizationID"); + + b.ToTable("ScriptSchedules"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ContentType") + .HasColumnType("TEXT"); + + b.Property("FileContents") + .HasColumnType("BLOB"); + + b.Property("FileName") + .HasColumnType("TEXT"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("Timestamp") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsAdministrator") + .HasColumnType("INTEGER"); + + b.Property("IsServerAdmin") + .HasColumnType("INTEGER"); + + b.Property("OrganizationID") + .HasColumnType("TEXT"); + + b.Property("TempPassword") + .HasColumnType("TEXT"); + + b.Property("UserOptions") + .HasColumnType("TEXT"); + + b.HasIndex("OrganizationID"); + + b.HasIndex("UserName"); + + b.HasDiscriminator().HasValue("RemotelyUser"); + }); + + modelBuilder.Entity("DeviceGroupRemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", null) + .WithMany() + .HasForeignKey("DeviceGroupsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceGroupScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", null) + .WithMany() + .HasForeignKey("DeviceGroupsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany() + .HasForeignKey("ScriptSchedulesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptRun", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany() + .HasForeignKey("ScriptRunsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptRun1", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesCompletedID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany() + .HasForeignKey("ScriptRunsCompletedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("DeviceScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.Device", null) + .WithMany() + .HasForeignKey("DevicesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany() + .HasForeignKey("ScriptSchedulesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Alert", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("Alerts") + .HasForeignKey("DeviceID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Alerts") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", "User") + .WithMany("Alerts") + .HasForeignKey("UserID"); + + b.Navigation("Device"); + + b.Navigation("Organization"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ApiTokens") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.BrandingInfo", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithOne("BrandingInfo") + .HasForeignKey("Remotely.Shared.Models.BrandingInfo", "OrganizationId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.HasOne("Remotely.Shared.Models.DeviceGroup", "DeviceGroup") + .WithMany("Devices") + .HasForeignKey("DeviceGroupID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Devices") + .HasForeignKey("OrganizationID"); + + b.Navigation("DeviceGroup"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("DeviceGroups") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("InviteLinks") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SavedScript", b => + { + b.HasOne("Remotely.Shared.Models.RemotelyUser", "Creator") + .WithMany("SavedScripts") + .HasForeignKey("CreatorId"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SavedScripts") + .HasForeignKey("OrganizationID"); + + b.Navigation("Creator"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptResult", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("ScriptResults") + .HasForeignKey("DeviceID"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptResults") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", "Schedule") + .WithMany() + .HasForeignKey("ScheduleId"); + + b.HasOne("Remotely.Shared.Models.ScriptRun", null) + .WithMany("Results") + .HasForeignKey("ScriptRunId"); + + b.Navigation("Device"); + + b.Navigation("Organization"); + + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptRuns") + .HasForeignKey("OrganizationID"); + + b.HasOne("Remotely.Shared.Models.ScriptSchedule", null) + .WithMany("ScriptRuns") + .HasForeignKey("ScriptScheduleId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.HasOne("Remotely.Shared.Models.RemotelyUser", "Creator") + .WithMany("ScriptSchedules") + .HasForeignKey("CreatorId"); + + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("ScriptSchedules") + .HasForeignKey("OrganizationID"); + + b.Navigation("Creator"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SharedFiles") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("RemotelyUsers") + .HasForeignKey("OrganizationID"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Navigation("Alerts"); + + b.Navigation("ScriptResults"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => + { + b.Navigation("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Navigation("Alerts"); + + b.Navigation("ApiTokens"); + + b.Navigation("BrandingInfo"); + + b.Navigation("DeviceGroups"); + + b.Navigation("Devices"); + + b.Navigation("InviteLinks"); + + b.Navigation("RemotelyUsers"); + + b.Navigation("SavedScripts"); + + b.Navigation("ScriptResults"); + + b.Navigation("ScriptRuns"); + + b.Navigation("ScriptSchedules"); + + b.Navigation("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptRun", b => + { + b.Navigation("Results"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.ScriptSchedule", b => + { + b.Navigation("ScriptRuns"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.Navigation("Alerts"); + + b.Navigation("SavedScripts"); + + b.Navigation("ScriptSchedules"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.cs b/Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.cs new file mode 100644 index 00000000..da35976d --- /dev/null +++ b/Server/Migrations/Sqlite/20230622144355_Add_Agent_MacAddress.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Remotely.Server.Migrations.Sqlite +{ + /// + public partial class Add_Agent_MacAddress : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "MacAddresses", + table: "Devices", + type: "TEXT", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "MacAddresses", + table: "Devices"); + } + } +} diff --git a/Server/Migrations/Sqlite/SqliteDbContextModelSnapshot.cs b/Server/Migrations/Sqlite/SqliteDbContextModelSnapshot.cs index dda694e9..3e9cb5ab 100644 --- a/Server/Migrations/Sqlite/SqliteDbContextModelSnapshot.cs +++ b/Server/Migrations/Sqlite/SqliteDbContextModelSnapshot.cs @@ -15,7 +15,7 @@ namespace Remotely.Server.Migrations.Sqlite protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "7.0.5"); + modelBuilder.HasAnnotation("ProductVersion", "7.0.7"); modelBuilder.Entity("DeviceGroupRemotelyUser", b => { @@ -444,6 +444,9 @@ namespace Remotely.Server.Migrations.Sqlite .IsRequired() .HasColumnType("TEXT"); + b.Property("MacAddresses") + .HasColumnType("TEXT"); + b.Property("Notes") .HasMaxLength(5000) .HasColumnType("TEXT"); diff --git a/submodules/Immense.RemoteControl b/submodules/Immense.RemoteControl index e1188cd0..2e6914d8 160000 --- a/submodules/Immense.RemoteControl +++ b/submodules/Immense.RemoteControl @@ -1 +1 @@ -Subproject commit e1188cd0bee2053cdd8c288601c5539572d9534f +Subproject commit 2e6914d88aa2d46aec41f1baff10ab7d15d62c5a